aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2021-03-02 21:22:31 +1030
committerAlan Modra <amodra@gmail.com>2021-03-02 21:47:42 +1030
commitf5b9c288a3057f0f04e74f00fdb0e79d171d54a8 (patch)
tree8286125cbea609ffb437fcd0155dbc6b913336a2
parentec11fcffc00ed02eed7b18b312a1af857f5a8caa (diff)
downloadgdb-f5b9c288a3057f0f04e74f00fdb0e79d171d54a8.zip
gdb-f5b9c288a3057f0f04e74f00fdb0e79d171d54a8.tar.gz
gdb-f5b9c288a3057f0f04e74f00fdb0e79d171d54a8.tar.bz2
PowerPC64 undefined weak visibility vs GOT optimisation
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.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf64-ppc.c9
-rw-r--r--ld/ChangeLog9
-rw-r--r--ld/testsuite/ld-powerpc/powerpc.exp6
-rw-r--r--ld/testsuite/ld-powerpc/weak1.d26
-rw-r--r--ld/testsuite/ld-powerpc/weak1.r5
-rw-r--r--ld/testsuite/ld-powerpc/weak1.s22
-rw-r--r--ld/testsuite/ld-powerpc/weak1so.d26
-rw-r--r--ld/testsuite/ld-powerpc/weak1so.r7
9 files changed, 115 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 818f580..44286c2 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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>
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index dcd427b..769fff9 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -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;
diff --git a/ld/ChangeLog b/ld/ChangeLog
index e43f7fa..2bb97bd 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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>
diff --git a/ld/testsuite/ld-powerpc/powerpc.exp b/ld/testsuite/ld-powerpc/powerpc.exp
index 45485e6..8aa0ecc 100644
--- a/ld/testsuite/ld-powerpc/powerpc.exp
+++ b/ld/testsuite/ld-powerpc/powerpc.exp
@@ -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
index 0000000..c012753
--- /dev/null
+++ b/ld/testsuite/ld-powerpc/weak1.d
@@ -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
index 0000000..7d73f38
--- /dev/null
+++ b/ld/testsuite/ld-powerpc/weak1.r
@@ -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
index 0000000..0f370d9
--- /dev/null
+++ b/ld/testsuite/ld-powerpc/weak1.s
@@ -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
index 0000000..0d34b3b
--- /dev/null
+++ b/ld/testsuite/ld-powerpc/weak1so.d
@@ -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
index 0000000..dcc91f1
--- /dev/null
+++ b/ld/testsuite/ld-powerpc/weak1so.r
@@ -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