This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] [PR ld/25062] arm: sign extend the addend of R_ARM_TLS_GOTDESC
- From: Szabolcs Nagy <Szabolcs dot Nagy at arm dot com>
- To: Binutils <binutils at sourceware dot org>
- Cc: nd <nd at arm dot com>
- Date: Fri, 4 Oct 2019 09:38:13 +0000
- Subject: [PATCH] [PR ld/25062] arm: sign extend the addend of R_ARM_TLS_GOTDESC
- Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
- Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=3yUN8OqSNrJ0sqOqcM/WuhClqVfEv/rkh/ypBWZWZSA=; b=JseKmcdlUwHoNTUEFvTeXrprSGM1pYwumUQTUo+NQ/gOUQDAOr7z1SM1McJFCVfx5x6TXvgNNtviRcieVjFzhJE0t6RU3GQ87d652JQZr6b4lyuCIiOmrboHGFg2xFw0LKs/NWNtncvJyDfTuMo9aUDDzIjJHpZ9sBrKIG6IxC6/FGIpX68z20Mr2qzoANCQebHyWIDlj1w3nRxye9cuvsIeg6y9NrsgLQN+iL5ADIYY/c2kDwdAPojOEvc+C5gojhuwSxbFW2gaVGVZqnm/qg2Z7EKEYFhkV2wEyj4kUp95nebCx9ECK9kCuuXWI3wISDAdwku+ocqkWubX/nZekw==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LVB7PJkrjlzfruKOYcKS3YnsAuxfdENKVtcOfNthzHh7XK6Zvq6D2GuJFsM7b5wNB0X7llIKI492oTqo32eTa5KAASHqsMffWwGXueH3BcdJAd9y64/7qy3zauDrvgqcBF/Nqshf1Xy1YftDwvt6DhB46AmeL/s3MGPeFPxn3D/93ep9M3QBwa3Ht/gduOMIT2LZxcX2vhFoLUdQuemxs0kRcoE5XdahCo05CquFVqK5ZmN6OmS0wjZBSo72ZDydpBKft8F17qEJL16S2BxPCTBkSlfgDRmFw8GZb+4OeVqYANI54K8wOuHPVIlkB4/zghdEfQpcE5rawdscX1F1Cw==
- Original-authentication-results: spf=none (sender IP is ) smtp.mailfrom=Szabolcs dot Nagy at arm dot com;
Fixes an ld crash when -mtls-dialect=gnu2 is used.
OK to commit and later backport?
From 8a951e630c6e49847a73776edaebe046798c27ae Mon Sep 17 00:00:00 2001
From: Szabolcs Nagy <szabolcs.nagy@arm.com>
Date: Thu, 3 Oct 2019 19:11:50 +0100
Subject: [PATCH] [PR ld/25062] arm: sign extend the addend of
R_ARM_TLS_GOTDESC
On 64-bit host the 32-bit addend was loaded without sign extension into
an unsigned long.
bfd/ChangeLog:
2019-10-03 Szabolcs Nagy <szabolcs.nagy@arm.com>
PR ld/25062
* elf32-arm.c (elf32_arm_final_link_relocate):
ld/ChangeLog:
2019-10-03 Szabolcs Nagy <szabolcs.nagy@arm.com>
PR ld/25062
* testsuite/ld-arm/arm-elf.exp:
* testsuite/ld-arm/tls-gdesc-neg.d: New test.
* testsuite/ld-arm/tls-gdesc-neg.s: New test.
---
bfd/elf32-arm.c | 4 +--
ld/testsuite/ld-arm/arm-elf.exp | 5 ++++
ld/testsuite/ld-arm/tls-gdesc-neg.d | 39 +++++++++++++++++++++++++++++
ld/testsuite/ld-arm/tls-gdesc-neg.s | 29 +++++++++++++++++++++
4 files changed, 75 insertions(+), 2 deletions(-)
create mode 100644 ld/testsuite/ld-arm/tls-gdesc-neg.d
create mode 100644 ld/testsuite/ld-arm/tls-gdesc-neg.s
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index bb53e039e3..d52c046979 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -12027,9 +12027,9 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
unsigned long data, insn;
unsigned thumb;
- data = bfd_get_32 (input_bfd, hit_data);
+ data = bfd_get_signed_32 (input_bfd, hit_data);
thumb = data & 1;
- data &= ~1u;
+ data &= ~1ul;
if (thumb)
{
diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp
index 7203678527..118aa642d1 100644
--- a/ld/testsuite/ld-arm/arm-elf.exp
+++ b/ld/testsuite/ld-arm/arm-elf.exp
@@ -839,6 +839,11 @@ set armeabitests_nonacl {
"" {tls-gdesc.s}
{{readelf "-x .got" tls-gdesc-nlazy.g}}
"tls-lib2-nlazy.so"}
+ {"TLS gnu shared library negative addend"
+ "--no-fix-arm1176 -shared -T arm-dyn.ld --hash-style=sysv" ""
+ "" {tls-gdesc-neg.s}
+ {{objdump -fdw tls-gdesc-neg.d}}
+ "tls-lib2-neg.so"}
{"TLS long plt library"
"-shared -T arm-dyn.ld --hash-style=sysv --section-start .foo=0x4001000" ""
"" {tls-longplt-lib.s}
diff --git a/ld/testsuite/ld-arm/tls-gdesc-neg.d b/ld/testsuite/ld-arm/tls-gdesc-neg.d
new file mode 100644
index 0000000000..4bbd0124e7
--- /dev/null
+++ b/ld/testsuite/ld-arm/tls-gdesc-neg.d
@@ -0,0 +1,39 @@
+
+tmpdir/tls-lib2-neg.so: file format elf32-littlearm
+architecture: armv.*, flags 0x[0-9a-f]+:
+HAS_SYMS, DYNAMIC, D_PAGED
+start address 0x[0-9a-f]+
+
+Disassembly of section .plt:
+
+00008164 <.plt>:
+ 8164: e52de004 push {lr} ; .*
+ 8168: e59fe004 ldr lr, \[pc, #4\] ; .*
+ 816c: e08fe00e add lr, pc, lr
+ 8170: e5bef008 ldr pc, \[lr, #8\]!
+ 8174: 000080d8 .word 0x000080d8
+ 8178: e08e0000 add r0, lr, r0
+ 817c: e5901004 ldr r1, \[r0, #4\]
+ 8180: e12fff11 bx r1
+ 8184: e52d2004 push {r2} ; .*
+ 8188: e59f200c ldr r2, \[pc, #12\] ; .*
+ 818c: e59f100c ldr r1, \[pc, #12\] ; .*
+ 8190: e79f2002 ldr r2, \[pc, r2\]
+ 8194: e081100f add r1, r1, pc
+ 8198: e12fff12 bx r2
+ 819c: 000080c8 .word 0x000080c8
+ 81a0: 000080b0 .word 0x000080b0
+
+Disassembly of section .text:
+
+000081a4 <foo>:
+ 81a4: e59f0000 ldr r0, \[pc\] ; .*
+ 81a8: ea000000 b 81b0 <foo\+0xc>
+ 81ac: 000080a4 .word 0x000080a4
+ 81b0: fafffff0 blx 8178 <.plt\+0x14>
+
+000081b4 <bar>:
+ 81b4: 4800 ldr r0, \[pc, #0\] ; .*
+ 81b6: e001 b.n 81bc <bar\+0x8>
+ 81b8: 00008097 .word 0x00008097
+ 81bc: f7ff efdc blx 8178 <.plt\+0x14>
diff --git a/ld/testsuite/ld-arm/tls-gdesc-neg.s b/ld/testsuite/ld-arm/tls-gdesc-neg.s
new file mode 100644
index 0000000000..78ec32f593
--- /dev/null
+++ b/ld/testsuite/ld-arm/tls-gdesc-neg.s
@@ -0,0 +1,29 @@
+ .text
+ .arm
+ .globl foo
+ .type foo, %function
+foo:
+ ldr r0, 1f
+ b 2f
+1:
+ @ Negative addend for R_ARM_TLS_GOTDESC.
+ .word tlsdata(tlsdesc) + (. - 2f + 0)
+2:
+ blx tlsdata(tlscall)
+
+ .thumb
+ .globl bar
+ .type bar, %function
+bar:
+ ldr r0, 1f
+ b 2f
+1:
+ @ Negative addend for R_ARM_TLS_GOTDESC.
+ .word tlsdata(tlsdesc) + (. - 2f + 1)
+2:
+ blx tlsdata(tlscall)
+
+ .section .tdata,"awT"
+ .global tlsdata
+tlsdata:
+ .space 4
--
2.17.1