This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH][AArch64/bfd] Enable elf_backend_rela_normal for AArch64
- From: Jiong Wang <jiong dot wang at arm dot com>
- To: "binutils at sourceware dot org" <binutils at sourceware dot org>
- Cc: Alan Modra <amodra at gmail dot com>
- Date: Fri, 04 Jul 2014 18:15:08 +0100
- Subject: [PATCH][AArch64/bfd] Enable elf_backend_rela_normal for AArch64
- Authentication-results: sourceware.org; auth=none
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.
(I verified that mips and sparc are generating wrong addend under this situation also)
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-gcc xy.c -c
aarch64-none-linux-gnu-gcc xx.c -c
aarch64-none-linux-gnu-ld --emit-relocs -o xo.o xx.o xy.o
aarch64-none-linux-gnu-readelf -r xo.o
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 + 0
000000400010 000200000115 R_AARCH64_ADD_ABS 0000000000400018 .rodata + 0
while it should be:
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
bfd generic code will actually handle this situation, but only when elf_backend_rela_normal set to '1'.
this patch fix this, so that rela addend handled correctly by generic code on aarch64 target.
no regression on aarch64 bare metal full test.
ok for trunk ?
thanks.
bfd/
* elfnn-aarch64.c (elf_backend_rela_normal): Set to 1.
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.
diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
index d917c7e..2631c31 100644
--- a/bfd/elfnn-aarch64.c
+++ b/bfd/elfnn-aarch64.c
@@ -7290,6 +7290,7 @@ const struct elf_size_info elfNN_aarch64_size_info =
#define elf_backend_may_use_rel_p 0
#define elf_backend_may_use_rela_p 1
#define elf_backend_default_use_rela_p 1
+#define elf_backend_rela_normal 1
#define elf_backend_got_header_size (GOT_ENTRY_SIZE * 3)
#define elf_backend_default_execstack 0
diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp
index 845ea20..a6db0a2 100644
--- a/ld/testsuite/ld-aarch64/aarch64-elf.exp
+++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp
@@ -87,6 +87,8 @@ 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"
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