PR ld/20828: Move symbol version processing ahead of GC symbol sweep
Complement commitb531344c34
("PR ld/20828: Reorder the symbol sweep stage of section GC") and commit81ff47b3a5
("PR ld/20828: Fix linker script symbols wrongly forced local with section GC") and move symbol version processing ahead of the symbol sweep stage of section GC, all in `bfd_elf_size_dynamic_sections', so that version symbols created stay in the global scope and are not output as local symbols to the dynamic symbol table in the presence of corresponding symbol definitions pulled from a DSO involved in a link. Consolidate the whole of symbol version processing into a single block from all parts scattered across the function and rearranging the local variables used as necessary, however leaving the setting of dynamic entries associated with the DT_VERDEF, DT_VERDEFNUM, DT_VERNEED and DT_VERNEEDNUM tags and the SEC_EXCLUDE flag for unused `.gnu.version' section in the original places. With the rearrangement of code blocks `Elf_Internal_Verneed *t' would shadow the previous definition of `struct bfd_elf_version_tree *t', so rename the former variable to `vn'. bfd/ PR ld/20828 * elflink.c (bfd_elf_size_dynamic_sections): Move symbol version processing ahead of the call to `elf_gc_sweep_symbol'. ld/ PR ld/20828 * testsuite/ld-elf/pr20828-d.sd: New test. * testsuite/ld-elf/pr20828-e.sd: New test. * testsuite/ld-elf/pr20828-v.od: New test. * testsuite/ld-elf/pr20828-v.ver: New test version script. * testsuite/ld-elf/pr20828-v.ld: New test linker script. * testsuite/ld-elf/pr20828.ld: Add `.gnu.version' and `.gnu.version_d'. * testsuite/ld-elf/shared.exp: Run the new tests.
This commit is contained in:
parent
5ff6a06c21
commit
902e9fc76a
11 changed files with 466 additions and 336 deletions
12
ld/ChangeLog
12
ld/ChangeLog
|
@ -1,3 +1,15 @@
|
|||
2017-02-22 Maciej W. Rozycki <macro@imgtec.com>
|
||||
|
||||
PR ld/20828
|
||||
* testsuite/ld-elf/pr20828-d.sd: New test.
|
||||
* testsuite/ld-elf/pr20828-e.sd: New test.
|
||||
* testsuite/ld-elf/pr20828-v.od: New test.
|
||||
* testsuite/ld-elf/pr20828-v.ver: New test version script.
|
||||
* testsuite/ld-elf/pr20828-v.ld: New test linker script.
|
||||
* testsuite/ld-elf/pr20828.ld: Add `.gnu.version' and
|
||||
`.gnu.version_d'.
|
||||
* testsuite/ld-elf/shared.exp: Run the new tests.
|
||||
|
||||
2017-02-21 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* testsuite/ld-ifunc/pr18808b.c (bar): Fix compile time warning
|
||||
|
|
9
ld/testsuite/ld-elf/pr20828-d.sd
Normal file
9
ld/testsuite/ld-elf/pr20828-d.sd
Normal file
|
@ -0,0 +1,9 @@
|
|||
# Make sure `vdata' is global rather than local in the dynamic symbol table,
|
||||
# e.g.:
|
||||
# Num: Value Size Type Bind Vis Ndx Name
|
||||
# 1: 00000000 0 OBJECT GLOBAL DEFAULT ABS vdata
|
||||
# vs:
|
||||
# 1: 00000000 0 OBJECT LOCAL DEFAULT ABS vdata
|
||||
#...
|
||||
*[0-9]+: +[0-9a-f]+ +0 +OBJECT +GLOBAL +DEFAULT +ABS +vdata
|
||||
#pass
|
9
ld/testsuite/ld-elf/pr20828-e.sd
Normal file
9
ld/testsuite/ld-elf/pr20828-e.sd
Normal file
|
@ -0,0 +1,9 @@
|
|||
# Make sure `edata' is global rather than local in the dynamic symbol table,
|
||||
# e.g.:
|
||||
# Num: Value Size Type Bind Vis Ndx Name
|
||||
# 1: 00000000 0 NOTYPE GLOBAL DEFAULT 1 edata@@vdata
|
||||
# vs:
|
||||
# 1: 00000000 0 NOTYPE LOCAL DEFAULT 1 edata@@vdata
|
||||
#...
|
||||
*[0-9]+: +[0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +[0-9]+ +edata@@vdata
|
||||
#pass
|
18
ld/testsuite/ld-elf/pr20828-v.ld
Normal file
18
ld/testsuite/ld-elf/pr20828-v.ld
Normal file
|
@ -0,0 +1,18 @@
|
|||
SECTIONS
|
||||
{
|
||||
.hash : { *(.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.gnu.version : { *(.gnu.version) }
|
||||
.gnu.version_d : { *(.gnu.version_d) }
|
||||
.text : { *(.text) }
|
||||
.dynamic : { *(.dynamic) }
|
||||
.data : { *(.data) }
|
||||
.symtab : { *(.symtab) }
|
||||
.strtab : { *(.strtab) }
|
||||
.shstrtab : { *(.shstrtab) }
|
||||
.plt : { *(.plt) }
|
||||
.got.plt : { *(.got.plt) }
|
||||
.got : { *(.got) }
|
||||
/DISCARD/ : { *(*) }
|
||||
}
|
5
ld/testsuite/ld-elf/pr20828-v.od
Normal file
5
ld/testsuite/ld-elf/pr20828-v.od
Normal file
|
@ -0,0 +1,5 @@
|
|||
#...
|
||||
Version definitions:
|
||||
1 0x01 0x0b2e1e3([12]) pr20828-v-\1
|
||||
2 0x00 0x0cc85d2f ver_foo
|
||||
#pass
|
13
ld/testsuite/ld-elf/pr20828-v.s
Normal file
13
ld/testsuite/ld-elf/pr20828-v.s
Normal file
|
@ -0,0 +1,13 @@
|
|||
.text
|
||||
.globl new_foo
|
||||
.type new_foo, %function
|
||||
new_foo:
|
||||
.size new_foo, . - new_foo
|
||||
.symver new_foo, foo@@ver_foo
|
||||
|
||||
.data
|
||||
.globl bar
|
||||
.type bar, %object
|
||||
bar:
|
||||
.dc.a foo
|
||||
.size bar, . - bar
|
1
ld/testsuite/ld-elf/pr20828-v.ver
Normal file
1
ld/testsuite/ld-elf/pr20828-v.ver
Normal file
|
@ -0,0 +1 @@
|
|||
vdata { global: edata; local: *; };
|
|
@ -10,6 +10,8 @@ SECTIONS
|
|||
.hash : { *(.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.gnu.version : { *(.gnu.version) }
|
||||
.gnu.version_d : { *(.gnu.version_d) }
|
||||
.shstrtab : { *(.shstrtab) }
|
||||
.symtab : { *(.symtab) }
|
||||
.strtab : { *(.strtab) }
|
||||
|
|
|
@ -50,6 +50,8 @@ if [istarget "tic6x-*-*"] {
|
|||
# - the shared library symbols have been swept in section garbage collection.
|
||||
# Verify that the symbols are global rather than local and that a version
|
||||
# script adjusts them accordingly.
|
||||
# Also verify that a version definition supplied by an object rather than
|
||||
# a version script and forcibly exported is unaffected by section GC.
|
||||
if { [check_gc_sections_available] } {
|
||||
run_ld_link_tests [list \
|
||||
[list \
|
||||
|
@ -77,7 +79,41 @@ if { [check_gc_sections_available] } {
|
|||
{pr20828.s} \
|
||||
{{readelf --dyn-syms pr20828-b.sd} \
|
||||
{readelf --dyn-syms pr20828-c.sd}} \
|
||||
"pr20828-2.so"]]
|
||||
"pr20828-2.so"] \
|
||||
[list \
|
||||
"PR ld/20828 dynamic symbols with section GC\
|
||||
(versioned shared library)" \
|
||||
"$LFLAGS -shared --gc-sections -T pr20828.ld\
|
||||
--version-script=pr20828-v.ver" \
|
||||
"" "$AFLAGS_PIC" \
|
||||
{pr20828.s} \
|
||||
{{readelf --dyn-syms pr20828-c.sd} \
|
||||
{readelf --dyn-syms pr20828-d.sd} \
|
||||
{readelf --dyn-syms pr20828-e.sd}} \
|
||||
"libpr20828-v.so"] \
|
||||
[list \
|
||||
"PR ld/20828 dynamic symbols with section GC (versioned)" \
|
||||
"$LFLAGS -shared --gc-sections -T pr20828.ld\
|
||||
--version-script=pr20828-v.ver" \
|
||||
"tmpdir/libpr20828-v.so" \
|
||||
"$AFLAGS_PIC" \
|
||||
{pr20828.s} \
|
||||
{{readelf --dyn-syms pr20828-c.sd} \
|
||||
{readelf --dyn-syms pr20828-d.sd} \
|
||||
{readelf --dyn-syms pr20828-e.sd}} \
|
||||
"pr20828-v.so"] \
|
||||
[list \
|
||||
"PR ld/20828 forcibly exported symbol version without section GC" \
|
||||
"$LFLAGS -e foo -E -T pr20828-v.ld" "" "" \
|
||||
{pr20828-v.s} \
|
||||
{{objdump -p pr20828-v.od}} \
|
||||
"pr20828-v-1"] \
|
||||
[list \
|
||||
"PR ld/20828 forcibly exported symbol version with section GC" \
|
||||
"$LFLAGS -e foo --gc-sections -E -T pr20828-v.ld" "" "" \
|
||||
{pr20828-v.s} \
|
||||
{{objdump -p pr20828-v.od}} \
|
||||
"pr20828-v-2"]]
|
||||
}
|
||||
|
||||
# Check to see if the C compiler works
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue