+2012-08-05 Maciej W. Rozycki <macro@linux-mips.org>
+
+ * elf32-vax.c (elf_vax_adjust_dynamic_symbol): Don't allocate
+ PLT slots for local symbols.
+
2012-08-03 Maciej W. Rozycki <macro@codesourcery.com>
* elf64-mips.c (mips16_elf64_howto_table_rela): Correct src_mask
if (h->type == STT_FUNC
|| h->needs_plt)
{
- if (! info->shared
- && !h->def_dynamic
- && !h->ref_dynamic
- /* We must always create the plt entry if it was referenced
- by a PLTxxO relocation. In this case we already recorded
- it as a dynamic symbol. */
- && h->dynindx == -1)
+ if (h->plt.refcount <= 0
+ || SYMBOL_CALLS_LOCAL (info, h)
+ || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
+ && h->root.type == bfd_link_hash_undefweak))
{
/* This case can occur if we saw a PLTxx reloc in an input
file, but the symbol was never referred to by a dynamic
- object. In such a case, we don't actually need to build
- a procedure linkage table, and we can just do a PCxx
- reloc instead. */
- BFD_ASSERT (h->needs_plt);
+ object, or if all references were garbage collected. In
+ such a case, we don't actually need to build a procedure
+ linkage table, and we can just do a PCxx reloc instead. */
h->plt.offset = (bfd_vma) -1;
- return TRUE;
- }
-
- /* GC may have rendered this entry unused. */
- if (h->plt.refcount <= 0)
- {
h->needs_plt = 0;
- h->plt.offset = (bfd_vma) -1;
return TRUE;
}
- /* Make sure this symbol is output as a dynamic symbol. */
- if (h->dynindx == -1)
- {
- if (! bfd_elf_link_record_dynamic_symbol (info, h))
- return FALSE;
- }
-
s = bfd_get_linker_section (dynobj, ".plt");
BFD_ASSERT (s != NULL);
+2012-08-05 Maciej W. Rozycki <macro@linux-mips.org>
+
+ * ld-vax-elf: New directory.
+ * ld-vax-elf/plt-local-lib.dd: New test.
+ * ld-vax-elf/plt-local-lib.ld: New test linker script.
+ * ld-vax-elf/plt-local-lib.s: New test source.
+ * ld-vax-elf/plt-local.dd: New test.
+ * ld-vax-elf/plt-local.ld: New test linker script.
+ * ld-vax-elf/plt-local.s: New test source.
+ * ld-vax-elf/plt-local-hidden-pic.s: New test source.
+ * ld-vax-elf/plt-local-rehidden-pic.s: New test source.
+ * ld-vax-elf/vax-elf.exp: New test script.
+
2012-08-03 Maciej W. Rozycki <macro@codesourcery.com>
* lib/ld-lib.exp (at_least_gcc_version): Accept more version
--- /dev/null
+ .text
+
+ .hidden foo_hidden
+ .globl foo_hidden
+ .type foo_hidden, @function
+foo_hidden:
+ .word 0
+ calls $0, foo_extern
+ calls $0, foo_global
+ calls $0, foo_local
+ calls $0, foo_hidden
+ calls $0, foo_rehidden
+ ret
+ .size foo_hidden, . - foo_hidden
--- /dev/null
+.*: +file format .*vax.*
+
+Disassembly of section \.plt:
+
+00001000 <foo_local@plt-0xc>:
+ 1000: dd ef 76 20 pushl 307c <_GLOBAL_OFFSET_TABLE_\+0x4>
+ 1004: 00 00
+ 1006: 17 ff 74 20 jmp \*3080 <_GLOBAL_OFFSET_TABLE_\+0x8>
+ 100a: 00 00
+
+0000100c <foo_local@plt>:
+ 100c: fc 0f \.word 0x0ffc # Entry mask: < r11 r10 r9 r8 r7 r6 r5 r4 r3 r2 >
+ 100e: 16 ef ec ff jsb 1000 <foo_local@plt-0xc>
+ 1012: ff ff
+ 1014: 00 00 00 00 \.long 0x00000000
+
+00001018 <foo_extern@plt>:
+ 1018: fc 0f \.word 0x0ffc # Entry mask: < r11 r10 r9 r8 r7 r6 r5 r4 r3 r2 >
+ 101a: 16 ef e0 ff jsb 1000 <foo_local@plt-0xc>
+ 101e: ff ff
+ 1020: 0c 00 00 00 \.long 0x0000000c
+
+00001024 <foo_rehidden@plt>:
+ 1024: fc 0f \.word 0x0ffc # Entry mask: < r11 r10 r9 r8 r7 r6 r5 r4 r3 r2 >
+ 1026: 16 ef d4 ff jsb 1000 <foo_local@plt-0xc>
+ 102a: ff ff
+ 102c: 18 00 00 00 \.long 0x00000018
+
+00001030 <foo_global@plt>:
+ 1030: fc 0f \.word 0x0ffc # Entry mask: < r11 r10 r9 r8 r7 r6 r5 r4 r3 r2 >
+ 1032: 16 ef c8 ff jsb 1000 <foo_local@plt-0xc>
+ 1036: ff ff
+ 1038: 24 00 00 00 \.long 0x00000024
+
+Disassembly of section \.text:
+
+00002000 <foo_extern>:
+ 2000: 00 00 \.word 0x0000 # Entry mask: < >
+ 2002: fb 00 ff 7f calls \$0x0,\*3088 <_GLOBAL_OFFSET_TABLE_\+0x10>
+ 2006: 10 00 00
+ 2009: fb 00 ff 80 calls \$0x0,\*3090 <_GLOBAL_OFFSET_TABLE_\+0x18>
+ 200d: 10 00 00
+ 2010: fb 00 ff 6d calls \$0x0,\*3084 <_GLOBAL_OFFSET_TABLE_\+0xc>
+ 2014: 10 00 00
+ 2017: fb 00 ef 2e calls \$0x0,204c <foo_hidden>
+ 201b: 00 00 00
+ 201e: fb 00 ff 67 calls \$0x0,\*308c <_GLOBAL_OFFSET_TABLE_\+0x14>
+ 2022: 10 00 00
+ 2025: 04 ret
+
+00002026 <foo_local>:
+ 2026: 00 00 \.word 0x0000 # Entry mask: < >
+ 2028: fb 00 ff 59 calls \$0x0,\*3088 <_GLOBAL_OFFSET_TABLE_\+0x10>
+ 202c: 10 00 00
+ 202f: fb 00 ff 5a calls \$0x0,\*3090 <_GLOBAL_OFFSET_TABLE_\+0x18>
+ 2033: 10 00 00
+ 2036: fb 00 ff 47 calls \$0x0,\*3084 <_GLOBAL_OFFSET_TABLE_\+0xc>
+ 203a: 10 00 00
+ 203d: fb 00 ef 08 calls \$0x0,204c <foo_hidden>
+ 2041: 00 00 00
+ 2044: fb 00 ff 41 calls \$0x0,\*308c <_GLOBAL_OFFSET_TABLE_\+0x14>
+ 2048: 10 00 00
+ 204b: 04 ret
+
+0000204c <foo_hidden>:
+ 204c: 00 00 \.word 0x0000 # Entry mask: < >
+ 204e: fb 00 ff 33 calls \$0x0,\*3088 <_GLOBAL_OFFSET_TABLE_\+0x10>
+ 2052: 10 00 00
+ 2055: fb 00 ff 34 calls \$0x0,\*3090 <_GLOBAL_OFFSET_TABLE_\+0x18>
+ 2059: 10 00 00
+ 205c: fb 00 ff 21 calls \$0x0,\*3084 <_GLOBAL_OFFSET_TABLE_\+0xc>
+ 2060: 10 00 00
+ 2063: fb 00 ef e2 calls \$0x0,204c <foo_hidden>
+ 2067: ff ff ff
+ 206a: fb 00 ff 1b calls \$0x0,\*308c <_GLOBAL_OFFSET_TABLE_\+0x14>
+ 206e: 10 00 00
+ 2071: 04 ret
+
+00002072 <foo_rehidden>:
+ 2072: 00 00 \.word 0x0000 # Entry mask: < >
+ 2074: fb 00 ff 0d calls \$0x0,\*3088 <_GLOBAL_OFFSET_TABLE_\+0x10>
+ 2078: 10 00 00
+ 207b: fb 00 ff 0e calls \$0x0,\*3090 <_GLOBAL_OFFSET_TABLE_\+0x18>
+ 207f: 10 00 00
+ 2082: fb 00 ff fb calls \$0x0,\*3084 <_GLOBAL_OFFSET_TABLE_\+0xc>
+ 2086: 0f 00 00
+ 2089: fb 00 ef bc calls \$0x0,204c <foo_hidden>
+ 208d: ff ff ff
+ 2090: fb 00 ff f5 calls \$0x0,\*308c <_GLOBAL_OFFSET_TABLE_\+0x14>
+ 2094: 0f 00 00
+ 2097: 04 ret
--- /dev/null
+SECTIONS
+{
+ . = 0;
+ .hash : { *(.hash) }
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .rela.plt : { *(.rela.plt) }
+
+ . = 0x1000;
+ .plt : { *(.plt) }
+
+ . = 0x2000;
+ .text : { *(.text) }
+
+ . = 0x3000;
+ .dynamic : { *(.dynamic) }
+ .got : { *(.got.plt) }
+}
--- /dev/null
+ .text
+
+ .globl foo_extern
+ .type foo_extern, @function
+foo_extern:
+ .word 0
+ calls $0, foo_extern
+ calls $0, foo_global
+ calls $0, foo_local
+ calls $0, foo_hidden
+ calls $0, foo_rehidden
+ ret
+ .size foo_extern, . - foo_extern
+
+ .globl foo_local
+ .type foo_local, @function
+foo_local:
+ .word 0
+ calls $0, foo_extern
+ calls $0, foo_global
+ calls $0, foo_local
+ calls $0, foo_hidden
+ calls $0, foo_rehidden
+ ret
+ .size foo_local, . - foo_local
+
+ .hidden foo_hidden
+ .globl foo_hidden
+ .type foo_hidden, @function
+foo_hidden:
+ .word 0
+ calls $0, foo_extern
+ calls $0, foo_global
+ calls $0, foo_local
+ calls $0, foo_hidden
+ calls $0, foo_rehidden
+ ret
+ .size foo_hidden, . - foo_hidden
+
+ .globl foo_rehidden
+ .type foo_rehidden, @function
+foo_rehidden:
+ .word 0
+ calls $0, foo_extern
+ calls $0, foo_global
+ calls $0, foo_local
+ calls $0, foo_hidden
+ calls $0, foo_rehidden
+ ret
+ .size foo_rehidden, . - foo_rehidden
--- /dev/null
+ .text
+
+ .hidden foo_rehidden
+ .globl foo_rehidden
+ .type foo_rehidden, @function
+foo_rehidden:
+ .word 0
+ calls $0, foo_extern
+ calls $0, foo_global
+ calls $0, foo_local
+ calls $0, foo_hidden
+ calls $0, foo_rehidden
+ ret
+ .size foo_rehidden, . - foo_rehidden
--- /dev/null
+.*: +file format .*vax.*
+
+Disassembly of section \.plt:
+
+00001000 <foo_extern@plt-0xc>:
+ 1000: dd ef 86 20 pushl 308c <_GLOBAL_OFFSET_TABLE_\+0x4>
+ 1004: 00 00
+ 1006: 17 ff 84 20 jmp \*3090 <_GLOBAL_OFFSET_TABLE_\+0x8>
+ 100a: 00 00
+
+0000100c <foo_extern@plt>:
+ 100c: fc 0f \.word 0x0ffc # Entry mask: < r11 r10 r9 r8 r7 r6 r5 r4 r3 r2 >
+ 100e: 16 ef ec ff jsb 1000 <foo_extern@plt-0xc>
+ 1012: ff ff
+ 1014: 00 00 00 00 \.long 0x00000000
+
+Disassembly of section \.text:
+
+00002000 <foo_hidden>:
+ 2000: 00 00 \.word 0x0000 # Entry mask: < >
+ 2002: fb 00 ff 8b calls \$0x0,\*3094 <_GLOBAL_OFFSET_TABLE_\+0xc>
+ 2006: 10 00 00
+ 2009: fb 00 ef 3c calls \$0x0,204c <foo_global>
+ 200d: 00 00 00
+ 2010: fb 00 ef 5b calls \$0x0,2072 <foo_local>
+ 2014: 00 00 00
+ 2017: fb 00 ef e2 calls \$0x0,2000 <foo_hidden>
+ 201b: ff ff ff
+ 201e: fb 00 ef 01 calls \$0x0,2026 <foo_rehidden>
+ 2022: 00 00 00
+ 2025: 04 ret
+
+00002026 <foo_rehidden>:
+ 2026: 00 00 \.word 0x0000 # Entry mask: < >
+ 2028: fb 00 ff 65 calls \$0x0,\*3094 <_GLOBAL_OFFSET_TABLE_\+0xc>
+ 202c: 10 00 00
+ 202f: fb 00 ef 16 calls \$0x0,204c <foo_global>
+ 2033: 00 00 00
+ 2036: fb 00 ef 35 calls \$0x0,2072 <foo_local>
+ 203a: 00 00 00
+ 203d: fb 00 ef bc calls \$0x0,2000 <foo_hidden>
+ 2041: ff ff ff
+ 2044: fb 00 ef db calls \$0x0,2026 <foo_rehidden>
+ 2048: ff ff ff
+ 204b: 04 ret
+
+0000204c <foo_global>:
+ 204c: 00 00 \.word 0x0000 # Entry mask: < >
+ 204e: fb 00 ff 3f calls \$0x0,\*3094 <_GLOBAL_OFFSET_TABLE_\+0xc>
+ 2052: 10 00 00
+ 2055: fb 00 ef f0 calls \$0x0,204c <foo_global>
+ 2059: ff ff ff
+ 205c: fb 00 ef 0f calls \$0x0,2072 <foo_local>
+ 2060: 00 00 00
+ 2063: fb 00 ef 96 calls \$0x0,2000 <foo_hidden>
+ 2067: ff ff ff
+ 206a: fb 00 ef b5 calls \$0x0,2026 <foo_rehidden>
+ 206e: ff ff ff
+ 2071: 04 ret
+
+00002072 <foo_local>:
+ 2072: 00 00 \.word 0x0000 # Entry mask: < >
+ 2074: fb 00 ff 19 calls \$0x0,\*3094 <_GLOBAL_OFFSET_TABLE_\+0xc>
+ 2078: 10 00 00
+ 207b: fb 00 ef ca calls \$0x0,204c <foo_global>
+ 207f: ff ff ff
+ 2082: fb 00 ef e9 calls \$0x0,2072 <foo_local>
+ 2086: ff ff ff
+ 2089: fb 00 ef 70 calls \$0x0,2000 <foo_hidden>
+ 208d: ff ff ff
+ 2090: fb 00 ef 8f calls \$0x0,2026 <foo_rehidden>
+ 2094: ff ff ff
+ 2097: 04 ret
--- /dev/null
+ENTRY (foo_global)
+SECTIONS
+{
+ . = 0;
+ .interp : { *(.interp) }
+ .hash : { *(.hash) }
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .gnu.version : { *(.gnu.version) }
+ .gnu.version_d : { *(.gnu.version_d) }
+ .rela.plt : { *(.rela.plt) }
+
+ . = 0x1000;
+ .plt : { *(.plt) }
+
+ . = 0x2000;
+ .text : { *(.text) }
+
+ . = 0x3000;
+ .dynamic : { *(.dynamic) }
+ .got : { *(.got.plt) }
+};
+VERSION
+{
+ {
+ global:
+ foo_extern;
+ foo_global;
+ foo_hidden;
+ foo_rehidden;
+ local:
+ foo_local;
+ };
+}
--- /dev/null
+ .text
+
+ .globl foo_global
+ .type foo_global, @function
+foo_global:
+ .word 0
+ calls $0, foo_extern
+ calls $0, foo_global
+ calls $0, foo_local
+ calls $0, foo_hidden
+ calls $0, foo_rehidden
+ ret
+ .size foo_global, . - foo_global
+
+ .globl foo_local
+ .type foo_local, @function
+foo_local:
+ .word 0
+ calls $0, foo_extern
+ calls $0, foo_global
+ calls $0, foo_local
+ calls $0, foo_hidden
+ calls $0, foo_rehidden
+ ret
+ .size foo_local, . - foo_local
--- /dev/null
+# Expect script for VAX ELF linker tests
+# Copyright 2012 Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+#
+
+if { ![istarget vax-*-*] || ![is_elf_format] } {
+ return
+}
+
+run_ld_link_tests [list \
+ [list "PLT test (shared library)" \
+ "-shared -T plt-local-lib.ld" \
+ "-k" \
+ { plt-local-lib.s } \
+ { { objdump -d plt-local-lib.dd } } \
+ "plt-local-lib.so"] \
+ [list "PLT test (object 1)" \
+ "-r" \
+ "-k" \
+ { plt-local-hidden-pic.s } \
+ {} \
+ "plt-local-hidden-pic-r.o"] \
+ [list "PLT test (object 2)" \
+ "-r" \
+ "-k" \
+ { plt-local-rehidden-pic.s } \
+ {} \
+ "plt-local-rehidden-pic-r.o"] \
+ [list "PLT test (executable)" \
+ "-T plt-local.ld tmpdir/plt-local-hidden-pic-r.o tmpdir/plt-local-rehidden-pic-r.o tmpdir/plt-local-lib.so" \
+ "" \
+ { plt-local.s } \
+ { { objdump -d plt-local.dd } } \
+ "plt-local"]]