[lld] r296378 - Add terminator to .eh_frame sections
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 28 10:59:58 PST 2017
Feel free to revert.
On Tue, Feb 28, 2017 at 10:41 AM, Rafael Avila de Espindola <
rafael.espindola at gmail.com> wrote:
> I am pretty sure this is wrong. Given
>
> .cfi_startproc
> nop
> .cfi_endproc
>
> bfd and gold produce a .eh_frame that is 0x30 bytes long. We used to do
> that too, but now we produce one that is 0x34.
>
> I think that normally the terminator comes from a .o file that gcc/clang
> adds to the link.
>
> Rui, could you revert this for now?
>
> Mark, could you provide an example where bfd/gold is adding the
> terminator?
>
> Cheers,
> Rafael
>
> Rui Ueyama via llvm-commits <llvm-commits at lists.llvm.org> writes:
>
> > Author: ruiu
> > Date: Mon Feb 27 14:44:59 2017
> > New Revision: 296378
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=296378&view=rev
> > Log:
> > Add terminator to .eh_frame sections
> >
> > Patch by Mark Kettenis.
> >
> > Currenlty ld.lld does not add a terminator (a CIE with its length field
> > set to zero) to the .eh_frame sections it generates. While the relevant
> > standards (the AMD64 SysV ABI and the Linux LSB) are not explicit about
> > this, such a terminator is expected by some unwinder implementations and
> > seems to be always emitted by ld.bfd. In addition to that, the Linux LSB
> >
> > https://refspecs.linuxfoundation.org/LSB_5.0.0/
> LSB-Core-generic/LSB-Core-generic/ehframechpt.html#EHFRAME
> >
> > explicitly says that
> >
> > The .eh_frame section shall contain 1 or more Call Frame Information
> > (CFI) records.
> >
> > Currently, if the .eh_frame sections of the input files only contain
> > terminators, ld.lld emits a zero=sized .eh_frame section
> > which clearly doesn't meet that requirement.
> >
> > The diff makes sure a terminator gets added to each .eh_frame section
> > and adjusts all the relevant tests to account for that. An additional
> > test isn't needed as these adjustments mean that the existence of the
> > terminator is tested for by several tests already.
> >
> > Differential Revision: https://reviews.llvm.org/D30335
> >
> > Modified:
> > lld/trunk/ELF/SyntheticSections.cpp
> > lld/trunk/test/ELF/eh-frame-hdr.s
> > lld/trunk/test/ELF/eh-frame-merge.s
> > lld/trunk/test/ELF/ehframe-relocation.s
> > lld/trunk/test/ELF/invalid-fde-rel.s
> > lld/trunk/test/ELF/linkerscript/eh-frame-hdr.s
> > lld/trunk/test/ELF/linkerscript/symbols-synthetic.s
> > lld/trunk/test/ELF/map-file.s
> > lld/trunk/test/ELF/relocatable-eh-frame.s
> >
> > Modified: lld/trunk/ELF/SyntheticSections.cpp
> > URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> SyntheticSections.cpp?rev=296378&r1=296377&r2=296378&view=diff
> > ============================================================
> ==================
> > --- lld/trunk/ELF/SyntheticSections.cpp (original)
> > +++ lld/trunk/ELF/SyntheticSections.cpp Mon Feb 27 14:44:59 2017
> > @@ -540,7 +540,14 @@ template <class ELFT> void EhFrameSectio
> > Off += alignTo(Fde->size(), sizeof(uintX_t));
> > }
> > }
> > - this->Size = Off;
> > +
> > + // Add a CIE record of length 0 as a terminator. While the relevant
> > + // standards don't explicitly require such a terminator, ld.bfd and
> > + // ld.gold always seem to add one and some unwiders rely on its
> > + // presence. It also prevents us from generating a .eh_frame section
> > + // with zero Call Frame Information records, which isn't allowed by
> > + // the LSB standard.
> > + this->Size = Off + 4;
> > }
> >
> > template <class ELFT> static uint64_t readFdeAddr(uint8_t *Buf, int
> Size) {
> >
> > Modified: lld/trunk/test/ELF/eh-frame-hdr.s
> > URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/eh-
> frame-hdr.s?rev=296378&r1=296377&r2=296378&view=diff
> > ============================================================
> ==================
> > --- lld/trunk/test/ELF/eh-frame-hdr.s (original)
> > +++ lld/trunk/test/ELF/eh-frame-hdr.s Mon Feb 27 14:44:59 2017
> > @@ -84,7 +84,7 @@ _start:
> > // HDR-NEXT: ]
> > // HDR-NEXT: Address: 0x200180
> > // HDR-NEXT: Offset: 0x180
> > -// HDR-NEXT: Size: 96
> > +// HDR-NEXT: Size: 100
> > // HDR-NEXT: Link: 0
> > // HDR-NEXT: Info: 0
> > // HDR-NEXT: AddressAlignment: 8
> > @@ -96,6 +96,7 @@ _start:
> > // HDR-NEXT: 0030: 14000000 34000000 490E0000 01000000
> > // HDR-NEXT: 0040: 00000000 00000000 14000000 4C000000
> > // HDR-NEXT: 0050: 320E0000 01000000 00000000 00000000
> > +// HDR-NEXT: 0060: 00000000
> > // HDR-NEXT: )
> > // CIE: 14000000 00000000 017A5200 01781001 1B0C0708 90010000
> > // FDE(1): 14000000 1C000000 600E0000 01000000 00000000
> 00000000
> >
> > Modified: lld/trunk/test/ELF/eh-frame-merge.s
> > URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/eh-
> frame-merge.s?rev=296378&r1=296377&r2=296378&view=diff
> > ============================================================
> ==================
> > --- lld/trunk/test/ELF/eh-frame-merge.s (original)
> > +++ lld/trunk/test/ELF/eh-frame-merge.s Mon Feb 27 14:44:59 2017
> > @@ -27,7 +27,7 @@
> > // CHECK-NEXT: ]
> > // CHECK-NEXT: Address:
> > // CHECK-NEXT: Offset:
> > -// CHECK-NEXT: Size: 96
> > +// CHECK-NEXT: Size: 100
> > // CHECK-NEXT: Link: 0
> > // CHECK-NEXT: Info: 0
> > // CHECK-NEXT: AddressAlignment: 8
> > @@ -39,6 +39,7 @@
> > // CHECK-NEXT: 0030: 14000000 34000000 D20D0000 02000000 |
> > // CHECK-NEXT: 0040: 00000000 00000000 14000000 4C000000 |
> > // CHECK-NEXT: 0050: B90D0000 01000000 00000000 00000000 |
> > +// CHECK-NEXT: 0060: 00000000 |
> > // CHECK-NEXT: )
> >
> > // CHECK: Name: foo
> >
> > Modified: lld/trunk/test/ELF/ehframe-relocation.s
> > URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/
> ehframe-relocation.s?rev=296378&r1=296377&r2=296378&view=diff
> > ============================================================
> ==================
> > --- lld/trunk/test/ELF/ehframe-relocation.s (original)
> > +++ lld/trunk/test/ELF/ehframe-relocation.s Mon Feb 27 14:44:59 2017
> > @@ -12,7 +12,7 @@
> > // CHECK-NEXT: ]
> > // CHECK-NEXT: Address: 0x200120
> > // CHECK-NEXT: Offset:
> > -// CHECK-NEXT: Size: 48
> > +// CHECK-NEXT: Size: 52
> > // CHECK-NOT: .eh_frame
> >
> > // 0x200120 = 2097440
> >
> > Modified: lld/trunk/test/ELF/invalid-fde-rel.s
> > URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/
> invalid-fde-rel.s?rev=296378&r1=296377&r2=296378&view=diff
> > ============================================================
> ==================
> > --- lld/trunk/test/ELF/invalid-fde-rel.s (original)
> > +++ lld/trunk/test/ELF/invalid-fde-rel.s Mon Feb 27 14:44:59 2017
> > @@ -33,4 +33,4 @@
> > .long 0x0
> > .long 0x0
> >
> > -// CHECK: 1 .eh_frame 00000018
> > +// CHECK: 1 .eh_frame 0000001c
> >
> > Modified: lld/trunk/test/ELF/linkerscript/eh-frame-hdr.s
> > URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/
> linkerscript/eh-frame-hdr.s?rev=296378&r1=296377&r2=296378&view=diff
> > ============================================================
> ==================
> > --- lld/trunk/test/ELF/linkerscript/eh-frame-hdr.s (original)
> > +++ lld/trunk/test/ELF/linkerscript/eh-frame-hdr.s Mon Feb 27 14:44:59
> 2017
> > @@ -7,7 +7,7 @@
> > # RUN: ld.lld -o %t1 --eh-frame-hdr --script %t.script %t
> > # RUN: llvm-objdump -s -section=".eh_frame_hdr" %t1 | FileCheck %s
> >
> > -# CHECK: 011b033b 14000000 01000000 49000000
> > +# CHECK: 011b033b 14000000 01000000 4d000000
> > # CHECK-NEXT: 30000000
> >
> > .global _start
> >
> > Modified: lld/trunk/test/ELF/linkerscript/symbols-synthetic.s
> > URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/
> linkerscript/symbols-synthetic.s?rev=296378&r1=296377&r2=296378&view=diff
> > ============================================================
> ==================
> > --- lld/trunk/test/ELF/linkerscript/symbols-synthetic.s (original)
> > +++ lld/trunk/test/ELF/linkerscript/symbols-synthetic.s Mon Feb 27
> 14:44:59 2017
> > @@ -60,7 +60,7 @@
> > # SIMPLE: 0000000000000128 .foo 00000000 .hidden
> _end_sec
> > # SIMPLE-NEXT: 0000000000000120 .foo 00000000 _begin_sec
> > # SIMPLE-NEXT: 0000000000000128 *ABS* 00000000 _end_sec_abs
> > -# SIMPLE-NEXT: 0000000000001048 .text 00000000 _start
> > +# SIMPLE-NEXT: 000000000000104c .text 00000000 _start
> > # SIMPLE-NEXT: 0000000000000120 .foo 00000000 begin_foo
> > # SIMPLE-NEXT: 0000000000000128 .foo 00000000 end_foo
> > # SIMPLE-NEXT: 0000000000000008 *ABS* 00000000 size_foo_1
> >
> > Modified: lld/trunk/test/ELF/map-file.s
> > URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/
> map-file.s?rev=296378&r1=296377&r2=296378&view=diff
> > ============================================================
> ==================
> > --- lld/trunk/test/ELF/map-file.s (original)
> > +++ lld/trunk/test/ELF/map-file.s Mon Feb 27 14:44:59 2017
> > @@ -27,8 +27,8 @@ local:
> > .comm common,4,16
> >
> > // CHECK: Address Size Align Out In
> File Symbol
> > -// CHECK-NEXT: 0000000000200158 0000000000000030 8 .eh_frame
> > -// CHECK-NEXT: 0000000000200158 0000000000000030 8 .eh_frame
> > +// CHECK-NEXT: 0000000000200158 0000000000000034 8 .eh_frame
> > +// CHECK-NEXT: 0000000000200158 0000000000000034 8 .eh_frame
> > // CHECK-NEXT: 0000000000201000 0000000000000015 4 .text
> > // CHECK-NEXT: 0000000000201000 000000000000000e 4 .text
> > // CHECK-NEXT: 0000000000201000 000000000000000e 4
> {{.*}}{{/|\\}}map-file.s.tmp1.o
> >
> > Modified: lld/trunk/test/ELF/relocatable-eh-frame.s
> > URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/
> relocatable-eh-frame.s?rev=296378&r1=296377&r2=296378&view=diff
> > ============================================================
> ==================
> > --- lld/trunk/test/ELF/relocatable-eh-frame.s (original)
> > +++ lld/trunk/test/ELF/relocatable-eh-frame.s Mon Feb 27 14:44:59 2017
> > @@ -5,7 +5,7 @@
> > # RUN: ld.lld %t -o %t.so -shared
> > # RUN: llvm-objdump -h %t.so | FileCheck --check-prefix=DSO %s
> >
> > -# DSO: .eh_frame 00000030
> > +# DSO: .eh_frame 00000034
> >
> > # CHECK: Relocations [
> > # CHECK-NEXT: Section ({{.*}}) .rela.eh_frame {
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170228/42115794/attachment.html>
More information about the llvm-commits
mailing list