From b80e421f9136117389be9d96210b35b3d562d725 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 2 Mar 2021 21:25:20 +1030 Subject: [PATCH] PR27451, -z start_stop_gc for powerpc64 PowerPC64 has its own gc_mark_dynamic_ref. bfd/ PR 27451 * elf64-ppc.c (ppc64_elf_gc_mark_dynamic_ref): Ignore synthesized linker defined start/stop symbols when start_stop_gc. ld/ * testsuite/ld-powerpc/startstop.d, * testsuite/ld-powerpc/startstop.r, * testsuite/ld-powerpc/startstop.s: New test. * testsuite/ld-powerpc/powerpc.exp: Run it. --- bfd/ChangeLog | 6 ++++++ bfd/elf64-ppc.c | 3 +++ ld/ChangeLog | 7 +++++++ ld/testsuite/ld-powerpc/powerpc.exp | 3 +++ ld/testsuite/ld-powerpc/startstop.d | 10 ++++++++++ ld/testsuite/ld-powerpc/startstop.r | 2 ++ ld/testsuite/ld-powerpc/startstop.s | 16 ++++++++++++++++ 7 files changed, 47 insertions(+) create mode 100644 ld/testsuite/ld-powerpc/startstop.d create mode 100644 ld/testsuite/ld-powerpc/startstop.r create mode 100644 ld/testsuite/ld-powerpc/startstop.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 44286c2195d..c4c4fa2647a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2021-03-02 Alan Modra + + PR 27451 + * elf64-ppc.c (ppc64_elf_gc_mark_dynamic_ref): Ignore synthesized + linker defined start/stop symbols when start_stop_gc. + 2021-03-02 Alan Modra * elf64-ppc.c (ppc64_elf_relocate_section): Don't optimise got diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 769fff9bb5c..ab0e0d33aac 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -5749,6 +5749,9 @@ ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf) if ((eh->elf.root.type == bfd_link_hash_defined || eh->elf.root.type == bfd_link_hash_defweak) + && (!eh->elf.start_stop + || eh->elf.root.ldscript_def + || !info->start_stop_gc) && ((eh->elf.ref_dynamic && !eh->elf.forced_local) || ((eh->elf.def_regular || ELF_COMMON_DEF_P (&eh->elf)) && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL diff --git a/ld/ChangeLog b/ld/ChangeLog index 2bb97bd2809..d12e537791a 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2021-03-02 Alan Modra + + * testsuite/ld-powerpc/startstop.d, + * testsuite/ld-powerpc/startstop.r, + * testsuite/ld-powerpc/startstop.s: New test. + * testsuite/ld-powerpc/powerpc.exp: Run it. + 2021-03-02 Alan Modra * testsuite/ld-powerpc/weak1.d, diff --git a/ld/testsuite/ld-powerpc/powerpc.exp b/ld/testsuite/ld-powerpc/powerpc.exp index 8aa0eccfa0e..2ac02b1c02b 100644 --- a/ld/testsuite/ld-powerpc/powerpc.exp +++ b/ld/testsuite/ld-powerpc/powerpc.exp @@ -350,6 +350,9 @@ set ppc64elftests { {"weak1.so" "-shared -melf64ppc --hash-style=both" "" "-a64 -mpower10" {weak1.s} {{objdump -d weak1so.d} {readelf {-srW} weak1so.r}} "weak1.so"} + {"startstop" "-shared -melf64ppc --hash-style=sysv --gc-sections -z start-stop-gc" "" + "-a64 -mpower10" {startstop.s} + {{objdump -d startstop.d} {readelf {-rW} startstop.r}} "startstop.so"} } set ppceabitests { diff --git a/ld/testsuite/ld-powerpc/startstop.d b/ld/testsuite/ld-powerpc/startstop.d new file mode 100644 index 00000000000..2bf4c73cbfe --- /dev/null +++ b/ld/testsuite/ld-powerpc/startstop.d @@ -0,0 +1,10 @@ + +.*: file format .* + +Disassembly of section \.text: + +0+140 <_start>: + 140: (04 10 00 01|01 00 10 04) pld r3,66000 + 144: (e4 60 01 d0|d0 01 60 e4) + 148: (04 10 00 01|01 00 10 04) pld r4,65984 + 14c: (e4 80 01 c0|c0 01 80 e4) diff --git a/ld/testsuite/ld-powerpc/startstop.r b/ld/testsuite/ld-powerpc/startstop.r new file mode 100644 index 00000000000..9a583fbfad4 --- /dev/null +++ b/ld/testsuite/ld-powerpc/startstop.r @@ -0,0 +1,2 @@ + +There are no relocations in this file. diff --git a/ld/testsuite/ld-powerpc/startstop.s b/ld/testsuite/ld-powerpc/startstop.s new file mode 100644 index 00000000000..8e88a721578 --- /dev/null +++ b/ld/testsuite/ld-powerpc/startstop.s @@ -0,0 +1,16 @@ + .weak __start_xx + .weak __stop_xx + + .global _start +_start: + pld 3,__start_xx@got@pcrel + pld 4,__stop_xx@got@pcrel + + .section xx,"a",unique,0 + .byte 0 + + .section xx,"a",unique,1 + .byte 1 + + .section xx,"a",unique,2 + .byte 2 -- 2.30.2