From a0a63b2f9053349887514d430881342aa4f6214b Mon Sep 17 00:00:00 2001 From: Sean Fertile Date: Thu, 6 Jun 2019 19:34:18 +0000 Subject: [PATCH] Revert "[ELF] Suppress "STT_SECTION symbol should be defined" on .eh_frame, .debug*, .zdebug* and .gcc_except_table" This reverts commit dcba4828a9ead5f5b1fa27f0853823618075d0e0. This commit builds on dcba4828a9ead5f5b1fa27f0853823618075d0e0 which breaks the multi-staged PowerPC buildbot. llvm-svn: 362738 --- lld/ELF/InputSection.cpp | 17 ++------ lld/test/ELF/Inputs/comdat-discarded-reloc.s | 12 +++--- lld/test/ELF/comdat-discarded-reloc.s | 39 ++++--------------- .../ELF/invalid-undef-section-symbol.test | 26 +++++++++++++ lld/test/ELF/relocatable-eh-frame.s | 21 ++++++++++ 5 files changed, 62 insertions(+), 53 deletions(-) create mode 100644 lld/test/ELF/invalid-undef-section-symbol.test create mode 100644 lld/test/ELF/relocatable-eh-frame.s diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index d09eae1a2f42..832e02cb2a81 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -412,8 +412,7 @@ void InputSection::copyRelocations(uint8_t *Buf, ArrayRef Rels) { for (const RelTy &Rel : Rels) { RelType Type = Rel.getType(Config->IsMips64EL); - const ObjFile *File = getFile(); - Symbol &Sym = File->getRelocTargetSym(Rel); + Symbol &Sym = getFile()->getRelocTargetSym(Rel); auto *P = reinterpret_cast(Buf); Buf += sizeof(RelTy); @@ -436,20 +435,10 @@ void InputSection::copyRelocations(uint8_t *Buf, ArrayRef Rels) { // .eh_frame is horribly special and can reference discarded sections. To // avoid having to parse and recreate .eh_frame, we just replace any // relocation in it pointing to discarded sections with R_*_NONE, which - // hopefully creates a frame that is ignored at runtime. Also, don't warn - // on .gcc_except_table and debug sections. + // hopefully creates a frame that is ignored at runtime. auto *D = dyn_cast(&Sym); if (!D) { - if (!Sec->Name.startswith(".debug") && - !Sec->Name.startswith(".zdebug") && Sec->Name != ".eh_frame" && - Sec->Name != ".gcc_except_table") { - uint32_t SecIdx = cast(Sym).DiscardedSecIdx; - Elf_Shdr_Impl Sec = - CHECK(File->getObj().sections(), File)[SecIdx]; - warn("relocation refers to a discarded section: " + - CHECK(File->getObj().getSectionName(&Sec), File) + - "\n>>> referenced by " + getObjMsg(P->r_offset)); - } + warn("STT_SECTION symbol should be defined"); P->setSymbolAndType(0, 0, false); continue; } diff --git a/lld/test/ELF/Inputs/comdat-discarded-reloc.s b/lld/test/ELF/Inputs/comdat-discarded-reloc.s index d89575f27e94..9526f5ac95c0 100644 --- a/lld/test/ELF/Inputs/comdat-discarded-reloc.s +++ b/lld/test/ELF/Inputs/comdat-discarded-reloc.s @@ -1,8 +1,6 @@ -.global bar, _start +.section .text.bar1,"aG",@progbits,group,comdat -.section .text.foo,"aG",@progbits,group,comdat - -.section .text -_start: - .quad .text.foo - .quad bar +.section .text.bar2 +.global bar +bar: + .quad .text.bar1 diff --git a/lld/test/ELF/comdat-discarded-reloc.s b/lld/test/ELF/comdat-discarded-reloc.s index 4d50ab10e512..d12732cd3569 100644 --- a/lld/test/ELF/comdat-discarded-reloc.s +++ b/lld/test/ELF/comdat-discarded-reloc.s @@ -1,42 +1,17 @@ # 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 --noinhibit-exec %t2.o %t.o -o /dev/null -# RUN: ld.lld -r %t2.o %t.o -o %t 2>&1 | FileCheck --check-prefix=WARN %s -# RUN: llvm-readobj -r %t | FileCheck --check-prefix=RELOC %s +# 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) ## Test case checks we do not crash. -# WARN: warning: relocation refers to a discarded section: .text.bar1 -# WARN-NEXT: >>> referenced by {{.*}}.o:(.rela.text.bar2+0x0) -# WARN-NOT: warning +.global bar, _start -# RELOC: .rela.eh_frame { -# RELOC-NEXT: R_X86_64_NONE -# RELOC-NEXT: } -# RELOC-NEXT: .rela.debug_foo { -# RELOC-NEXT: R_X86_64_NONE -# RELOC-NEXT: } -# RELOC-NEXT: .rela.gcc_except_table { -# RELOC-NEXT: R_X86_64_NONE -# RELOC-NEXT: } +.section .text.foo,"aG",@progbits,group,comdat -.section .text.bar1,"aG",@progbits,group,comdat - -## .text.bar1 in this file is discarded. Warn on the relocation. -.section .text.bar2,"ax" -.globl bar -bar: - .quad .text.bar1 - -## Don't warn on .eh_frame, .debug*, .zdebug*, or .gcc_except_table -.section .eh_frame,"a" - .quad .text.bar1 - -.section .debug_foo - .quad .text.bar1 - -.section .gcc_except_table,"a" - .quad .text.bar1 +.section .text +_start: + .quad .text.foo + .quad bar diff --git a/lld/test/ELF/invalid-undef-section-symbol.test b/lld/test/ELF/invalid-undef-section-symbol.test new file mode 100644 index 000000000000..80e5a1464d74 --- /dev/null +++ b/lld/test/ELF/invalid-undef-section-symbol.test @@ -0,0 +1,26 @@ +# RUN: yaml2obj %s -o %t.o +# 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 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + - Name: .rela.text + Type: SHT_RELA + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000000 + Symbol: .text + Type: R_X86_64_NONE +Symbols: + - Name: .text + Type: STT_SECTION diff --git a/lld/test/ELF/relocatable-eh-frame.s b/lld/test/ELF/relocatable-eh-frame.s new file mode 100644 index 000000000000..6172dd355db4 --- /dev/null +++ b/lld/test/ELF/relocatable-eh-frame.s @@ -0,0 +1,21 @@ +# 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 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 [ +# CHECK-NEXT: Section ({{.*}}) .rela.eh_frame { +# CHECK-NEXT: 0x20 R_X86_64_PC32 .foo 0x0 +# CHECK-NEXT: 0x50 R_X86_64_NONE - 0x0 +# CHECK-NEXT: } +# CHECK-NEXT: ] + +.section .foo,"aG",@progbits,bar,comdat +.cfi_startproc +.cfi_endproc