diff options
Diffstat (limited to 'src/base/loader')
-rw-r--r-- | src/base/loader/elf_object.cc | 32 | ||||
-rw-r--r-- | src/base/loader/elf_object.hh | 9 |
2 files changed, 40 insertions, 1 deletions
diff --git a/src/base/loader/elf_object.cc b/src/base/loader/elf_object.cc index 00d218b76..2ca0d4f4a 100644 --- a/src/base/loader/elf_object.cc +++ b/src/base/loader/elf_object.cc @@ -153,8 +153,38 @@ ElfObject::tryFile(const string &fname, int fd, size_t len, uint8_t *data) } // while sections } + ElfObject * result = new ElfObject(fname, fd, len, data, arch, opSys); + + //The number of headers in the file + result->_programHeaderCount = ehdr.e_phnum; + //Record the size of each entry + result->_programHeaderSize = ehdr.e_phentsize; + if(result->_programHeaderCount) //If there is a program header table + { + //Figure out the virtual address of the header table in the + //final memory image. We use the program headers themselves + //to translate from a file offset to the address in the image. + GElf_Phdr phdr; + uint64_t e_phoff = ehdr.e_phoff; + result->_programHeaderTable = 0; + for(int hdrnum = 0; hdrnum < result->_programHeaderCount; hdrnum++) + { + gelf_getphdr(elf, hdrnum, &phdr); + //Check if we've found the segment with the headers in it + if(phdr.p_offset <= e_phoff && + phdr.p_offset + phdr.p_filesz > e_phoff) + { + result->_programHeaderTable = phdr.p_vaddr + e_phoff; + break; + } + } + } + else + result->_programHeaderTable = 0; + + elf_end(elf); - return new ElfObject(fname, fd, len, data, arch, opSys); + return result; } } diff --git a/src/base/loader/elf_object.hh b/src/base/loader/elf_object.hh index 46dbfe37b..9755426b4 100644 --- a/src/base/loader/elf_object.hh +++ b/src/base/loader/elf_object.hh @@ -37,6 +37,12 @@ class ElfObject : public ObjectFile { protected: + //These values are provided to a linux process by the kernel, so we + //need to keep them around. + Addr _programHeaderTable; + uint16_t _programHeaderSize; + uint16_t _programHeaderCount; + /// Helper functions for loadGlobalSymbols() and loadLocalSymbols(). bool loadSomeSymbols(SymbolTable *symtab, int binding); @@ -52,6 +58,9 @@ class ElfObject : public ObjectFile static ObjectFile *tryFile(const std::string &fname, int fd, size_t len, uint8_t *data); + Addr programHeaderTable() {return _programHeaderTable;} + uint16_t programHeaderSize() {return _programHeaderSize;} + uint16_t programHeaderCount() {return _programHeaderCount;} }; #endif // __ELF_OBJECT_HH__ |