aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf32-vax.c2
-rw-r--r--ld/ChangeLog24
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-aux-off.s5
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-def-off.s12
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-exe-off-hidden.dd17
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-exe-off-visible.dd17
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-exe-off.xd3
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-lib-off-hidden.dd17
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-lib-off-visible.ed2
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-lib-off.xd3
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-off-external.ed2
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-ref-off-external.s12
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-ref-off-hidden.s12
-rw-r--r--ld/testsuite/ld-vax-elf/got-local-ref-off-visible.s12
-rw-r--r--ld/testsuite/ld-vax-elf/got-local.ld17
-rw-r--r--ld/testsuite/ld-vax-elf/vax-elf.exp85
17 files changed, 245 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 2d1e4da..1cf0624 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2020-12-05 Maciej W. Rozycki <macro@linux-mips.org>
+
+ * elf32-vax.c (elf_vax_check_relocs) <R_VAX_GOT32>: Use
+ SYMBOL_REFERENCES_LOCAL rather than `h->forced_local' to check
+ whether the symbol referred is local or not.
+
2020-12-04 H.J. Lu <hongjiu.lu@intel.com>
PR ld/27016
diff --git a/bfd/elf32-vax.c b/bfd/elf32-vax.c
index 58a4a8b..a9581b8 100644
--- a/bfd/elf32-vax.c
+++ b/bfd/elf32-vax.c
@@ -598,7 +598,7 @@ elf_vax_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
/* If this is a local symbol, we resolve it directly without
creating a global offset table entry. */
- if (h->forced_local
+ if (SYMBOL_REFERENCES_LOCAL (info, h)
|| h == elf_hash_table (info)->hgot
|| h == elf_hash_table (info)->hplt)
break;
diff --git a/ld/ChangeLog b/ld/ChangeLog
index f33bd41..9e72b31 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,27 @@
+2020-12-05 Maciej W. Rozycki <macro@linux-mips.org>
+
+ * testsuite/ld-vax-elf/got-local-exe-off-hidden.dd: New test
+ dump.
+ * testsuite/ld-vax-elf/got-local-exe-off-visible.dd: New test
+ dump.
+ * testsuite/ld-vax-elf/got-local-lib-off-hidden.dd: New test
+ dump.
+ * testsuite/ld-vax-elf/got-local-lib-off-visible.ed: New test
+ dump.
+ * testsuite/ld-vax-elf/got-local-off-external.ed: New test dump.
+ * testsuite/ld-vax-elf/got-local-exe-off.xd: New test dump.
+ * testsuite/ld-vax-elf/got-local-lib-off.xd: New test dump.
+ * testsuite/ld-vax-elf/got-local.ld: New test linker script.
+ * testsuite/ld-vax-elf/got-local-aux-off.s: New test source.
+ * testsuite/ld-vax-elf/got-local-def-off.s: New test source.
+ * testsuite/ld-vax-elf/got-local-ref-off-external.s: New test
+ source.
+ * testsuite/ld-vax-elf/got-local-ref-off-hidden.s: New test
+ source.
+ * testsuite/ld-vax-elf/got-local-ref-off-visible.s: New test
+ source.
+ * testsuite/ld-vax-elf/vax-elf.exp: Run the new tests.
+
2020-12-04 H.J. Lu <hongjiu.lu@intel.com>
PR ld/27016
diff --git a/ld/testsuite/ld-vax-elf/got-local-aux-off.s b/ld/testsuite/ld-vax-elf/got-local-aux-off.s
new file mode 100644
index 0000000..36ea987
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-aux-off.s
@@ -0,0 +1,5 @@
+ .globl baz
+ .type baz, @object
+baz:
+ .byte 0, 1, 2
+ .size baz, . - baz
diff --git a/ld/testsuite/ld-vax-elf/got-local-def-off.s b/ld/testsuite/ld-vax-elf/got-local-def-off.s
new file mode 100644
index 0000000..2ad0473
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-def-off.s
@@ -0,0 +1,12 @@
+ .data
+ .globl bar_hidden
+ .type bar_hidden, @object
+ .hidden bar_hidden
+bar_hidden:
+ .byte 0, 1, 2
+ .size bar_hidden, . - bar_hidden
+ .globl bar_visible
+ .type bar_visible, @object
+bar_visible:
+ .byte 0, 1, 2
+ .size bar_visible, . - bar_visible
diff --git a/ld/testsuite/ld-vax-elf/got-local-exe-off-hidden.dd b/ld/testsuite/ld-vax-elf/got-local-exe-off-hidden.dd
new file mode 100644
index 0000000..4a1b54b
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-exe-off-hidden.dd
@@ -0,0 +1,17 @@
+.*: +file format .*vax.*
+
+Disassembly of section \.text:
+
+00000000 <foo>:
+ 0: 00 00 \.word 0x0000 # Entry mask: < >
+ 2: 9e ef f8 1f movab 2000 <bar_hidden>,r0
+ 6: 00 00 50
+ 9: 9e ef f2 1f movab 2001 <bar_hidden\+0x1>,r0
+ d: 00 00 50
+ 10: 9e ef ec 1f movab 2002 <bar_hidden\+0x2>,r0
+ 14: 00 00 50
+ 17: 9e ef e6 1f movab 2003 <bar_visible>,r1
+ 1b: 00 00 51
+ 1e: 9e ff dc 0f movab \*1000 <baz>,r2
+ 22: 00 00 52
+ 25: 04 ret
diff --git a/ld/testsuite/ld-vax-elf/got-local-exe-off-visible.dd b/ld/testsuite/ld-vax-elf/got-local-exe-off-visible.dd
new file mode 100644
index 0000000..8eddd36
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-exe-off-visible.dd
@@ -0,0 +1,17 @@
+.*: +file format .*vax.*
+
+Disassembly of section \.text:
+
+00000000 <foo>:
+ 0: 00 00 \.word 0x0000 # Entry mask: < >
+ 2: 9e ef f8 1f movab 2000 <bar_hidden>,r0
+ 6: 00 00 50
+ 9: 9e ef f4 1f movab 2003 <bar_visible>,r1
+ d: 00 00 51
+ 10: 9e ef ee 1f movab 2004 <bar_visible\+0x1>,r1
+ 14: 00 00 51
+ 17: 9e ef e8 1f movab 2005 <bar_visible\+0x2>,r1
+ 1b: 00 00 51
+ 1e: 9e ff dc 0f movab \*1000 <baz>,r2
+ 22: 00 00 52
+ 25: 04 ret
diff --git a/ld/testsuite/ld-vax-elf/got-local-exe-off.xd b/ld/testsuite/ld-vax-elf/got-local-exe-off.xd
new file mode 100644
index 0000000..c4c1ab6
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-exe-off.xd
@@ -0,0 +1,3 @@
+# Make sure there's only one GOT entry, for the symbol defined externally.
+Hex dump of section '\.got':
+ 0x00001000 00000000 .*
diff --git a/ld/testsuite/ld-vax-elf/got-local-lib-off-hidden.dd b/ld/testsuite/ld-vax-elf/got-local-lib-off-hidden.dd
new file mode 100644
index 0000000..1e4dfe9
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-lib-off-hidden.dd
@@ -0,0 +1,17 @@
+.*: +file format .*vax.*
+
+Disassembly of section \.text:
+
+00000000 <foo>:
+ 0: 00 00 \.word 0x0000 # Entry mask: < >
+ 2: 9e ef f8 1f movab 2000 <bar_hidden>,r0
+ 6: 00 00 50
+ 9: 9e ef f2 1f movab 2001 <bar_hidden\+0x1>,r0
+ d: 00 00 50
+ 10: 9e ef ec 1f movab 2002 <bar_hidden\+0x2>,r0
+ 14: 00 00 50
+ 17: 9e ff e7 0f movab \*1004 <bar_visible-0xfff>,r1
+ 1b: 00 00 51
+ 1e: 9e ff dc 0f movab \*1000 <baz>,r2
+ 22: 00 00 52
+ 25: 04 ret
diff --git a/ld/testsuite/ld-vax-elf/got-local-lib-off-visible.ed b/ld/testsuite/ld-vax-elf/got-local-lib-off-visible.ed
new file mode 100644
index 0000000..d7eacd6
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-lib-off-visible.ed
@@ -0,0 +1,2 @@
+\A[^\n]*\.o: warning: GOT addend of 1 to `bar_visible' does not match previous GOT addend of 0
+[^\n]*\.o: warning: GOT addend of 2 to `bar_visible' does not match previous GOT addend of 0\Z
diff --git a/ld/testsuite/ld-vax-elf/got-local-lib-off.xd b/ld/testsuite/ld-vax-elf/got-local-lib-off.xd
new file mode 100644
index 0000000..2f86b2b
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-lib-off.xd
@@ -0,0 +1,3 @@
+# Make sure there are only two GOT entries, for the preemptible symbols.
+Hex dump of section '\.got':
+ 0x00001000 00000000 00000000 .*
diff --git a/ld/testsuite/ld-vax-elf/got-local-off-external.ed b/ld/testsuite/ld-vax-elf/got-local-off-external.ed
new file mode 100644
index 0000000..773ea0f
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-off-external.ed
@@ -0,0 +1,2 @@
+\A[^\n]*\.o: warning: GOT addend of 1 to `baz' does not match previous GOT addend of 0
+[^\n]*\.o: warning: GOT addend of 2 to `baz' does not match previous GOT addend of 0\Z
diff --git a/ld/testsuite/ld-vax-elf/got-local-ref-off-external.s b/ld/testsuite/ld-vax-elf/got-local-ref-off-external.s
new file mode 100644
index 0000000..260194c
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-ref-off-external.s
@@ -0,0 +1,12 @@
+ .text
+ .globl foo
+ .type foo, @function
+foo:
+ .word 0
+ movab bar_hidden, %r0
+ movab bar_visible, %r1
+ movab baz, %r2
+ movab baz + 1, %r2
+ movab baz + 2, %r2
+ ret
+ .size foo, . - foo
diff --git a/ld/testsuite/ld-vax-elf/got-local-ref-off-hidden.s b/ld/testsuite/ld-vax-elf/got-local-ref-off-hidden.s
new file mode 100644
index 0000000..fdff42c
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-ref-off-hidden.s
@@ -0,0 +1,12 @@
+ .text
+ .globl foo
+ .type foo, @function
+foo:
+ .word 0
+ movab bar_hidden, %r0
+ movab bar_hidden + 1, %r0
+ movab bar_hidden + 2, %r0
+ movab bar_visible, %r1
+ movab baz, %r2
+ ret
+ .size foo, . - foo
diff --git a/ld/testsuite/ld-vax-elf/got-local-ref-off-visible.s b/ld/testsuite/ld-vax-elf/got-local-ref-off-visible.s
new file mode 100644
index 0000000..cf3d070
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local-ref-off-visible.s
@@ -0,0 +1,12 @@
+ .text
+ .globl foo
+ .type foo, @function
+foo:
+ .word 0
+ movab bar_hidden, %r0
+ movab bar_visible, %r1
+ movab bar_visible + 1, %r1
+ movab bar_visible + 2, %r1
+ movab baz, %r2
+ ret
+ .size foo, . - foo
diff --git a/ld/testsuite/ld-vax-elf/got-local.ld b/ld/testsuite/ld-vax-elf/got-local.ld
new file mode 100644
index 0000000..330046d
--- /dev/null
+++ b/ld/testsuite/ld-vax-elf/got-local.ld
@@ -0,0 +1,17 @@
+SECTIONS
+{
+ .text : { *(.text) }
+ .hash : { *(.hash) }
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .rela.dyn : { *(.rela.*) }
+ . = ALIGN (0x1000);
+ .got : { *(.got) }
+ . = ALIGN (0x1000);
+ .data : { *(.data) }
+ .dynamic : { *(.dynamic) }
+ .symtab : { *(.symtab) }
+ .strtab : { *(.strtab) }
+ .shstrtab : { *(.shstrtab) }
+ /DISCARD/ : { *(*) }
+}
diff --git a/ld/testsuite/ld-vax-elf/vax-elf.exp b/ld/testsuite/ld-vax-elf/vax-elf.exp
index 2748000..fb1fc3b 100644
--- a/ld/testsuite/ld-vax-elf/vax-elf.exp
+++ b/ld/testsuite/ld-vax-elf/vax-elf.exp
@@ -51,7 +51,7 @@ run_ld_link_tests [list \
"plt-local"]]
# Global offset table tests. Make sure hidden symbols do not get GOT
-# assignments.
+# assignments. Also verify offset references.
run_ld_link_tests [list \
[list "GOT test (auxiliary shared library)" \
"-shared" "" \
@@ -59,18 +59,48 @@ run_ld_link_tests [list \
{ got-local-aux.s } \
{} \
"got-local-aux.so"] \
+ [list "GOT test (auxiliary shared library for offsets)" \
+ "-shared" "" \
+ "-k" \
+ { got-local-aux-off.s } \
+ {} \
+ "got-local-aux-off.so"] \
[list "GOT test (object 1)" \
"-r" "" \
"-k" \
{ got-local-ref.s } \
{} \
"got-local-ref-r.o"] \
+ [list "GOT test (object 1 hidden reference with offset)" \
+ "-r" "" \
+ "-k" \
+ { got-local-ref-off-hidden.s } \
+ {} \
+ "got-local-ref-off-hidden-r.o"] \
+ [list "GOT test (object 1 visible reference with offset)" \
+ "-r" "" \
+ "-k" \
+ { got-local-ref-off-visible.s } \
+ {} \
+ "got-local-ref-off-visible-r.o"] \
+ [list "GOT test (object 1 external reference with offset)" \
+ "-r" "" \
+ "-k" \
+ { got-local-ref-off-external.s } \
+ {} \
+ "got-local-ref-off-external-r.o"] \
[list "GOT test (object 2)" \
"-r" "" \
"-k" \
{ got-local-def.s } \
{} \
"got-local-def-r.o"] \
+ [list "GOT test (object 2 for offsets)" \
+ "-r" "" \
+ "-k" \
+ { got-local-def-off.s } \
+ {} \
+ "got-local-def-off-r.o"] \
[list "GOT test (executable)" \
"-e 0 tmpdir/got-local-aux.so tmpdir/got-local-ref-r.o \
tmpdir/got-local-def-r.o" "" \
@@ -84,7 +114,58 @@ run_ld_link_tests [list \
"" \
{} \
{ { readelf "-x .got" got-local-lib.xd } } \
- "got-local-lib.so"]]
+ "got-local-lib.so"] \
+ [list "GOT test (executable hidden reference with offset)" \
+ "-e 0 -T got-local.ld tmpdir/got-local-aux-off.so \
+ tmpdir/got-local-ref-off-hidden-r.o \
+ tmpdir/got-local-def-off-r.o" "" \
+ "" \
+ {} \
+ { { readelf "-x .got" got-local-exe-off.xd } \
+ { objdump -d got-local-exe-off-hidden.dd } } \
+ "got-local-exe-off-hidden"] \
+ [list "GOT test (shared library hidden reference with offset)" \
+ "-shared -T got-local.ld tmpdir/got-local-aux-off.so \
+ tmpdir/got-local-ref-off-hidden-r.o \
+ tmpdir/got-local-def-off-r.o" "" \
+ "" \
+ {} \
+ { { readelf "-x .got" got-local-lib-off.xd } \
+ { objdump -d got-local-lib-off-hidden.dd } } \
+ "got-local-lib-off-hidden.so"] \
+ [list "GOT test (executable visible reference with offset)" \
+ "-e 0 -T got-local.ld tmpdir/got-local-aux-off.so \
+ tmpdir/got-local-ref-off-visible-r.o \
+ tmpdir/got-local-def-off-r.o" "" \
+ "" \
+ {} \
+ { { readelf "-x .got" got-local-exe-off.xd } \
+ { objdump -d got-local-exe-off-visible.dd } } \
+ "got-local-exe-off-visible"] \
+ [list "GOT test (shared library visible reference with offset)" \
+ "-shared -T got-local.ld tmpdir/got-local-aux-off.so \
+ tmpdir/got-local-ref-off-visible-r.o \
+ tmpdir/got-local-def-off-r.o" "" \
+ "" \
+ {} \
+ { { ld got-local-lib-off-visible.ed } } \
+ "got-local-lib-off-visible.so"] \
+ [list "GOT test (executable external reference with offset)" \
+ "-e 0 -T got-local.ld tmpdir/got-local-aux-off.so \
+ tmpdir/got-local-ref-off-external-r.o \
+ tmpdir/got-local-def-off-r.o" "" \
+ "" \
+ {} \
+ { { ld got-local-off-external.ed } } \
+ "got-local-exe-off-external"] \
+ [list "GOT test (shared library external reference with offset)" \
+ "-shared -T got-local.ld tmpdir/got-local-aux-off.so \
+ tmpdir/got-local-ref-off-external-r.o \
+ tmpdir/got-local-def-off-r.o" "" \
+ "" \
+ {} \
+ { { ld got-local-off-external.ed } } \
+ "got-local-lib-off-external.so"]]
# Export class relocation tests.
run_ld_link_tests [list \