From c955de363b91edba8a92877f97b1be68357d9582 Mon Sep 17 00:00:00 2001 From: Will Newton Date: Fri, 14 Mar 2014 11:45:32 +0000 Subject: [PATCH] bfd/elfnn-aarch64.c: Fix calculation of DT_RELASZ 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-25 Will Newton * 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-25 Will Newton * ld-aarch64/aarch64-elf.exp: Add relasz dump test. * ld-aarch64/relasz.d: New file. * ld-aarch64/relasz.s: Likewise. --- bfd/ChangeLog | 6 ++++++ bfd/elfnn-aarch64.c | 4 ++-- ld/testsuite/ChangeLog | 6 ++++++ ld/testsuite/ld-aarch64/aarch64-elf.exp | 2 ++ ld/testsuite/ld-aarch64/relasz.d | 18 ++++++++++++++++++ ld/testsuite/ld-aarch64/relasz.s | 9 +++++++++ 6 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 ld/testsuite/ld-aarch64/relasz.d create mode 100644 ld/testsuite/ld-aarch64/relasz.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index c60d19d6e92..c719d24140c 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2014-03-25 Will Newton + + * 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. + 2014-03-20 Will Newton PR ld/16715 diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index c2adcc92b00..638938d880a 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/ChangeLog b/ld/testsuite/ChangeLog index c83b4e15b97..d2002777c35 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2014-03-25 Will Newton + + * ld-aarch64/aarch64-elf.exp: Add relasz dump test. + * ld-aarch64/relasz.d: New file. + * ld-aarch64/relasz.s: Likewise. + 2014-03-20 Richard Sandiford * ld-elf/merge.d: Remove MIPS XFAIL. diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp index 32cf73a7e76..845ea202b4e 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 00000000000..5cc5595f195 --- /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 00000000000..8c7f891599b --- /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 -- 2.30.2