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