* elf32-vax.c (elf_vax_adjust_dynamic_symbol): Don't allocate
	PLT slots for local symbols.

	ld/testsuite/
	* 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.
This commit is contained in:
Maciej W. Rozycki 2012-08-05 22:45:20 +00:00
parent 1e5901e69d
commit a22a803903
12 changed files with 394 additions and 25 deletions

View File

@ -1,3 +1,8 @@
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

View File

@ -933,39 +933,21 @@ elf_vax_adjust_dynamic_symbol (info, h)
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);

View File

@ -1,3 +1,16 @@
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

View File

@ -0,0 +1,14 @@
.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

View File

@ -0,0 +1,91 @@
.*: +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

View File

@ -0,0 +1,18 @@
SECTIONS
{
. = 0;
.hash : { *(.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.rela.plt : { *(.rela.plt) }
. = 0x1000;
.plt : { *(.plt) }
. = 0x2000;
.text : { *(.text) }
. = 0x3000;
.dynamic : { *(.dynamic) }
.got : { *(.got.plt) }
}

View File

@ -0,0 +1,50 @@
.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

View File

@ -0,0 +1,14 @@
.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

View File

@ -0,0 +1,73 @@
.*: +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

View File

@ -0,0 +1,34 @@
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;
};
}

View File

@ -0,0 +1,25 @@
.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

View File

@ -0,0 +1,50 @@
# 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"]]