Mark all weak aliases for copy relocations

bfd/
	PR ld/25458
	* elflink.c (_bfd_elf_gc_mark_rsec): Mark all weak aliases.
ld/
	PR ld/25458
	* testsuite/ld-elf/pr25458.map: New file.
	* testsuite/ld-elf/pr25458.rd: Likewise.
	* testsuite/ld-elf/pr25458a.s: Likewise.
	* testsuite/ld-elf/pr25458b.s: Likewise.
	* testsuite/ld-elf/shared.exp: Run PR ld/25458 test.
This commit is contained in:
Alan Modra 2020-01-27 10:27:42 +10:30
parent 27ee3a66bf
commit 3024a17ae0
8 changed files with 90 additions and 7 deletions

View File

@ -1,3 +1,9 @@
2020-01-27 H.J. Lu <hongjiu.lu@intel.com>
Alan Modra <amodra@gmail.com>
PR ld/25458
* elflink.c (_bfd_elf_gc_mark_rsec): Mark all weak aliases.
2020-01-24 Jim Wilson <jimw@sifive.com>
* elfxx-riscv.c (riscv_get_prefix_class): Format s case like others.

View File

@ -13123,7 +13123,7 @@ _bfd_elf_gc_mark_rsec (struct bfd_link_info *info, asection *sec,
bfd_boolean *start_stop)
{
unsigned long r_symndx;
struct elf_link_hash_entry *h;
struct elf_link_hash_entry *h, *hw;
r_symndx = cookie->rel->r_info >> cookie->r_sym_shift;
if (r_symndx == STN_UNDEF)
@ -13143,12 +13143,16 @@ _bfd_elf_gc_mark_rsec (struct bfd_link_info *info, asection *sec,
|| h->root.type == bfd_link_hash_warning)
h = (struct elf_link_hash_entry *) h->root.u.i.link;
h->mark = 1;
/* If this symbol is weak and there is a non-weak definition, we
keep the non-weak definition because many backends put
dynamic reloc info on the non-weak definition for code
handling copy relocs. */
if (h->is_weakalias)
weakdef (h)->mark = 1;
/* Keep all aliases of the symbol too. If an object symbol
needs to be copied into .dynbss then all of its aliases
should be present as dynamic symbols, not just the one used
on the copy relocation. */
hw = h;
while (hw->is_weakalias)
{
hw = hw->u.alias;
hw->mark = 1;
}
if (start_stop != NULL)
{

View File

@ -1,3 +1,13 @@
2020-01-27 H.J. Lu <hongjiu.lu@intel.com>
Alan Modra <amodra@gmail.com>
PR ld/25458
* testsuite/ld-elf/pr25458.map: New file.
* testsuite/ld-elf/pr25458.rd: Likewise.
* testsuite/ld-elf/pr25458a.s: Likewise.
* testsuite/ld-elf/pr25458b.s: Likewise.
* testsuite/ld-elf/shared.exp: Run PR ld/25458 test.
2020-01-22 H.J. Lu <hongjiu.lu@intel.com>
PR ld/25416

View File

@ -0,0 +1,4 @@
FOO {
global:
__environ; _environ; environ;
};

View File

@ -0,0 +1,10 @@
#...
Symbol table '\.dynsym' contains [0-9]+ entries:
+Num: +Value +Size Type +Bind +Vis +Ndx Name
#...
+[0-9]+: [0-9a-f]+ +(4|8)+ OBJECT +(WEAK|GLOBAL) +DEFAULT +[0-9]+ _*environ@FOO \(2\)
#...
+[0-9]+: [0-9a-f]+ +(4|8)+ OBJECT +(WEAK|GLOBAL) +DEFAULT +[0-9]+ _*environ@FOO \(2\)
#...
+[0-9]+: [0-9a-f]+ +(4|8)+ OBJECT +(WEAK|GLOBAL) +DEFAULT +[0-9]+ _*environ@FOO \(2\)
#pass

View File

@ -0,0 +1,6 @@
.text
.globl _start
.type _start, %function
_start:
.dc.a environ
.size _start, .-_start

View File

@ -0,0 +1,11 @@
.data
.globl __environ
.type __environ,%object
__environ:
.dc.a 0
.size __environ, .-__environ
.weak _environ
.globl _environ
.set _environ, __environ
.weak environ
.set environ, __environ

View File

@ -337,6 +337,38 @@ if { [check_gc_sections_available] } {
"pr22150" \
] \
]
switch -glob $target_triplet {
# exclude targets that don't support copy relocs
bfin-*-* { }
frv-*-* { }
lm32-*-* { }
mips*-*-* { }
tic6x-*-* { }
xtensa-*-* { }
default {
run_ld_link_tests [list \
[list \
"Build pr25458.so" \
"$LFLAGS -shared --version-script=pr25458.map" \
"" \
"$AFLAGS_PIC" \
{pr25458b.s} \
{} \
"pr25458.so" \
] \
[list \
"Build pr25458" \
"$LFLAGS -e _start --gc-sections" \
"tmpdir/pr25458.so" \
"$AFLAGS_PIC" \
{pr25458a.s} \
{{readelf {--dyn-sym --wide} pr25458.rd}} \
"pr25458" \
] \
]
}
}
}
set ASFLAGS $old_ASFLAGS