[PR,ld/25062] arm: sign extend the addend of R_ARM_TLS_GOTDESC

Message ID bd1cdb99-6250-89ac-b66a-b9bcd11da98f@arm.com
State New
Headers show
Series
  • [PR,ld/25062] arm: sign extend the addend of R_ARM_TLS_GOTDESC
Related show

Commit Message

Szabolcs Nagy Oct. 4, 2019, 9:38 a.m.
Fixes an ld crash when -mtls-dialect=gnu2 is used.

OK to commit and later backport?

Comments

Nick Clifton Oct. 4, 2019, 9:48 a.m. | #1
Hi Szabolcs,

> Fixes an ld crash when -mtls-dialect=gnu2 is used.

> OK to commit and later backport?


Approved for both, please apply.

Cheers
  Nick

Patch

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