diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -2871,14 +2871,23 @@ InputSection *isec = dyn_cast(s); if (!isec) continue; + if (isec->name == ".debug_info") { + files.insert(isec->file); + continue; + } // .debug_gnu_pub{names,types} are useless in executables. // They are present in input object files solely for creating // a .gdb_index. So we can remove them from the output. if (s->name == ".debug_gnu_pubnames" || s->name == ".debug_gnu_pubtypes") s->markDead(); - else if (isec->name == ".debug_info") - files.insert(isec->file); } + // Drop .rel[a].debug_gnu_pubnames for --emit-relocs. + llvm::erase_if(inputSections, [](InputSectionBase *s) { + if (auto *isec = dyn_cast(s)) + if (InputSectionBase *rel = isec->getRelocatedSection()) + return !rel->isLive(); + return !s->isLive(); + }); std::vector chunks(files.size()); std::vector> nameAttrs(files.size()); diff --git a/lld/test/ELF/debug-gnu-pubnames.s b/lld/test/ELF/debug-gnu-pubnames.s deleted file mode 100644 --- a/lld/test/ELF/debug-gnu-pubnames.s +++ /dev/null @@ -1,18 +0,0 @@ -# REQUIRES: x86 -# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o - -# RUN: ld.lld %t.o -o %t1.exe -# RUN: llvm-readobj --sections %t1.exe | FileCheck %s -# CHECK: .debug_gnu_pubnames -# CHECK: .debug_gnu_pubtypes - -# RUN: ld.lld --gdb-index %t.o -o %t2.exe -# RUN: llvm-readobj --sections %t2.exe | FileCheck %s --check-prefix=GDB -# GDB-NOT: .debug_gnu_pubnames -# GDB-NOT: .debug_gnu_pubtypes - -.section .debug_gnu_pubnames,"",@progbits -.long 0 - -.section .debug_gnu_pubtypes,"",@progbits -.long 0 diff --git a/lld/test/ELF/gdb-index.s b/lld/test/ELF/gdb-index.s --- a/lld/test/ELF/gdb-index.s +++ b/lld/test/ELF/gdb-index.s @@ -5,7 +5,14 @@ # RUN: llvm-objdump -d %t | FileCheck %s --check-prefix=DISASM # RUN: llvm-dwarfdump -gdb-index %t | FileCheck %s --check-prefix=DWARF -# RUN: llvm-readelf -sections %t | FileCheck %s --check-prefix=SECTION + +## Drop .debug_gnu_pubnames and .debug_gnu_pubtypes. +## Also drop their relocation sections if --emit-relocs is specified. +# RUN: ld.lld --gdb-index %t1.o %t2.o -o %t1 +# RUN: llvm-readelf --sections %t1 | FileCheck %s --check-prefix=SECTION + +# SECTION-NOT: .debug_gnu_pubnames +# SECTION-NOT: .debug_gnu_pubtypes # RUN: llvm-mc -compress-debug-sections=zlib-gnu -filetype=obj -triple=x86_64-pc-linux \ # RUN: %p/Inputs/gdb-index.s -o %t2.o @@ -46,8 +53,6 @@ # DWARF-NEXT: 1(0x8): 0x30000000 # DWARF-NEXT: 2(0x10): 0x90000000 0x90000001 -# SECTION-NOT: debug_gnu_pubnames - # RUN: ld.lld --gdb-index --no-gdb-index %t1.o %t2.o -o %t2 # RUN: llvm-readobj --sections %t2 | FileCheck -check-prefix=NOGDB %s # NOGDB-NOT: Name: .gdb_index @@ -111,7 +116,7 @@ .section .debug_gnu_pubnames,"",@progbits .long 0x1e .value 0x2 -.long 0 +.long .debug_info .long 0x33 .long 0x18 .byte 0x30 @@ -121,7 +126,7 @@ .section .debug_gnu_pubtypes,"",@progbits .long 0x17 .value 0x2 -.long 0 +.long .debug_info .long 0x33 .long 0x2b .byte 0x90