Index: ELF/InputFiles.cpp =================================================================== --- ELF/InputFiles.cpp +++ ELF/InputFiles.cpp @@ -941,6 +941,9 @@ StringRefZ Name = this->StringTable.data() + Sym->st_name; if (Sym->st_shndx == SHN_UNDEF) return make(this, Name, Binding, StOther, Type); + if (Sec == &InputSection::Discarded) + return make(this, Name, Binding, StOther, Type, + /*DiscardedSecIdx=*/SecIdx); return make(this, Name, Binding, StOther, Type, Value, Size, Sec); } Index: ELF/InputSection.cpp =================================================================== --- ELF/InputSection.cpp +++ ELF/InputSection.cpp @@ -438,7 +438,8 @@ // hopefully creates a frame that is ignored at runtime. auto *D = dyn_cast(&Sym); if (!D) { - error("STT_SECTION symbol should be defined"); + warn("STT_SECTION symbol should be defined"); + P->setSymbolAndType(0, 0, false); continue; } SectionBase *Section = D->Section->Repl; Index: ELF/Relocations.cpp =================================================================== --- ELF/Relocations.cpp +++ ELF/Relocations.cpp @@ -681,9 +681,17 @@ return ""; ArrayRef> ObjSections = CHECK(File->getObj().sections(), File); - std::string Msg = - "relocation refers to a symbol in a discarded section: " + toString(Sym) + - "\n>>> defined in " + toString(File); + + std::string Msg; + if (Sym.Type == ELF::STT_SECTION) { + Msg = "relocation refers to a discarded section: "; + Msg += CHECK( + File->getObj().getSectionName(&ObjSections[Sym.DiscardedSecIdx]), File); + } else { + Msg = "relocation refers to a symbol in a discarded section: " + + toString(Sym); + } + Msg += "\n>>> defined in " + toString(File); Elf_Shdr_Impl ELFSec = ObjSections[Sym.DiscardedSecIdx - 1]; if (ELFSec.sh_type != SHT_GROUP) Index: test/ELF/comdat-discarded-error.s =================================================================== --- test/ELF/comdat-discarded-error.s +++ test/ELF/comdat-discarded-error.s @@ -5,7 +5,7 @@ # RUN: echo '.section .text.foo,"axG",@progbits,foo,comdat; .globl bar; bar:' | \ # RUN: llvm-mc -filetype=obj -triple=x86_64 - -o %t3.o -# RUN: not ld.lld %t1.o %t2.o %t3.o -o /dev/null 2>&1 | FileCheck %s +# RUN: not ld.lld %t2.o %t3.o %t1.o -o /dev/null 2>&1 | FileCheck %s # CHECK: error: relocation refers to a symbol in a discarded section: bar # CHECK-NEXT: >>> defined in {{.*}}3.o @@ -13,6 +13,16 @@ # CHECK-NEXT: >>> prevailing definition is in {{.*}}2.o # CHECK-NEXT: >>> referenced by {{.*}}1.o:(.text+0x1) +# CHECK: error: relocation refers to a discarded section: .text.foo +# CHECK-NEXT: >>> defined in {{.*}}1.o +# CHECK-NEXT: >>> section group signature: foo +# CHECK-NEXT: >>> prevailing definition is in {{.*}}2.o +# CHECK-NEXT: >>> referenced by {{.*}}1.o:(.data+0x0) + .globl _start _start: jmp bar + +.section .text.foo,"axG",@progbits,foo,comdat +.data + .quad .text.foo Index: test/ELF/comdat-discarded-reloc.s =================================================================== --- test/ELF/comdat-discarded-reloc.s +++ test/ELF/comdat-discarded-reloc.s @@ -1,7 +1,7 @@ # REQUIRES: x86 # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/comdat-discarded-reloc.s -o %t2.o -# RUN: ld.lld -gc-sections %t.o %t2.o -o %t +# RUN: ld.lld -gc-sections --noinhibit-exec %t.o %t2.o -o /dev/null ## ELF spec doesn't allow a relocation to point to a deduplicated ## COMDAT section. Unfortunately this happens in practice (e.g. .eh_frame) Index: test/ELF/comdat.s =================================================================== --- test/ELF/comdat.s +++ test/ELF/comdat.s @@ -1,7 +1,7 @@ // REQUIRES: x86 // RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o // RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/comdat.s -o %t2.o -// RUN: ld.lld -shared %t.o %t.o %t2.o -o %t +// RUN: ld.lld -shared %t.o %t2.o -o %t // RUN: llvm-objdump -d %t | FileCheck %s // RUN: llvm-readobj -S --symbols %t | FileCheck --check-prefix=READ %s @@ -31,9 +31,7 @@ // CHECK-EMPTY: // CHECK-NEXT: bar: // 0x1000 - 0x1001 - 5 = -6 -// 0 - 0x1006 - 5 = -4107 // CHECK-NEXT: 1001: {{.*}} callq -6 -// CHECK-NEXT: 1006: {{.*}} callq -4107 .section .text3,"axG",@progbits,zed,comdat,unique,0 Index: test/ELF/invalid-undef-section-symbol.test =================================================================== --- test/ELF/invalid-undef-section-symbol.test +++ test/ELF/invalid-undef-section-symbol.test @@ -1,5 +1,5 @@ # RUN: yaml2obj %s -o %t.o -# RUN: not ld.lld -r %t.o -o /dev/null 2>&1 | FileCheck %s +# RUN: not ld.lld -r --fatal-warnings %t.o -o /dev/null 2>&1 | FileCheck %s # We used to crash at this. # CHECK: STT_SECTION symbol should be defined Index: test/ELF/relocatable-eh-frame.s =================================================================== --- test/ELF/relocatable-eh-frame.s +++ test/ELF/relocatable-eh-frame.s @@ -1,10 +1,12 @@ # REQUIRES: x86 # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o -# RUN: ld.lld -r %t.o %t.o -o %t +# RUN: ld.lld -r %t.o %t.o -o %t 2>&1 | FileCheck --check-prefix=WARN %s # RUN: llvm-readobj -r %t | FileCheck %s # RUN: ld.lld %t -o %t.so -shared # RUN: llvm-objdump -h %t.so | FileCheck --check-prefix=DSO %s +# WARN: STT_SECTION symbol should be defined + # DSO: .eh_frame 00000034 # CHECK: Relocations [