diff options
| author | Konrad Kleine <kkleine@redhat.com> | 2019-09-11 10:00:30 +0000 |
|---|---|---|
| committer | Konrad Kleine <kkleine@redhat.com> | 2019-09-11 10:00:30 +0000 |
| commit | 3a4781bbf4f39a25562b4c61c9a9ab2483a96b41 (patch) | |
| tree | 7c8cb736d18d34b1ef072e3ab7f8ed60b11c576a /lldb/source/Plugins/ObjectFile/ELF | |
| parent | 57256af307ab7bdf42c47da019a1a288b9f9451a (diff) | |
| download | bcm5719-llvm-3a4781bbf4f39a25562b4c61c9a9ab2483a96b41.tar.gz bcm5719-llvm-3a4781bbf4f39a25562b4c61c9a9ab2483a96b41.zip | |
[LLDB][ELF] Load both, .symtab and .dynsym sections
Summary:
This change ensures that the .dynsym section will be parsed even when there's already is a .symtab.
It is motivated because of minidebuginfo (https://sourceware.org/gdb/current/onlinedocs/gdb/MiniDebugInfo.html#MiniDebugInfo).
There it says:
Keep all the function symbols not already in the dynamic symbol table.
That means the .symtab embedded inside the .gnu_debugdata does NOT contain the symbols from .dynsym. But in order to put a breakpoint on all symbols we need to load both. I hope this makes sense.
My other patch D66791 implements support for minidebuginfo, that's why I need this change.
Reviewers: labath, espindola, alexshap
Subscribers: JDevlieghere, emaste, arichardson, MaskRay, lldb-commits
Tags: #lldb
Differential Revision: https://reviews.llvm.org/D67390
llvm-svn: 371599
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/ELF')
| -rw-r--r-- | lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index e507f0e4d74..20e26f033d1 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -2647,21 +2647,31 @@ Symtab *ObjectFileELF::GetSymtab() { // smaller version of the symtab that only contains global symbols. The // information found in the dynsym is therefore also found in the symtab, // while the reverse is not necessarily true. + // One exception to the above rule is when we have minidebuginfo embedded + // into a compressed .gnu_debugdata section. This section contains a .symtab + // from which all symbols already contained in the .dynsym are stripped. Section *symtab = section_list->FindSectionByType(eSectionTypeELFSymbolTable, true).get(); - if (!symtab) { - // The symtab section is non-allocable and can be stripped, so if it - // doesn't exist then use the dynsym section which should always be - // there. - symtab = - section_list->FindSectionByType(eSectionTypeELFDynamicSymbols, true) - .get(); - } if (symtab) { m_symtab_up.reset(new Symtab(symtab->GetObjectFile())); symbol_id += ParseSymbolTable(m_symtab_up.get(), symbol_id, symtab); } + // The symtab section is non-allocable and can be stripped, while the dynsym + // section which should always be always be there. If both exist we load + // both to support the minidebuginfo case. Otherwise we just load the dynsym + // section. + Section *dynsym = + section_list->FindSectionByType(eSectionTypeELFDynamicSymbols, true) + .get(); + if (dynsym) { + if (!m_symtab_up) { + auto sec = symtab ? symtab : dynsym; + m_symtab_up.reset(new Symtab(sec->GetObjectFile())); + } + symbol_id += ParseSymbolTable(m_symtab_up.get(), symbol_id, dynsym); + } + // DT_JMPREL // If present, this entry's d_ptr member holds the address of // relocation |

