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 <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-25 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.
This commit is contained in:
parent
3e60bf4df8
commit
c955de363b
6 changed files with 43 additions and 2 deletions
|
@ -1,3 +1,9 @@
|
|||
2014-03-25 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.
|
||||
|
||||
2014-03-20 Will Newton <will.newton@linaro.org>
|
||||
|
||||
PR ld/16715
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2014-03-25 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.
|
||||
|
||||
2014-03-20 Richard Sandiford <rdsandiford@googlemail.com>
|
||||
|
||||
* ld-elf/merge.d: Remove MIPS XFAIL.
|
||||
|
|
|
@ -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"
|
||||
|
|
18
ld/testsuite/ld-aarch64/relasz.d
Normal file
18
ld/testsuite/ld-aarch64/relasz.d
Normal file
|
@ -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
|
9
ld/testsuite/ld-aarch64/relasz.s
Normal file
9
ld/testsuite/ld-aarch64/relasz.s
Normal file
|
@ -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
|
Loading…
Reference in a new issue