diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2019-10-01 16:10:13 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2019-10-01 16:10:13 +0000 |
commit | 60dd73a693472865fd6978dc62252c41ee22fb46 (patch) | |
tree | 5e8cbb9f821ef48f50b232ed6c536c6c9175015d /test | |
parent | ff54d4faecc1687516d1ae1e3d81a9c9d238123d (diff) |
ELF: Add .interp synthetic sections first in createSyntheticSections().
Our .interp section is not a SyntheticSection. As a result, it terminates the
loop in removeUnusedSyntheticSections(). This has at least two consequences:
- The synthetic .bss and .bss.rel.ro sections are always present in
dynamically linked executables, even when they are not needed.
- The synthetic .ARM.exidx (and possibly other) sections are always present
in partitions other than the last one, even when not needed.
.ARM.exidx in particular is problematic because it assumes that its
list of code sections is non-empty in getLinkOrderDep(), which can
lead to a crash if the partition does not have any code sections.
Fix these problems by moving the creation of the .interp sections to the
top of createSyntheticSections(). While here, make the code a little less
error-prone by changing the add() lambdas to take a SyntheticSection instead
of an InputSectionBase.
Differential Revision: https://reviews.llvm.org/D68256
git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@373347 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/ELF/Inputs/shared.s | 4 | ||||
-rw-r--r-- | test/ELF/dynamic-linker.s | 4 | ||||
-rw-r--r-- | test/ELF/partition-dynamic-linker.s | 24 |
3 files changed, 28 insertions, 4 deletions
diff --git a/test/ELF/Inputs/shared.s b/test/ELF/Inputs/shared.s index c3c22fe4b..4a386be23 100644 --- a/test/ELF/Inputs/shared.s +++ b/test/ELF/Inputs/shared.s @@ -1,9 +1,9 @@ .global bar -.type bar, @function +.type bar, %function bar: .global bar2 -.type bar2, @function +.type bar2, %function bar2: .global zed diff --git a/test/ELF/dynamic-linker.s b/test/ELF/dynamic-linker.s index 3faf8e8a1..d0da77fab 100644 --- a/test/ELF/dynamic-linker.s +++ b/test/ELF/dynamic-linker.s @@ -4,10 +4,10 @@ # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o # RUN: ld.lld --dynamic-linker foo %t.o %t.so -o %t -# RUN: llvm-readelf -program-headers %t | FileCheck %s +# RUN: llvm-readelf --program-headers --section-headers %t | FileCheck --implicit-check-not=.bss %s # RUN: ld.lld --dynamic-linker=foo %t.o %t.so -o %t -# RUN: llvm-readelf -program-headers %t | FileCheck %s +# RUN: llvm-readelf --program-headers --section-headers %t | FileCheck --implicit-check-not=.bss %s # CHECK: [Requesting program interpreter: foo] diff --git a/test/ELF/partition-dynamic-linker.s b/test/ELF/partition-dynamic-linker.s new file mode 100644 index 000000000..f542a35e5 --- /dev/null +++ b/test/ELF/partition-dynamic-linker.s @@ -0,0 +1,24 @@ +## Test that we don't create a .ARM.exidx for the main partition. +## Previously we were doing so, which is unnecessary and led to a crash. + +# RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %p/Inputs/shared.s -o %t1.o +# RUN: ld.lld -shared %t1.o -o %t.so +# RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t.o + +# RUN: ld.lld -shared --gc-sections --dynamic-linker foo %t.o %t.so -o %t +# RUN: llvm-readelf --section-headers %t | FileCheck %s + +# CHECK: .ARM.exidx +# CHECK-NOT: .ARM.exidx + +.section .llvm_sympart,"",%llvm_sympart +.asciz "part1" +.4byte p1 + +.section .text.p1,"ax",%progbits +.globl p1 +p1: +.fnstart +bx lr +.cantunwind +.fnend |