Chromium Code Reviews| 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..1911ff96c5f0c981321d84996161cd4f04298368 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_SYMTAB, |
| + 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(".symtab"); |
|
Mark Mentovai
2016/03/22 21:03:11
.dynsym?
David Yen
2016/03/22 21:14:08
Oops, good catch. Done.
|
| + |
| + 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; |
| + } |
| } |
| } |