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:
parent
27ee3a66bf
commit
3024a17ae0
@ -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.
|
||||
|
@ -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)
|
||||
{
|
||||
|
10
ld/ChangeLog
10
ld/ChangeLog
@ -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
|
||||
|
4
ld/testsuite/ld-elf/pr25458.map
Normal file
4
ld/testsuite/ld-elf/pr25458.map
Normal file
@ -0,0 +1,4 @@
|
||||
FOO {
|
||||
global:
|
||||
__environ; _environ; environ;
|
||||
};
|
10
ld/testsuite/ld-elf/pr25458.rd
Normal file
10
ld/testsuite/ld-elf/pr25458.rd
Normal 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
|
6
ld/testsuite/ld-elf/pr25458a.s
Normal file
6
ld/testsuite/ld-elf/pr25458a.s
Normal file
@ -0,0 +1,6 @@
|
||||
.text
|
||||
.globl _start
|
||||
.type _start, %function
|
||||
_start:
|
||||
.dc.a environ
|
||||
.size _start, .-_start
|
11
ld/testsuite/ld-elf/pr25458b.s
Normal file
11
ld/testsuite/ld-elf/pr25458b.s
Normal 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
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user