diff options
author | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2019-10-03 19:11:50 +0100 |
---|---|---|
committer | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2019-10-10 12:10:04 +0100 |
commit | 772db4c6beec7c8f4f2550c1f4fe0fb35dc3c7b5 (patch) | |
tree | 611d61b4de8735a5fc2d6b2a831bf9031c8387eb | |
parent | 3115c234629806cb04388fbc535b1792b39a48a0 (diff) | |
download | binutils-772db4c6beec7c8f4f2550c1f4fe0fb35dc3c7b5.tar.gz binutils-772db4c6beec7c8f4f2550c1f4fe0fb35dc3c7b5.tar.bz2 binutils-772db4c6beec7c8f4f2550c1f4fe0fb35dc3c7b5.zip |
[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:
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.
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/elf32-arm.c | 4 | ||||
-rw-r--r-- | ld/ChangeLog | 9 | ||||
-rw-r--r-- | ld/testsuite/ld-arm/arm-elf.exp | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-arm/tls-gdesc-neg.d | 39 | ||||
-rw-r--r-- | ld/testsuite/ld-arm/tls-gdesc-neg.s | 29 |
6 files changed, 91 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index cb126d36298..ebe81f31cc6 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2019-10-10 Szabolcs Nagy <szabolcs.nagy@arm.com> + + Apply from master + 2019-10-04 Szabolcs Nagy <szabolcs.nagy@arm.com> + PR ld/25062 + * elf32-arm.c (elf32_arm_final_link_relocate): Sign extend data. + 2019-10-09 Alan Modra <amodra@gmail.com> Apply from master diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index b675fc60c1a..ff9a5ef604d 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -12024,9 +12024,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/ChangeLog b/ld/ChangeLog index a77916584a2..3a553de7cfd 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +2019-10-10 Szabolcs Nagy <szabolcs.nagy@arm.com> + + Apply from master + 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-10-09 Alan Modra <amodra@gmail.com> Apply from master diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp index 72036785270..118aa642d1b 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 00000000000..4bbd0124e75 --- /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 00000000000..78ec32f5936 --- /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 |