[PR ld/25062] arm: sign extend the addend of R_ARM_TLS_GOTDESC
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Thu, 3 Oct 2019 18:11:50 +0000 (19:11 +0100)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Fri, 4 Oct 2019 09:54:16 +0000 (10:54 +0100)
On 64-bit host the 32-bit addend was loaded without sign extension into
an unsigned long.

bfd/ChangeLog:

PR ld/25062
* elf32-arm.c (elf32_arm_final_link_relocate): Sign extend data.

ld/ChangeLog:

PR ld/25062
* testsuite/ld-arm/arm-elf.exp: Update.
* testsuite/ld-arm/tls-gdesc-neg.d: New test.
* testsuite/ld-arm/tls-gdesc-neg.s: New test.

bfd/ChangeLog
bfd/elf32-arm.c
ld/ChangeLog
ld/testsuite/ld-arm/arm-elf.exp
ld/testsuite/ld-arm/tls-gdesc-neg.d [new file with mode: 0644]
ld/testsuite/ld-arm/tls-gdesc-neg.s [new file with mode: 0644]

index fcb645b16967a35b2eb0e62f097eeed06bb3f8c2..85dc6b26be771b3808690b4ec1031e01b51e024f 100644 (file)
@@ -1,3 +1,8 @@
+2019-10-04  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+       PR ld/25062
+       * elf32-arm.c (elf32_arm_final_link_relocate): Sign extend data.
+
 2019-09-30  Nick Alcock  <nick.alcock@oracle.com>
 
        * elf-bfd.h (bfd_section_is_ctf): New inline function.
index bb53e039e307c4a3705371bb72126d74e0852200..d52c0469795fbbb10abf2a31c8b0b643bee54f26 100644 (file)
@@ -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)
              {
index 144320ce5708ed3d92403760ee0b4eea7a4eb55b..671776bbe665598618b2c20eaf7143430f14ce26 100644 (file)
@@ -1,3 +1,10 @@
+2019-10-04  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+       PR ld/25062
+       * testsuite/ld-arm/arm-elf.exp: Update.
+       * testsuite/ld-arm/tls-gdesc-neg.d: New test.
+       * testsuite/ld-arm/tls-gdesc-neg.s: New test.
+
 2019-09-23  Nick Alcock  <nick.alcock@oracle.com>
 
        * configure.ac (TESTCTFLIB): Set to the .so or .a, like TESTBFDLIB.
index 72036785270a0ce79f314772737b57969b894fc9..118aa642d1b7058c7136ee73d4fc7c46badd9bf3 100644 (file)
@@ -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 (file)
index 0000000..4bbd012
--- /dev/null
@@ -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 (file)
index 0000000..78ec32f
--- /dev/null
@@ -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