[lld] r362497 - [ELF] Suppress "STT_SECTION symbol should be defined" on .eh_frame, .debug*, .zdebug* and .gcc_except_table
Hans Wennborg via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 25 08:49:10 PDT 2019
Reverted in r364321 as it depended on r362743
On Tue, Jun 4, 2019 at 3:38 PM Fangrui Song via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
> Author: maskray
> Date: Tue Jun 4 06:41:29 2019
> New Revision: 362497
>
> URL: http://llvm.org/viewvc/llvm-project?rev=362497&view=rev
> Log:
> [ELF] Suppress "STT_SECTION symbol should be defined" on .eh_frame, .debug*, .zdebug* and .gcc_except_table
>
> Summary:
> With -r or --emit-relocs, we warn `STT_SECTION symbol should be defined`
> on relocations to discarded section symbol. This was added as an error
> in rLLD319404, but was not so effective before D61583 (it turned the
> error to a warning).
>
> Relocations from .eh_frame .debug* .zdebug* .gcc_except_table to
> discarded .text are very common and somewhat expected. Don't warn/error
> on them. As a reference, ld.bfd has a similar logic in
> _bfd_elf_default_action_discarded() to allow these cases.
>
> Delete invalid-undef-section-symbol.test because what it intended to
> check is now covered by the updated comdat-discarded-reloc.s
>
> Delete relocatable-eh-frame.s because we allow relocations from
> .eh_frame as a special case now.
>
> Reviewers: grimar, phosek, ruiu, espindola
>
> Reviewed By: ruiu
>
> Subscribers: emaste, arichardson, llvm-commits
>
> Tags: #llvm
>
> Differential Revision: https://reviews.llvm.org/D62840
>
> Removed:
> lld/trunk/test/ELF/invalid-undef-section-symbol.test
> lld/trunk/test/ELF/relocatable-eh-frame.s
> Modified:
> lld/trunk/ELF/InputSection.cpp
> lld/trunk/test/ELF/Inputs/comdat-discarded-reloc.s
> lld/trunk/test/ELF/comdat-discarded-reloc.s
>
> Modified: lld/trunk/ELF/InputSection.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.cpp?rev=362497&r1=362496&r2=362497&view=diff
> ==============================================================================
> --- lld/trunk/ELF/InputSection.cpp (original)
> +++ lld/trunk/ELF/InputSection.cpp Tue Jun 4 06:41:29 2019
> @@ -412,7 +412,8 @@ void InputSection::copyRelocations(uint8
>
> for (const RelTy &Rel : Rels) {
> RelType Type = Rel.getType(Config->IsMips64EL);
> - Symbol &Sym = getFile<ELFT>()->getRelocTargetSym(Rel);
> + const ObjFile<ELFT> *File = getFile<ELFT>();
> + Symbol &Sym = File->getRelocTargetSym(Rel);
>
> auto *P = reinterpret_cast<typename ELFT::Rela *>(Buf);
> Buf += sizeof(RelTy);
> @@ -435,10 +436,20 @@ void InputSection::copyRelocations(uint8
> // .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.
> + // hopefully creates a frame that is ignored at runtime. Also, don't warn
> + // on .gcc_except_table and debug sections.
> auto *D = dyn_cast<Defined>(&Sym);
> if (!D) {
> - warn("STT_SECTION symbol should be defined");
> + if (!Sec->Name.startswith(".debug") &&
> + !Sec->Name.startswith(".zdebug") && Sec->Name != ".eh_frame" &&
> + Sec->Name != ".gcc_except_table") {
> + uint32_t SecIdx = cast<Undefined>(Sym).DiscardedSecIdx;
> + Elf_Shdr_Impl<ELFT> 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));
> + }
> P->setSymbolAndType(0, 0, false);
> continue;
> }
>
> Modified: lld/trunk/test/ELF/Inputs/comdat-discarded-reloc.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/Inputs/comdat-discarded-reloc.s?rev=362497&r1=362496&r2=362497&view=diff
> ==============================================================================
> --- lld/trunk/test/ELF/Inputs/comdat-discarded-reloc.s (original)
> +++ lld/trunk/test/ELF/Inputs/comdat-discarded-reloc.s Tue Jun 4 06:41:29 2019
> @@ -1,6 +1,8 @@
> -.section .text.bar1,"aG", at progbits,group,comdat
> +.global bar, _start
>
> -.section .text.bar2
> -.global bar
> -bar:
> - .quad .text.bar1
> +.section .text.foo,"aG", at progbits,group,comdat
> +
> +.section .text
> +_start:
> + .quad .text.foo
> + .quad bar
>
> Modified: lld/trunk/test/ELF/comdat-discarded-reloc.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/comdat-discarded-reloc.s?rev=362497&r1=362496&r2=362497&view=diff
> ==============================================================================
> --- lld/trunk/test/ELF/comdat-discarded-reloc.s (original)
> +++ lld/trunk/test/ELF/comdat-discarded-reloc.s Tue Jun 4 06:41:29 2019
> @@ -1,17 +1,42 @@
> # 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 %t.o %t2.o -o /dev/null
> +# 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
>
> ## 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.
>
> -.global bar, _start
> +# WARN: warning: relocation refers to a discarded section: .text.bar1
> +# WARN-NEXT: >>> referenced by {{.*}}.o:(.rela.text.bar2+0x0)
> +# WARN-NOT: warning
>
> -.section .text.foo,"aG", at progbits,group,comdat
> +# 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
> -_start:
> - .quad .text.foo
> - .quad bar
> +.section .text.bar1,"aG", at 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
>
> Removed: lld/trunk/test/ELF/invalid-undef-section-symbol.test
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/invalid-undef-section-symbol.test?rev=362496&view=auto
> ==============================================================================
> --- lld/trunk/test/ELF/invalid-undef-section-symbol.test (original)
> +++ lld/trunk/test/ELF/invalid-undef-section-symbol.test (removed)
> @@ -1,26 +0,0 @@
> -# 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
>
> Removed: lld/trunk/test/ELF/relocatable-eh-frame.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/relocatable-eh-frame.s?rev=362496&view=auto
> ==============================================================================
> --- lld/trunk/test/ELF/relocatable-eh-frame.s (original)
> +++ lld/trunk/test/ELF/relocatable-eh-frame.s (removed)
> @@ -1,21 +0,0 @@
> -# 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", at progbits,bar,comdat
> -.cfi_startproc
> -.cfi_endproc
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list