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]

Re: [PATCH][AArch64/bfd] Enable elf_backend_rela_normal for AArch64



On 05/07/14 00:04, Alan Modra wrote:
On Fri, Jul 04, 2014 at 06:15:08PM +0100, Jiong Wang wrote:
bfd/
   * elfnn-aarch64.c (elf_backend_rela_normal): Set to 1.
This patch will break ld -r, since you will be adjusting relocs
against section symbols twice.  The following code in elfnn-aarch64.c
needs adjusting too.

       if (info->relocatable)
	{
	  /* This is a relocatable link.  We don't have to change
	     anything, unless the reloc is against a section symbol,
	     in which case we have to adjust according to where the
	     section symbol winds up in the output section.  */
	  if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
	    rel->r_addend += sec->output_offset;
	  continue;
	}
thanks very much for pointing this out.

below is updated patch which removes the redundant adjustment.

OK for trunk?

thanks.

Jiong

diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
index d917c7e..1b99bd4 100644
--- a/bfd/elfnn-aarch64.c
+++ b/bfd/elfnn-aarch64.c
@@ -4157,15 +4157,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
 					 rel, 1, relend, howto, 0, contents);

       if (info->relocatable)
-	{
-	  /* This is a relocatable link.  We don't have to change
-	     anything, unless the reloc is against a section symbol,
-	     in which case we have to adjust according to where the
-	     section symbol winds up in the output section.  */
-	  if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
-	    rel->r_addend += sec->output_offset;
-	  continue;
-	}
+	continue;

       if (h != NULL)
 	name = h->root.root.string;
@@ -7290,6 +7282,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..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

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