| Index: src/common/linux/dump_symbols.cc
|
| diff --git a/src/common/linux/dump_symbols.cc b/src/common/linux/dump_symbols.cc
|
| index d6c593fa3fd37bd0b4620ec96efc83ddc6d7b550..5d2aac7ecb27e6324cf42ea11d3dd838aaa107e0 100644
|
| --- a/src/common/linux/dump_symbols.cc
|
| +++ b/src/common/linux/dump_symbols.cc
|
| @@ -684,32 +684,61 @@ bool LoadSymbols(const string& obj_file,
|
| }
|
|
|
| // See if there are export symbols available.
|
| - const Shdr* dynsym_section =
|
| - FindElfSectionByName<ElfClass>(".dynsym", SHT_DYNSYM,
|
| - sections, names, names_end,
|
| - elf_header->e_shnum);
|
| - const Shdr* dynstr_section =
|
| - FindElfSectionByName<ElfClass>(".dynstr", SHT_STRTAB,
|
| - sections, names, names_end,
|
| - elf_header->e_shnum);
|
| - if (dynsym_section && dynstr_section) {
|
| - info->LoadedSection(".dynsym");
|
| + const Shdr* symtab_section =
|
| + FindElfSectionByName<ElfClass>(".symtab", SHT_SYMTAB,
|
| + sections, names, names_end,
|
| + elf_header->e_shnum);
|
| + const Shdr* strtab_section =
|
| + FindElfSectionByName<ElfClass>(".strtab", SHT_STRTAB,
|
| + sections, names, names_end,
|
| + elf_header->e_shnum);
|
| + if (symtab_section && strtab_section) {
|
| + info->LoadedSection(".symtab");
|
|
|
| - const uint8_t* dynsyms =
|
| + const uint8_t* symtab =
|
| GetOffset<ElfClass, uint8_t>(elf_header,
|
| - dynsym_section->sh_offset);
|
| - const uint8_t* dynstrs =
|
| + symtab_section->sh_offset);
|
| + const uint8_t* strtab =
|
| GetOffset<ElfClass, uint8_t>(elf_header,
|
| - dynstr_section->sh_offset);
|
| + strtab_section->sh_offset);
|
| bool result =
|
| - ELFSymbolsToModule(dynsyms,
|
| - dynsym_section->sh_size,
|
| - dynstrs,
|
| - dynstr_section->sh_size,
|
| + ELFSymbolsToModule(symtab,
|
| + symtab_section->sh_size,
|
| + strtab,
|
| + strtab_section->sh_size,
|
| big_endian,
|
| ElfClass::kAddrSize,
|
| module);
|
| found_usable_info = found_usable_info || result;
|
| + } else {
|
| + // Look in dynsym only if full symbol table was not available.
|
| + const Shdr* dynsym_section =
|
| + FindElfSectionByName<ElfClass>(".dynsym", SHT_DYNSYM,
|
| + sections, names, names_end,
|
| + elf_header->e_shnum);
|
| + const Shdr* dynstr_section =
|
| + FindElfSectionByName<ElfClass>(".dynstr", SHT_STRTAB,
|
| + sections, names, names_end,
|
| + elf_header->e_shnum);
|
| + if (dynsym_section && dynstr_section) {
|
| + info->LoadedSection(".dynsym");
|
| +
|
| + const uint8_t* dynsyms =
|
| + GetOffset<ElfClass, uint8_t>(elf_header,
|
| + dynsym_section->sh_offset);
|
| + const uint8_t* dynstrs =
|
| + GetOffset<ElfClass, uint8_t>(elf_header,
|
| + dynstr_section->sh_offset);
|
| + bool result =
|
| + ELFSymbolsToModule(dynsyms,
|
| + dynsym_section->sh_size,
|
| + dynstrs,
|
| + dynstr_section->sh_size,
|
| + big_endian,
|
| + ElfClass::kAddrSize,
|
| + module);
|
| + found_usable_info = found_usable_info || result;
|
| + }
|
| }
|
| }
|
|
|
|
|