aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorWill Newton <will.newton@linaro.org>2014-06-16 15:49:07 +0100
committerWill Newton <will.newton@linaro.org>2014-06-16 15:51:21 +0100
commit9f19ab6dfa13c3971423624d18f20d90ab70c9cc (patch)
tree6ad062f4a16eaff590078a0c2d11a9505a7e0ad1 /ld
parentd03de42190b3b55fb195340dde8e595714a35090 (diff)
downloadgdb-9f19ab6dfa13c3971423624d18f20d90ab70c9cc.zip
gdb-9f19ab6dfa13c3971423624d18f20d90ab70c9cc.tar.gz
gdb-9f19ab6dfa13c3971423624d18f20d90ab70c9cc.tar.bz2
ld/ARM: Fix IFUNC and TLS descriptors in the same shared object
Combining TLS descriptors and GNU indirect functions in the same object could lead to assertions or multiple dynamic relocations for the same GOT slot. Fix the bookkeeping so this doesn't happen. This allows building and make checking glibc with -mtls-dialect=gnu2. bfd/ChangeLog: 2014-06-16 Will Newton <will.newton@linaro.org> * elf32-arm.c (elf32_arm_allocate_plt_entry): Increment htab->next_tls_desc_index in the non-IPLT case. Calculate GOT offset correctly for the non-IPLT case. (allocate_dynrelocs_for_symbol): Don't increment htab->next_tls_desc_index here. ld/testsuite/ChangeLog: 2014-06-16 Will Newton <will.newton@linaro.org> * ld-arm/arm-elf.exp: Add ifunc-gdesc test. * ld-arm/ifunc-gdesc.r: New file. * ld-arm/ifunc-gdesc.s: Likewise. * ld-arm/ifunc-gdesc.ver: Likewise.
Diffstat (limited to 'ld')
-rw-r--r--ld/testsuite/ChangeLog7
-rw-r--r--ld/testsuite/ld-arm/arm-elf.exp3
-rw-r--r--ld/testsuite/ld-arm/ifunc-gdesc.r6
-rw-r--r--ld/testsuite/ld-arm/ifunc-gdesc.s29
-rw-r--r--ld/testsuite/ld-arm/ifunc-gdesc.ver4
5 files changed, 49 insertions, 0 deletions
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index ca10aa1..2ef10c0 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2014-06-16 Will Newton <will.newton@linaro.org>
+
+ * ld-arm/arm-elf.exp: Add ifunc-gdesc test.
+ * ld-arm/ifunc-gdesc.r: New file.
+ * ld-arm/ifunc-gdesc.s: Likewise.
+ * ld-arm/ifunc-gdesc.ver: Likewise.
+
2014-06-09 Ryan Mansfield <rmansfield@qnx.com>
* config/default.exp (GASP): Remove.
diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp
index c255587..2e7e164 100644
--- a/ld/testsuite/ld-arm/arm-elf.exp
+++ b/ld/testsuite/ld-arm/arm-elf.exp
@@ -460,6 +460,9 @@ set armelftests_nonacl {
"" {long-plt-format.s}
{{objdump "-d -j .plt" long-plt-format.d}}
"long-plt-format"}
+ {"IFUNC and TLS descriptor shared library" "-shared -T arm-lib.ld --version-script=ifunc-gdesc.ver" "" "" {ifunc-gdesc.s}
+ {{objdump "-Rw" ifunc-gdesc.r}}
+ "ifunc-gdesc.so"}
}
run_ld_link_tests $armelftests_common
diff --git a/ld/testsuite/ld-arm/ifunc-gdesc.r b/ld/testsuite/ld-arm/ifunc-gdesc.r
new file mode 100644
index 0000000..a49dd2b
--- /dev/null
+++ b/ld/testsuite/ld-arm/ifunc-gdesc.r
@@ -0,0 +1,6 @@
+tmpdir/ifunc-gdesc.so: file format elf32-(big|little)arm
+DYNAMIC RELOCATION RECORDS
+OFFSET TYPE VALUE
+0000825c R_ARM_IRELATIVE \*ABS\*
+00008248 R_ARM_TLS_DESC \*ABS\*
+00008250 R_ARM_TLS_DESC \*ABS\*
diff --git a/ld/testsuite/ld-arm/ifunc-gdesc.s b/ld/testsuite/ld-arm/ifunc-gdesc.s
new file mode 100644
index 0000000..a07a5d5
--- /dev/null
+++ b/ld/testsuite/ld-arm/ifunc-gdesc.s
@@ -0,0 +1,29 @@
+
+ .arm
+
+foo:
+ bl ifunc1(PLT)
+ ldr r0,1f
+2: bl loc1(tlscall)
+ nop
+1: .word loc1(tlsdesc) + (. - 2b)
+
+ ldr r0,1f
+2: bl loc2(tlscall)
+ nop
+1: .word loc2(tlsdesc) + (. - 2b)
+
+ .type ifunc1,%gnu_indirect_function
+ .global ifunc1
+ifunc1:
+ mov pc,lr
+ .size ifunc1,.-ifunc1
+
+
+ .section .tdata,"awT",%progbits
+ .space 8
+ .type loc1, %object
+loc1: .space 4
+ .type loc2, %object
+loc2: .space 4
+
diff --git a/ld/testsuite/ld-arm/ifunc-gdesc.ver b/ld/testsuite/ld-arm/ifunc-gdesc.ver
new file mode 100644
index 0000000..a82ffc4
--- /dev/null
+++ b/ld/testsuite/ld-arm/ifunc-gdesc.ver
@@ -0,0 +1,4 @@
+{
+global: foo;
+local: *;
+}; \ No newline at end of file