PowerPC64 undefined weak visibility vs GOT optimisation
authorAlan Modra <amodra@gmail.com>
Tue, 2 Mar 2021 10:52:31 +0000 (21:22 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 2 Mar 2021 11:17:42 +0000 (21:47 +1030)
Undefined weak symbols with non-default visibility are seen as local
by SYMBOL_REFERENCES_LOCAL.  This stops a got indirect to relative
optimisation for them, so that pies and dlls don't get non-zero values
when loading somewhere other than the address they are linked at
(which always happens).  The optimisation could be allowed for pdes,
but I thought it best not to allow it there too.

bfd/
* elf64-ppc.c (ppc64_elf_relocate_section): Don't optimise got
indirect to pc-relative or toc-relative for undefined symbols.
ld/
* testsuite/ld-powerpc/weak1.d,
* testsuite/ld-powerpc/weak1.r,
* testsuite/ld-powerpc/weak1.s,
* testsuite/ld-powerpc/weak1so.d,
* testsuite/ld-powerpc/weak1so.r: New tests.
* testsuite/ld-powerpc/powerpc.exp: Run them.

bfd/ChangeLog
bfd/elf64-ppc.c
ld/ChangeLog
ld/testsuite/ld-powerpc/powerpc.exp
ld/testsuite/ld-powerpc/weak1.d [new file with mode: 0644]
ld/testsuite/ld-powerpc/weak1.r [new file with mode: 0644]
ld/testsuite/ld-powerpc/weak1.s [new file with mode: 0644]
ld/testsuite/ld-powerpc/weak1so.d [new file with mode: 0644]
ld/testsuite/ld-powerpc/weak1so.r [new file with mode: 0644]

index 818f580e359cd92d4bbaac4b2bc3556c6b07de68..44286c2195d15d84cc8e95246d749c7d3614ce11 100644 (file)
@@ -1,3 +1,8 @@
+2021-03-02  Alan Modra  <amodra@gmail.com>
+
+       * elf64-ppc.c (ppc64_elf_relocate_section): Don't optimise got
+       indirect to pc-relative or toc-relative for undefined symbols.
+
 2021-03-01  Alan Modra  <amodra@gmail.com>
            Fangrui Song <maskray@google.com>
 
index dcd427b383157965e04e69341ae14b0a17a5ace9..769fff9bb5c1a1d908aa443c2ba167e785dad86f 100644 (file)
@@ -16081,6 +16081,9 @@ ppc64_elf_relocate_section (bfd *output_bfd,
            break;
          from = TOCstart + htab->sec_info[input_section->id].toc_off;
          if (relocation + addend - from + 0x8000 < 0x10000
+             && sec != NULL
+             && sec->output_section != NULL
+             && !discarded_section (sec)
              && (h == NULL || SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
            {
              insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
@@ -16101,6 +16104,9 @@ ppc64_elf_relocate_section (bfd *output_bfd,
            break;
          from = TOCstart + htab->sec_info[input_section->id].toc_off;
          if (relocation + addend - from + 0x80008000ULL < 0x100000000ULL
+             && sec != NULL
+             && sec->output_section != NULL
+             && !discarded_section (sec)
              && (h == NULL || SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
            {
              insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
@@ -16129,6 +16135,9 @@ ppc64_elf_relocate_section (bfd *output_bfd,
                  + input_section->output_section->vma
                  + input_section->output_offset);
          if (!(relocation - from + (1ULL << 33) < 1ULL << 34
+               && sec != NULL
+               && sec->output_section != NULL
+               && !discarded_section (sec)
                && (h == NULL || SYMBOL_REFERENCES_LOCAL (info, &h->elf))))
            break;
 
index e43f7fa17a60b36bbd566aded34c48a97133808c..2bb97bd28097bcf01160a381d677893b6d368002 100644 (file)
@@ -1,3 +1,12 @@
+2021-03-02  Alan Modra  <amodra@gmail.com>
+
+       * testsuite/ld-powerpc/weak1.d,
+       * testsuite/ld-powerpc/weak1.r,
+       * testsuite/ld-powerpc/weak1.s,
+       * testsuite/ld-powerpc/weak1so.d,
+       * testsuite/ld-powerpc/weak1so.r: New tests.
+       * testsuite/ld-powerpc/powerpc.exp: Run them.
+
 2021-03-01  Hannes Domani  <ssbssa@sourceware.org>
            Nick Clifton  <nickc@redhat.com>
 
index 45485e6c5d10d58f2200fe369dc2318f963e5803..8aa0eccfa0e71fd0d74379ea7a773b7f8c398b0c 100644 (file)
@@ -344,6 +344,12 @@ set ppc64elftests {
     {"group3" "-melf64ppc -e foo" "" "-a64" {group3.s group2.s group1.s}
        {{objdump {-d} group2.d}
         {readelf {-s} group3.sym}} "group3"}
+    {"weak1" "-melf64ppc --hash-style=both" ""
+       "-a64 -mpower10" {weak1.s}
+       {{objdump -d weak1.d} {readelf {-srW} weak1.r}} "weak1"}
+    {"weak1.so" "-shared -melf64ppc --hash-style=both" ""
+       "-a64 -mpower10" {weak1.s}
+       {{objdump -d weak1so.d} {readelf {-srW} weak1so.r}} "weak1.so"}
 }
 
 set ppceabitests {
diff --git a/ld/testsuite/ld-powerpc/weak1.d b/ld/testsuite/ld-powerpc/weak1.d
new file mode 100644 (file)
index 0000000..c012753
--- /dev/null
@@ -0,0 +1,26 @@
+
+.*:     file format .*
+
+Disassembly of section \.text:
+
+.*0c0 <_start>:
+.*0c0: (04 10 00 01|01 00 10 04)       pld     r3,65888
+.*0c4: (e4 60 01 60|60 01 60 e4) 
+.*0c8: (04 10 00 01|01 00 10 04)       pld     r3,65856
+.*0cc: (e4 60 01 40|40 01 60 e4) 
+.*0d0: (04 10 00 01|01 00 10 04)       pld     r3,65864
+.*0d4: (e4 60 01 48|48 01 60 e4) 
+.*0d8: (04 10 00 01|01 00 10 04)       pld     r3,65848
+.*0dc: (e4 60 01 38|38 01 60 e4) 
+.*0e0: (e8 62 80 20|20 80 62 e8)       ld      r3,-32736\(r2\)
+.*0e4: (e8 62 80 08|08 80 62 e8)       ld      r3,-32760\(r2\)
+.*0e8: (e8 62 80 18|18 80 62 e8)       ld      r3,-32744\(r2\)
+.*0ec: (e8 62 80 10|10 80 62 e8)       ld      r3,-32752\(r2\)
+.*0f0: (60 00 00 00|00 00 00 60)       nop
+.*0f4: (e8 62 80 20|20 80 62 e8)       ld      r3,-32736\(r2\)
+.*0f8: (60 00 00 00|00 00 00 60)       nop
+.*0fc: (e8 62 80 08|08 80 62 e8)       ld      r3,-32760\(r2\)
+.*100: (60 00 00 00|00 00 00 60)       nop
+.*104: (e8 62 80 18|18 80 62 e8)       ld      r3,-32744\(r2\)
+.*108: (60 00 00 00|00 00 00 60)       nop
+.*10c: (e8 62 80 10|10 80 62 e8)       ld      r3,-32752\(r2\)
diff --git a/ld/testsuite/ld-powerpc/weak1.r b/ld/testsuite/ld-powerpc/weak1.r
new file mode 100644 (file)
index 0000000..7d73f38
--- /dev/null
@@ -0,0 +1,5 @@
+
+There are no relocations in this file.
+
+Symbol table '\.symtab' .*
+#pass
diff --git a/ld/testsuite/ld-powerpc/weak1.s b/ld/testsuite/ld-powerpc/weak1.s
new file mode 100644 (file)
index 0000000..0f370d9
--- /dev/null
@@ -0,0 +1,22 @@
+ .weak x1, x2, x3, x4
+ .protected x2
+ .hidden x3
+ .internal x4
+ .global _start
+_start:
+ pld 3,x1@got@pcrel
+ pld 3,x2@got@pcrel
+ pld 3,x3@got@pcrel
+ pld 3,x4@got@pcrel
+ ld 3,x1@got(2)
+ ld 3,x2@got(2)
+ ld 3,x3@got(2)
+ ld 3,x4@got(2)
+ addis 9,2,x1@got@ha
+ ld 3,x1@got@l(9)
+ addis 9,2,x2@got@ha
+ ld 3,x2@got@l(9)
+ addis 9,2,x3@got@ha
+ ld 3,x3@got@l(9)
+ addis 9,2,x4@got@ha
+ ld 3,x4@got@l(9)
diff --git a/ld/testsuite/ld-powerpc/weak1so.d b/ld/testsuite/ld-powerpc/weak1so.d
new file mode 100644 (file)
index 0000000..0d34b3b
--- /dev/null
@@ -0,0 +1,26 @@
+
+.*:     file format .*
+
+Disassembly of section \.text:
+
+0+1c0 <_start>:
+ 1c0:  (04 10 00 01|01 00 10 04)       pld     r3,66144
+ 1c4:  (e4 60 02 60|60 02 60 e4) 
+ 1c8:  (04 10 00 01|01 00 10 04)       pld     r3,66112
+ 1cc:  (e4 60 02 40|40 02 60 e4) 
+ 1d0:  (04 10 00 01|01 00 10 04)       pld     r3,66120
+ 1d4:  (e4 60 02 48|48 02 60 e4) 
+ 1d8:  (04 10 00 01|01 00 10 04)       pld     r3,66104
+ 1dc:  (e4 60 02 38|38 02 60 e4) 
+ 1e0:  (e8 62 80 20|20 80 62 e8)       ld      r3,-32736\(r2\)
+ 1e4:  (e8 62 80 08|08 80 62 e8)       ld      r3,-32760\(r2\)
+ 1e8:  (e8 62 80 18|18 80 62 e8)       ld      r3,-32744\(r2\)
+ 1ec:  (e8 62 80 10|10 80 62 e8)       ld      r3,-32752\(r2\)
+ 1f0:  (60 00 00 00|00 00 00 60)       nop
+ 1f4:  (e8 62 80 20|20 80 62 e8)       ld      r3,-32736\(r2\)
+ 1f8:  (60 00 00 00|00 00 00 60)       nop
+ 1fc:  (e8 62 80 08|08 80 62 e8)       ld      r3,-32760\(r2\)
+ 200:  (60 00 00 00|00 00 00 60)       nop
+ 204:  (e8 62 80 18|18 80 62 e8)       ld      r3,-32744\(r2\)
+ 208:  (60 00 00 00|00 00 00 60)       nop
+ 20c:  (e8 62 80 10|10 80 62 e8)       ld      r3,-32752\(r2\)
diff --git a/ld/testsuite/ld-powerpc/weak1so.r b/ld/testsuite/ld-powerpc/weak1so.r
new file mode 100644 (file)
index 0000000..dcc91f1
--- /dev/null
@@ -0,0 +1,7 @@
+#...
+.* R_PPC64_GLOB_DAT +0+ x1 \+ 0
+#...
+.* 0+ +0 NOTYPE +WEAK +DEFAULT +UND x1
+#...
+.* 0+ +0 NOTYPE +WEAK +DEFAULT +UND x1
+#pass
This page took 0.041854 seconds and 4 git commands to generate.