From 3024a17ae029ec7f55b498e99ddd6238e22fe565 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 27 Jan 2020 10:27:42 +1030 Subject: [PATCH] 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. --- bfd/ChangeLog | 6 ++++++ bfd/elflink.c | 18 +++++++++++------- ld/ChangeLog | 10 ++++++++++ ld/testsuite/ld-elf/pr25458.map | 4 ++++ ld/testsuite/ld-elf/pr25458.rd | 10 ++++++++++ ld/testsuite/ld-elf/pr25458a.s | 6 ++++++ ld/testsuite/ld-elf/pr25458b.s | 11 +++++++++++ ld/testsuite/ld-elf/shared.exp | 32 ++++++++++++++++++++++++++++++++ 8 files changed, 90 insertions(+), 7 deletions(-) create mode 100644 ld/testsuite/ld-elf/pr25458.map create mode 100644 ld/testsuite/ld-elf/pr25458.rd create mode 100644 ld/testsuite/ld-elf/pr25458a.s create mode 100644 ld/testsuite/ld-elf/pr25458b.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 558e11eda34..3deba430f13 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2020-01-27 H.J. Lu + Alan Modra + + PR ld/25458 + * elflink.c (_bfd_elf_gc_mark_rsec): Mark all weak aliases. + 2020-01-24 Jim Wilson * elfxx-riscv.c (riscv_get_prefix_class): Format s case like others. diff --git a/bfd/elflink.c b/bfd/elflink.c index 300be3f7437..5217528a79b 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 f71c13564d9..b39c8c09b21 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,13 @@ +2020-01-27 H.J. Lu + Alan Modra + + 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 PR ld/25416 diff --git a/ld/testsuite/ld-elf/pr25458.map b/ld/testsuite/ld-elf/pr25458.map new file mode 100644 index 00000000000..5578d1fae72 --- /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 00000000000..d0fc6b9bed7 --- /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 00000000000..59e6af2c192 --- /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 00000000000..ff64cc7584b --- /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 e03906a142d..b1762aff9be 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 -- 2.30.2