diff options
Diffstat (limited to 'backends')
-rw-r--r-- | backends/plugins/elf/elf-loader.cpp | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/backends/plugins/elf/elf-loader.cpp b/backends/plugins/elf/elf-loader.cpp index f4226b4187..32eae2cba8 100644 --- a/backends/plugins/elf/elf-loader.cpp +++ b/backends/plugins/elf/elf-loader.cpp @@ -30,6 +30,7 @@ #include "common/debug.h" #include "common/file.h" #include "common/fs.h" +#include "common/ptr.h" DLObject::DLObject() : _file(0), @@ -303,8 +304,6 @@ void DLObject::relocateSymbols(ptrdiff_t offset) { bool DLObject::load() { Elf32_Ehdr ehdr; Elf32_Phdr phdr; - Elf32_Shdr *shdr; - bool ret = true; if (readElfHeader(&ehdr) == false) return false; @@ -319,29 +318,26 @@ bool DLObject::load() { return false; } - shdr = loadSectionHeaders(&ehdr); + Common::ScopedPtrC<Elf32_Shdr> shdr(loadSectionHeaders(&ehdr)); if (!shdr) return false; - if (ret && ((_symtab_sect = loadSymbolTable(&ehdr, shdr)) < 0)) - ret = false; - - if (ret && !loadStringTable(shdr)) - ret = false; - - if (ret) { - // Offset by our segment allocated address - // must use _segmentVMA here for multiple segments (MIPS) - _segmentOffset = ptrdiff_t(_segment) - _segmentVMA; - relocateSymbols(_segmentOffset); - } - - if (ret && !relocateRels(&ehdr, shdr)) - ret = false; + _symtab_sect = loadSymbolTable(&ehdr, shdr); + if (_symtab_sect < 0) + return false; + + if (!loadStringTable(shdr)) + return false; + + // Offset by our segment allocated address + // must use _segmentVMA here for multiple segments (MIPS) + _segmentOffset = ptrdiff_t(_segment) - _segmentVMA; + relocateSymbols(_segmentOffset); - free(shdr); + if (!relocateRels(&ehdr, shdr)) + return false; - return ret; + return true; } bool DLObject::open(const char *path) { |