aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorJiong Wang <jiong.wang@arm.com>2014-07-08 09:29:06 +0100
committerJiong Wang <jiong.wang@arm.com>2014-07-08 09:29:06 +0100
commit2e0488d33f8abbbc5bec214e1723d07048d7afcc (patch)
treea08805baf393f3a45f3b5d4f6afd6ce6774a1b4c /ld
parent1f267ae3d18c165f8b4327aa423b909eae92f4d6 (diff)
downloadgdb-2e0488d33f8abbbc5bec214e1723d07048d7afcc.zip
gdb-2e0488d33f8abbbc5bec214e1723d07048d7afcc.tar.gz
gdb-2e0488d33f8abbbc5bec214e1723d07048d7afcc.tar.bz2
Enable elf_backend_rela_normal for AArch64
If we are generating non-relocatable object and --emit-relocs specified, aarch64 ld is actually generating wrong addend for rela entry when relocate against local symbol. for example, for simple testcase foo.c === const char * const a = "foo"; const char * foo () { return a; } bar.c === const char * const b = "bar"; const char * bar () { return b; } aarch64-none-linux-gnu-ld --emit-relocs -o x.o foo.o bar.o aarch64-none-linux-gnu-readelf -r x.o ... R_AARCH64_ADR_PRE 0000000000400018 .rodata + 0 ... R_AARCH64_ADD_ABS 0000000000400018 .rodata + 0 ... R_AARCH64_ADR_PRE 0000000000400018 .rodata + 0 ... R_AARCH64_ADD_ABS 0000000000400018 .rodata + 0 while it should be: ... R_AARCH64_ADR_PRE 0000000000400018 .rodata + 0 ... R_AARCH64_ADD_ABS 0000000000400018 .rodata + 0 ... R_AARCH64_ADR_PRE 0000000000400018 .rodata + 10 ... R_AARCH64_ADD_ABS 0000000000400018 .rodata + 10 bfd generic code could actually handle this properly, but only when elf_backend_rela_normal set to '1'. this patch enable this and remove those target specific hack. bfd/ * elfnn-aarch64.c (elf_backend_rela_normal): Set to 1. (elfNN_aarch64_relocate_section): Remove duplicated addend adjustment when info->relocatable be true. ld/testsuite/ * ld-aarch64/emit-relocs-local-addend-bar.s: * New source file. * ld-aarch64/emit-relocs-local-addend-foo.s: * Likewise. * ld-aarch64/emit-relocs-local-addend.d: * New testcase. * ld-aarch64/local-addend-r.d: Likewise.
Diffstat (limited to 'ld')
-rw-r--r--ld/testsuite/ChangeLog7
-rw-r--r--ld/testsuite/ld-aarch64/aarch64-elf.exp4
-rw-r--r--ld/testsuite/ld-aarch64/emit-relocs-local-addend-bar.s19
-rw-r--r--ld/testsuite/ld-aarch64/emit-relocs-local-addend-foo.s20
-rw-r--r--ld/testsuite/ld-aarch64/emit-relocs-local-addend.d16
-rw-r--r--ld/testsuite/ld-aarch64/local-addend-r.d16
6 files changed, 82 insertions, 0 deletions
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 50a1b8a..bbef087 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2014-07-08 Jiong Wang <jiong.wang@arm.com>
+
+ * ld-aarch64/emit-relocs-local-addend-bar.s: New source file.
+ * ld-aarch64/emit-relocs-local-addend-foo.s: Likewise.
+ * ld-aarch64/emit-relocs-local-addend.d: New testcase.
+ * ld-aarch64/local-addend-r.d: Likewise.
+
2014-07-08 Alan Modra <amodra@gmail.com>
PR 17112
diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp
index 845ea20..36babf3 100644
--- a/ld/testsuite/ld-aarch64/aarch64-elf.exp
+++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp
@@ -87,6 +87,10 @@ run_dump_test "emit-relocs-309-low-bad"
run_dump_test "emit-relocs-311"
run_dump_test "emit-relocs-312"
+# test addend correctness when --emit-relocs specified for non-relocatable obj.
+run_dump_test "emit-relocs-local-addend"
+# test addend correctness when -r specified.
+run_dump_test "local-addend-r"
run_dump_test "limit-b"
run_dump_test "limit-bl"
diff --git a/ld/testsuite/ld-aarch64/emit-relocs-local-addend-bar.s b/ld/testsuite/ld-aarch64/emit-relocs-local-addend-bar.s
new file mode 100644
index 0000000..ab8b0fb
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/emit-relocs-local-addend-bar.s
@@ -0,0 +1,19 @@
+ .global b
+ .section .rodata
+ .align 3
+.LC0:
+ .string "bar"
+ .align 3
+ .type b, %object
+ .size b, 8
+b:
+ .xword .LC0
+ .text
+ .align 2
+ .global bar
+ .type bar, %function
+bar:
+ adrp x0, .LC0
+ add x0, x0, :lo12:.LC0
+ ret
+ .size bar, .-bar
diff --git a/ld/testsuite/ld-aarch64/emit-relocs-local-addend-foo.s b/ld/testsuite/ld-aarch64/emit-relocs-local-addend-foo.s
new file mode 100644
index 0000000..497eef7
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/emit-relocs-local-addend-foo.s
@@ -0,0 +1,20 @@
+ .cpu generic+fp+simd
+ .global a
+ .section .rodata
+ .align 3
+.LC0:
+ .string "foo"
+ .align 3
+ .type a, %object
+ .size a, 8
+a:
+ .xword .LC0
+ .text
+ .align 2
+ .global foo
+ .type foo, %function
+foo:
+ adrp x0, .LC0
+ add x0, x0, :lo12:.LC0
+ ret
+ .size foo, .-foo
diff --git a/ld/testsuite/ld-aarch64/emit-relocs-local-addend.d b/ld/testsuite/ld-aarch64/emit-relocs-local-addend.d
new file mode 100644
index 0000000..1739e64
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/emit-relocs-local-addend.d
@@ -0,0 +1,16 @@
+#source: emit-relocs-local-addend-foo.s
+#source: emit-relocs-local-addend-bar.s
+#ld: -e0 --emit-relocs
+#readelf: -r
+
+Relocation section '\.rela\.text' at offset 0x102f8 contains 4 entries:
+ Offset Info Type Sym\. Value Sym\. Name \+ Addend
+000000400000 000200000113 R_AARCH64_ADR_PRE 0000000000400018 \.rodata \+ 0
+000000400004 000200000115 R_AARCH64_ADD_ABS 0000000000400018 \.rodata \+ 0
+00000040000c 000200000113 R_AARCH64_ADR_PRE 0000000000400018 \.rodata \+ 10
+000000400010 000200000115 R_AARCH64_ADD_ABS 0000000000400018 \.rodata \+ 10
+
+Relocation section '\.rela\.rodata' at offset 0x10358 contains 2 entries:
+ Offset Info Type Sym\. Value Sym. Name \+ Addend
+000000400020 000200000101 R_AARCH64_ABS64 0000000000400018 \.rodata \+ 0
+000000400030 000200000101 R_AARCH64_ABS64 0000000000400018 \.rodata \+ 10
diff --git a/ld/testsuite/ld-aarch64/local-addend-r.d b/ld/testsuite/ld-aarch64/local-addend-r.d
new file mode 100644
index 0000000..c8c2777
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/local-addend-r.d
@@ -0,0 +1,16 @@
+#source: emit-relocs-local-addend-foo.s
+#source: emit-relocs-local-addend-bar.s
+#ld: -e0 -r
+#readelf: -r
+
+Relocation section '\.rela\.text' at offset 0x338 contains 4 entries:
+ Offset Info Type Sym\. Value Sym\. Name \+ Addend
+000000000000 000200000113 R_AARCH64_ADR_PRE 0000000000000000 \.rodata \+ 0
+000000000004 000200000115 R_AARCH64_ADD_ABS 0000000000000000 \.rodata \+ 0
+00000000000c 000200000113 R_AARCH64_ADR_PRE 0000000000000000 \.rodata \+ 10
+000000000010 000200000115 R_AARCH64_ADD_ABS 0000000000000000 \.rodata \+ 10
+
+Relocation section '\.rela\.rodata' at offset 0x398 contains 2 entries:
+ Offset Info Type Sym\. Value Sym. Name \+ Addend
+000000000008 000200000101 R_AARCH64_ABS64 0000000000000000 \.rodata \+ 0
+000000000018 000200000101 R_AARCH64_ABS64 0000000000000000 \.rodata \+ 10