mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
f8745e1cd1
This is a regression for the corner case of a hidden symbol in a PIC/PIE binary which is subject to both a new-style GOTDATA relocation and an old-style GOT relocation. In this case, depending on the link order, the R_SPARC_RELATIVE dynamic relocation for the GOT slot needed because of the old-style relocation can be replaced with R_SPARC_NONE coming from the GOTDATA relocation. The fix simply records whether an old-style GOT relocation is seen for a symbol and prevents the R_SPARC_NONE from being generated in this case. bfd/ * elfxx-sparc.c (struct _bfd_sparc_elf_link_hash_entry): Add new flag has_old_style_got_reloc. (_bfd_sparc_elf_check_relocs) <GOT relocations>: Set it for old-style relocations. Fix a couple of long lines. (_bfd_sparc_elf_relocate_section) <R_SPARC_GOTDATA_OP>: Do not generate a R_SPARC_NONE for the GOT slot if the symbol is also subject to old-style GOT relocations. ld/ * testsuite/ld-sparc/sparc.exp: Add test for mixed GOTDATA/GOT relocs. * testsuite/ld-sparc/gotop-hidden.c: New file. * testsuite/ld-sparc/got-hidden32.s: Likewise. * testsuite/ld-sparc/got-hidden64.s: Likewise. * testsuite/ld-sparc/pass.out: Likewise.
19 lines
319 B
ArmAsm
19 lines
319 B
ArmAsm
.text
|
|
.LLGETPC0:
|
|
retl
|
|
add %o7, %l7, %l7
|
|
.global foo
|
|
.type foo, #function
|
|
.proc 04
|
|
foo:
|
|
save %sp, -104, %sp
|
|
sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %l7
|
|
call .LLGETPC0
|
|
add %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7
|
|
sethi %hi(var), %g1
|
|
or %g1, %lo(var), %g1
|
|
ld [%l7+%g1], %g1
|
|
ld [%g1], %i0
|
|
ret
|
|
restore
|