Skip to content

Commit

Permalink
[elf] Remove one copy of the section merging code
Browse files Browse the repository at this point in the history
Summary:
Besides being superfluous, this double merging was actually wrong and
causing some sections to be added twice. The reason for that was that
the code assumes section IDs are unique in the section list, but this is
only true if all sections in the list come from the same object file.

Reviewers: fjricci, jankratochvil

Subscribers: emaste, lldb-commits, arichardson

Differential Revision: https://reviews.llvm.org/D44157

llvm-svn: 327123
labath committed Mar 9, 2018
1 parent 3aa75a7 commit 3ef4eeb
Showing 2 changed files with 46 additions and 32 deletions.
42 changes: 42 additions & 0 deletions lldb/lit/Modules/elf-duplicate-section.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# RUN: mkdir -p %t/.build-id/1b
# RUN: yaml2obj %s > %t/.build-id/1b/8a73ac238390e32a7ff4ac8ebe4d6a41ecf5c9.debug
# RUN: cd %t
# RUN: llvm-objcopy --strip-all --add-gnu-debuglink=.build-id/1b/8a73ac238390e32a7ff4ac8ebe4d6a41ecf5c9.debug %t/.build-id/1b/8a73ac238390e32a7ff4ac8ebe4d6a41ecf5c9.debug %t/stripped.out
# RUN: lldb-test module-sections %t/stripped.out | FileCheck %s

# Make sure that the debug_frame section is present only once.
# CHECK: Name: .debug_frame
# CHECK-NOT: .debug_frame

--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Entry: 0x00000000004003D0
Sections:
- Name: .note.gnu.build-id
Type: SHT_NOTE
Flags: [ SHF_ALLOC ]
Address: 0x0000000000400274
AddressAlign: 0x0000000000000004
Content: 040000001400000003000000474E55001B8A73AC238390E32A7FF4AC8EBE4D6A41ECF5C9
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x00000000004003D0
AddressAlign: 0x0000000000000010
Content: DEADBEEFBAADF00D
- Name: .debug_frame
Type: SHT_PROGBITS
AddressAlign: 0x0000000000000008
Content: DEADBEEFBAADF00D
Symbols:
Local:
- Name: main
Type: STT_FUNC
Section: .text
Value: 0x00000000004003D0
Size: 0x0000000000000008
...
36 changes: 4 additions & 32 deletions lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
Original file line number Diff line number Diff line change
@@ -1986,38 +1986,10 @@ void ObjectFileELF::CreateSections(SectionList &unified_section_list) {
}
}

if (m_sections_ap.get()) {
if (GetType() == eTypeDebugInfo) {
static const SectionType g_sections[] = {
eSectionTypeDWARFDebugAbbrev, eSectionTypeDWARFDebugAddr,
eSectionTypeDWARFDebugAranges, eSectionTypeDWARFDebugCuIndex,
eSectionTypeDWARFDebugFrame, eSectionTypeDWARFDebugInfo,
eSectionTypeDWARFDebugLine, eSectionTypeDWARFDebugLoc,
eSectionTypeDWARFDebugMacInfo, eSectionTypeDWARFDebugPubNames,
eSectionTypeDWARFDebugPubTypes, eSectionTypeDWARFDebugRanges,
eSectionTypeDWARFDebugStr, eSectionTypeDWARFDebugStrOffsets,
eSectionTypeELFSymbolTable,
};
SectionList *elf_section_list = m_sections_ap.get();
for (size_t idx = 0; idx < sizeof(g_sections) / sizeof(g_sections[0]);
++idx) {
SectionType section_type = g_sections[idx];
SectionSP section_sp(
elf_section_list->FindSectionByType(section_type, true));
if (section_sp) {
SectionSP module_section_sp(
unified_section_list.FindSectionByType(section_type, true));
if (module_section_sp)
unified_section_list.ReplaceSection(module_section_sp->GetID(),
section_sp);
else
unified_section_list.AddSection(section_sp);
}
}
} else {
unified_section_list = *m_sections_ap;
}
}
// For eTypeDebugInfo files, the Symbol Vendor will take care of updating the
// unified section list.
if (GetType() != eTypeDebugInfo)
unified_section_list = *m_sections_ap;
}

// Find the arm/aarch64 mapping symbol character in the given symbol name.

0 comments on commit 3ef4eeb

Please sign in to comment.