+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
 
 
          /* 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;
 
+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
 
--- /dev/null
+       .globl  baz
+       .type   baz, @object
+baz:
+       .byte   0, 1, 2
+       .size   baz, . - baz
 
--- /dev/null
+       .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
 
--- /dev/null
+.*: +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
 
--- /dev/null
+.*: +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
 
--- /dev/null
+# Make sure there's only one GOT entry, for the symbol defined externally.
+Hex dump of section '\.got':
+  0x00001000 00000000                            .*
 
--- /dev/null
+.*: +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
 
--- /dev/null
+\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
 
--- /dev/null
+# Make sure there are only two GOT entries, for the preemptible symbols.
+Hex dump of section '\.got':
+  0x00001000 00000000 00000000                   .*
 
--- /dev/null
+\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
 
--- /dev/null
+       .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
 
--- /dev/null
+       .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
 
--- /dev/null
+       .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
 
--- /dev/null
+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/ : { *(*) }
+}
 
          "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" "" \
          { 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" "" \
          "" \
          {} \
          { { 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 \