[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