[PATCH v2] bfd/elfnn-aarch64.c: Fix calculation of DT_RELASZ

Will Newton will.newton@linaro.org
Thu Mar 20 15:46:00 GMT 2014


The current code subtracts the size of the output section containing
relplt from RELASZ. In some cases this will be the same output
section as the dynamic relocs causing a value of zero to be output.
Calculating the size from input sections seems to make more sense.

bfd/ChangeLog:

2014-03-20  Will Newton  <will.newton@linaro.org>

	 * elfnn-aarch64.c (elfNN_aarch64_finish_dynamic_sections):
	 Set value of DT_PLTRELSZ and DT_RELASZ based on the size
	 of input sections rather than output sections.

ld/testsuite/ChangeLog:

2014-03-20  Will Newton  <will.newton@linaro.org>

	 * ld-aarch64/aarch64-elf.exp: Add relasz dump test.
	 * ld-aarch64/relasz.d: New file.
	 * ld-aarch64/relasz.s: Likewise.
---
 bfd/elfnn-aarch64.c                     |  4 ++--
 ld/testsuite/ld-aarch64/aarch64-elf.exp |  2 ++
 ld/testsuite/ld-aarch64/relasz.d        | 18 ++++++++++++++++++
 ld/testsuite/ld-aarch64/relasz.s        |  9 +++++++++
 4 files changed, 31 insertions(+), 2 deletions(-)
 create mode 100644 ld/testsuite/ld-aarch64/relasz.d
 create mode 100644 ld/testsuite/ld-aarch64/relasz.s

Changes in v2:
 - Add testcase

diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
index c2adcc9..638938d 100644
--- a/bfd/elfnn-aarch64.c
+++ b/bfd/elfnn-aarch64.c
@@ -6993,7 +6993,7 @@ elfNN_aarch64_finish_dynamic_sections (bfd *output_bfd,
 	      break;
 
 	    case DT_PLTRELSZ:
-	      s = htab->root.srelplt->output_section;
+	      s = htab->root.srelplt;
 	      dyn.d_un.d_val = s->size;
 	      break;
 
@@ -7007,7 +7007,7 @@ elfNN_aarch64_finish_dynamic_sections (bfd *output_bfd,
 		 about changing the DT_RELA entry.  */
 	      if (htab->root.srelplt != NULL)
 		{
-		  s = htab->root.srelplt->output_section;
+		  s = htab->root.srelplt;
 		  dyn.d_un.d_val -= s->size;
 		}
 	      break;
diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp
index 32cf73a..845ea20 100644
--- a/ld/testsuite/ld-aarch64/aarch64-elf.exp
+++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp
@@ -157,3 +157,5 @@ run_dump_test "ifunc-19b"
 run_dump_test "ifunc-20"
 run_dump_test "ifunc-21"
 run_dump_test "ifunc-22"
+
+run_dump_test "relasz"
diff --git a/ld/testsuite/ld-aarch64/relasz.d b/ld/testsuite/ld-aarch64/relasz.d
new file mode 100644
index 0000000..5cc5595
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/relasz.d
@@ -0,0 +1,18 @@
+#source: relasz.s
+#ld: -shared -Taarch64.ld
+#readelf: -d
+# Check that the RELASZ section has the correct size even if we are
+# using a non-default linker script that merges .rela.dyn and .rela.plt
+# in the output.
+
+Dynamic section at offset 0x[0-9a-f]+ contains 9 entries:
+  Tag        Type                         Name/Value
+ 0x0000000000000004 \(HASH\)               0x[0-9a-f]+
+ 0x0000000000000005 \(STRTAB\)             0x[0-9a-f]+
+ 0x0000000000000006 \(SYMTAB\)             0x[0-9a-f]+
+ 0x000000000000000a \(STRSZ\)              [0-9]+ \(bytes\)
+ 0x000000000000000b \(SYMENT\)             [0-9]+ \(bytes\)
+ 0x0000000000000007 \(RELA\)               0x[0-9a-f]+
+ 0x0000000000000008 \(RELASZ\)             24 \(bytes\)
+ 0x0000000000000009 \(RELAENT\)            24 \(bytes\)
+ 0x0000000000000000 \(NULL\)               0x0
diff --git a/ld/testsuite/ld-aarch64/relasz.s b/ld/testsuite/ld-aarch64/relasz.s
new file mode 100644
index 0000000..8c7f891
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/relasz.s
@@ -0,0 +1,9 @@
+	.text
+	.global	func
+	.type	func, %function
+func:
+	adrp	x0, :got:foo
+	ldr	x0, [x0, #:got_lo12:foo]
+	ldr	w0, [x0]
+	ret
+	.size	func, .-func
-- 
1.8.1.4



More information about the Binutils mailing list