[lld] r296378 - Add terminator to .eh_frame sections

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 27 12:45:00 PST 2017


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 {




More information about the llvm-commits mailing list