libdebug: Improve handling of stripped binaries.
- When searching for the symbol table, first see if the normal SHT_SYMTAB section is present. If not, fall back to trying to use SHT_DYNSYM if present. This allows us to resolve non-static functions/symbols in stripped binaries for the purposes of crash reports/disassembly.
This commit is contained in:
@@ -305,9 +305,6 @@ ImageFile::_LoadFile(const char* path, addr_t* _textAddress, size_t* _textSize,
|
|||||||
return B_NOT_AN_EXECUTABLE;
|
return B_NOT_AN_EXECUTABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
elf_shdr* sectionHeaders
|
|
||||||
= (elf_shdr*)(fMappedFile + elfHeader->e_shoff);
|
|
||||||
|
|
||||||
// find the text and data segment -- we need load address and size
|
// find the text and data segment -- we need load address and size
|
||||||
*_textAddress = 0;
|
*_textAddress = 0;
|
||||||
*_textSize = 0;
|
*_textSize = 0;
|
||||||
@@ -328,12 +325,26 @@ ImageFile::_LoadFile(const char* path, addr_t* _textAddress, size_t* _textSize,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
status_t error = _FindTableInSection(elfHeader, SHT_SYMTAB);
|
||||||
|
if (error != B_OK)
|
||||||
|
error = _FindTableInSection(elfHeader, SHT_DYNSYM);
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
ImageFile::_FindTableInSection(elf_ehdr* elfHeader, uint16 sectionType)
|
||||||
|
{
|
||||||
|
elf_shdr* sectionHeaders
|
||||||
|
= (elf_shdr*)(fMappedFile + elfHeader->e_shoff);
|
||||||
|
|
||||||
// find the symbol table
|
// find the symbol table
|
||||||
for (int32 i = 0; i < elfHeader->e_shnum; i++) {
|
for (int32 i = 0; i < elfHeader->e_shnum; i++) {
|
||||||
elf_shdr* sectionHeader = (elf_shdr*)
|
elf_shdr* sectionHeader = (elf_shdr*)
|
||||||
((uint8*)sectionHeaders + i * elfHeader->e_shentsize);
|
((uint8*)sectionHeaders + i * elfHeader->e_shentsize);
|
||||||
|
|
||||||
if (sectionHeader->sh_type == SHT_SYMTAB) {
|
if (sectionHeader->sh_type == sectionType) {
|
||||||
elf_shdr& stringHeader = *(elf_shdr*)
|
elf_shdr& stringHeader = *(elf_shdr*)
|
||||||
((uint8*)sectionHeaders
|
((uint8*)sectionHeaders
|
||||||
+ sectionHeader->sh_link * elfHeader->e_shentsize);
|
+ sectionHeader->sh_link * elfHeader->e_shentsize);
|
||||||
|
|||||||
@@ -96,6 +96,9 @@ private:
|
|||||||
addr_t* _textAddress, size_t* _textSize,
|
addr_t* _textAddress, size_t* _textSize,
|
||||||
addr_t* _dataAddress, size_t* _dataSize);
|
addr_t* _dataAddress, size_t* _dataSize);
|
||||||
|
|
||||||
|
status_t _FindTableInSection(elf_ehdr* elfHeader,
|
||||||
|
uint16 sectionType);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int fFD;
|
int fFD;
|
||||||
off_t fFileSize;
|
off_t fFileSize;
|
||||||
|
|||||||
Reference in New Issue
Block a user