diff options
author | Alan Modra <amodra@gmail.com> | 2020-01-27 10:27:42 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2020-01-27 10:53:00 +1030 |
commit | 3024a17ae029ec7f55b498e99ddd6238e22fe565 (patch) | |
tree | 554320c69f99bb0a36f8301e9bcfe539873f6f20 | |
parent | 27ee3a66bfba776a2af8e9e1248e6a65c31e25a3 (diff) | |
download | gdb-3024a17ae029ec7f55b498e99ddd6238e22fe565.zip gdb-3024a17ae029ec7f55b498e99ddd6238e22fe565.tar.gz gdb-3024a17ae029ec7f55b498e99ddd6238e22fe565.tar.bz2 |
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.
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elflink.c | 18 | ||||
-rw-r--r-- | ld/ChangeLog | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr25458.map | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr25458.rd | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr25458a.s | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr25458b.s | 11 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/shared.exp | 32 |
8 files changed, 90 insertions, 7 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 558e11e..3deba43 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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. diff --git a/bfd/elflink.c b/bfd/elflink.c index 300be3f..5217528 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -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) { diff --git a/ld/ChangeLog b/ld/ChangeLog index f71c135..b39c8c0 100644 --- a/ld/ChangeLog +++ b/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 diff --git a/ld/testsuite/ld-elf/pr25458.map b/ld/testsuite/ld-elf/pr25458.map new file mode 100644 index 0000000..5578d1f --- /dev/null +++ b/ld/testsuite/ld-elf/pr25458.map @@ -0,0 +1,4 @@ +FOO { +global: + __environ; _environ; environ; +}; diff --git a/ld/testsuite/ld-elf/pr25458.rd b/ld/testsuite/ld-elf/pr25458.rd new file mode 100644 index 0000000..d0fc6b9 --- /dev/null +++ b/ld/testsuite/ld-elf/pr25458.rd @@ -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 diff --git a/ld/testsuite/ld-elf/pr25458a.s b/ld/testsuite/ld-elf/pr25458a.s new file mode 100644 index 0000000..59e6af2 --- /dev/null +++ b/ld/testsuite/ld-elf/pr25458a.s @@ -0,0 +1,6 @@ + .text + .globl _start + .type _start, %function +_start: + .dc.a environ + .size _start, .-_start diff --git a/ld/testsuite/ld-elf/pr25458b.s b/ld/testsuite/ld-elf/pr25458b.s new file mode 100644 index 0000000..ff64cc7 --- /dev/null +++ b/ld/testsuite/ld-elf/pr25458b.s @@ -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 diff --git a/ld/testsuite/ld-elf/shared.exp b/ld/testsuite/ld-elf/shared.exp index e03906a..b1762af 100644 --- a/ld/testsuite/ld-elf/shared.exp +++ b/ld/testsuite/ld-elf/shared.exp @@ -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 |