summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/ObjectFile/ELF
diff options
context:
space:
mode:
authorKonrad Kleine <kkleine@redhat.com>2019-09-11 10:00:30 +0000
committerKonrad Kleine <kkleine@redhat.com>2019-09-11 10:00:30 +0000
commit3a4781bbf4f39a25562b4c61c9a9ab2483a96b41 (patch)
tree7c8cb736d18d34b1ef072e3ab7f8ed60b11c576a /lldb/source/Plugins/ObjectFile/ELF
parent57256af307ab7bdf42c47da019a1a288b9f9451a (diff)
downloadbcm5719-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.cpp26
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
OpenPOWER on IntegriCloud