This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH][AArch64/bfd] 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.
(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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]