PR27451, -z start_stop_gc for powerpc64
authorAlan Modra <amodra@gmail.com>
Tue, 2 Mar 2021 10:55:20 +0000 (21:25 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 2 Mar 2021 11:19:56 +0000 (21:49 +1030)
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
bfd/elf64-ppc.c
ld/ChangeLog
ld/testsuite/ld-powerpc/powerpc.exp
ld/testsuite/ld-powerpc/startstop.d [new file with mode: 0644]
ld/testsuite/ld-powerpc/startstop.r [new file with mode: 0644]
ld/testsuite/ld-powerpc/startstop.s [new file with mode: 0644]

index 44286c2195d15d84cc8e95246d749c7d3614ce11..c4c4fa2647aaf692e0b0706a31130a99a0fedb45 100644 (file)
@@ -1,3 +1,9 @@
+2021-03-02  Alan Modra  <amodra@gmail.com>
+
+       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  <amodra@gmail.com>
 
        * elf64-ppc.c (ppc64_elf_relocate_section): Don't optimise got
index 769fff9bb5c1a1d908aa443c2ba167e785dad86f..ab0e0d33aac8ea1bf404fbb14fb69b094f1fbfdf 100644 (file)
@@ -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
index 2bb97bd28097bcf01160a381d677893b6d368002..d12e537791a8b6144c7983af9f487a05df13122d 100644 (file)
@@ -1,3 +1,10 @@
+2021-03-02  Alan Modra  <amodra@gmail.com>
+
+       * 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  <amodra@gmail.com>
 
        * testsuite/ld-powerpc/weak1.d,
index 8aa0eccfa0e71fd0d74379ea7a773b7f8c398b0c..2ac02b1c02bf4dbfee3efcfd48fe94b132910abe 100644 (file)
@@ -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 (file)
index 0000000..2bf4c73
--- /dev/null
@@ -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 (file)
index 0000000..9a583fb
--- /dev/null
@@ -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 (file)
index 0000000..8e88a72
--- /dev/null
@@ -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
This page took 0.03665 seconds and 4 git commands to generate.