aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog11
-rw-r--r--bfd/elf64-aarch64.c16
-rw-r--r--ld/testsuite/ChangeLog6
-rw-r--r--ld/testsuite/ld-aarch64/aarch64-elf.exp1
-rw-r--r--ld/testsuite/ld-aarch64/tlsle-symbol-offset.d11
-rw-r--r--ld/testsuite/ld-aarch64/tlsle-symbol-offset.s17
6 files changed, 54 insertions, 8 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 7033bac..29cb5c6 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,14 @@
+2012-10-16 Sofiane Naci <sofiane.naci@arm.com>
+
+ * elf64-aarch64.c (elf64_aarch64_tls_howto_table): Fix shift value for
+ R_AARCH64_TLSIE_LD_GOTTPREL_PREL19, R_AARCH64_TLSLE_MOVW_TPREL_G2,
+ R_AARCH64_TLSLE_MOVW_TPREL_G1, R_AARCH64_TLSLE_MOVW_TPREL_G1_NC,
+ R_AARCH64_TLSLE_ADD_TPREL_HI12.
+ (elf64_aarch64_tlsdesc_howto_table): Fix shift value for
+ R_AARCH64_TLSDESC_LD64_PREL19 and R_AARCH64_TLSDESC_OFF_G1.
+ (elf64_aarch64_final_link_relocate): Add signed_addend when resolving
+ AARCH64_TLSLE_*_TPREL_* relocations.
+
2012-10-16 Alan Modra <amodra@gmail.com>
* elf32-xtensa.c (free_section_cache): Renamed from
diff --git a/bfd/elf64-aarch64.c b/bfd/elf64-aarch64.c
index 0607b3a..423fb9b 100644
--- a/bfd/elf64-aarch64.c
+++ b/bfd/elf64-aarch64.c
@@ -1076,7 +1076,7 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
FALSE), /* pcrel_offset */
HOWTO (R_AARCH64_TLSIE_LD_GOTTPREL_PREL19, /* type */
- 0, /* rightshift */
+ 2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
21, /* bitsize */
FALSE, /* pc_relative */
@@ -1090,7 +1090,7 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
FALSE), /* pcrel_offset */
HOWTO (R_AARCH64_TLSLE_MOVW_TPREL_G2, /* type */
- 8, /* rightshift */
+ 32, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
FALSE, /* pc_relative */
@@ -1104,7 +1104,7 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
FALSE), /* pcrel_offset */
HOWTO (R_AARCH64_TLSLE_MOVW_TPREL_G1, /* type */
- 4, /* rightshift */
+ 16, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
FALSE, /* pc_relative */
@@ -1118,7 +1118,7 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
FALSE), /* pcrel_offset */
HOWTO (R_AARCH64_TLSLE_MOVW_TPREL_G1_NC, /* type */
- 4, /* rightshift */
+ 16, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
FALSE, /* pc_relative */
@@ -1160,7 +1160,7 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
FALSE), /* pcrel_offset */
HOWTO (R_AARCH64_TLSLE_ADD_TPREL_HI12, /* type */
- 3, /* rightshift */
+ 12, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
FALSE, /* pc_relative */
@@ -1205,7 +1205,7 @@ static reloc_howto_type elf64_aarch64_tls_howto_table[] =
static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] =
{
HOWTO (R_AARCH64_TLSDESC_LD64_PREL19, /* type */
- 0, /* rightshift */
+ 2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
21, /* bitsize */
TRUE, /* pc_relative */
@@ -1279,7 +1279,7 @@ static reloc_howto_type elf64_aarch64_tlsdesc_howto_table[] =
FALSE), /* pcrel_offset */
HOWTO (R_AARCH64_TLSDESC_OFF_G1, /* type */
- 4, /* rightshift */
+ 16, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
FALSE, /* pc_relative */
@@ -4054,7 +4054,7 @@ elf64_aarch64_final_link_relocate (reloc_howto_type *howto,
case R_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
case R_AARCH64_TLSLE_MOVW_TPREL_G2:
value = aarch64_resolve_relocation (r_type, place, value,
- - tpoff_base (info), weak_undef_p);
+ signed_addend - tpoff_base (info), weak_undef_p);
*unresolved_reloc_p = FALSE;
break;
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 8e82961..a27d274 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2012-10-16 Sofiane Naci <sofiane.naci@arm.com>
+
+ * ld-aarch64/tlsle-symbol-offset.s: New file.
+ * ld-aarch64/tlsle-symbol-offset.d: New file.
+ * ld-aarch64/aarch64-elf.exp: Add tlsle-symbol-offset test.
+
2012-10-08 Joe Seymour <jseymour@codesourcery.com>
* ld-scripts/sane1.d: Sort output from nm. Allow for other symbols in
diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp
index 7e5d73e..e85d1db 100644
--- a/ld/testsuite/ld-aarch64/aarch64-elf.exp
+++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp
@@ -108,3 +108,4 @@ run_dump_test "tls-relax-gdesc-ie-2"
run_dump_test "tls-relax-gdesc-le-2"
run_dump_test "tls-relax-ie-le-2"
run_dump_test "tls-relax-ie-le-3"
+run_dump_test "tlsle-symbol-offset"
diff --git a/ld/testsuite/ld-aarch64/tlsle-symbol-offset.d b/ld/testsuite/ld-aarch64/tlsle-symbol-offset.d
new file mode 100644
index 0000000..cf61691
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/tlsle-symbol-offset.d
@@ -0,0 +1,11 @@
+#source: tlsle-symbol-offset.s
+#ld: -shared -T relocs.ld -e0
+#objdump: -dr
+#...
+Disassembly of section .text:
+
+0000000000010000 <.text>:
+ +10000: d53bd040 mrs x0, tpidr_el0
+ +10004: 91400400 add x0, x0, #0x1, lsl #12
+ +10008: 91010000 add x0, x0, #0x40
+ +1000c: d65f03c0 ret
diff --git a/ld/testsuite/ld-aarch64/tlsle-symbol-offset.s b/ld/testsuite/ld-aarch64/tlsle-symbol-offset.s
new file mode 100644
index 0000000..41088ef
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/tlsle-symbol-offset.s
@@ -0,0 +1,17 @@
+ .global p
+ .global a
+ .section .tbss,"awT",%nobits
+p:
+ .zero 4096
+a:
+ .zero 52
+
+ .text
+
+# Compute the address of an integer within structure a, padded
+# by an array of size 48
+
+ mrs x0, tpidr_el0
+ add x0, x0, #:tprel_hi12:a+48
+ add x0, x0, #:tprel_lo12_nc:a+48
+ ret