mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-06 12:09:26 +08:00
1f599d0e7b
Always turn hidden and internal symbols which have a dynamic index into local ones. This is required by the the ELF gABI[1]: "A hidden symbol contained in a relocatable object must be either removed or converted to STB_LOCAL binding by the link-editor when the relocatable object is included in an executable file or shared object." "An internal symbol contained in a relocatable object must be either removed or converted to STB_LOCAL binding by the link-editor when the relocatable object is included in an executable file or shared object." The ELF linker usually respects this requirement, however in the case where a dynamic symbol has been preallocated due to a reference of the default export class aka visibility from the object being linked, and then merged with a hidden or internal symbol definition from within the same object, then the original export class is carried over to the output dynamic symbol table, because while merging the generic ELF linker only converts affected dynamic symbols to local when they are defined or referenced by the object being linked and a dynamic object involved in the link both at a time. The dynamic symbol produced confuses then the dynamic loader at the run time -- the hidden or internal export class is ignored and the symbol follows preemption rules as with the default export class. In the MIPS target it happens when `mips_elf_record_global_got_symbol' creates a dynamic symbol when a call relocation is encountered. Additionally if the undefined symbol referred by such a relocation does specify the intended export class, then a local dynamic symbol is created instead, which is harmless and allowed, but useless. Normally no local dynamic symbols are created, except for a single dummy one at the beginning. Correct the problem by removing the extra check for a dynamic symbol being defined or referenced by the object being linked and a dynamic object involved in the link both at a time. The test cases included cover the internal and hidden symbol cases, as well as a protected symbol for a reference, the handling of which is unchanged by this fix. Both cases described above are covered, that is where an internal or hidden dynamic symbol is produced and where a local one is. NB this change affects CRIS results where some symbols in the static table produced in a final link are now converted from STV_HIDDEN to STB_LOCAL. This happens whenever the `elf_backend_hide_symbol' handler is called, so the affected symbols must have been chosen for entering into the dynamic symbol table, except in these test cases no such symbol table is produced. In fully linked binaries the static symbol table is only used for debugging though, so such a change is fine. References: [1] "System V Application Binary Interface - DRAFT - 24 April 2001", The Santa Cruz Operation, Inc., "Symbol Table", <http://www.sco.com/developers/gabi/2001-04-24/ch4.symtab.html> bfd/ PR ld/19908 * elflink.c (elf_link_add_object_symbols): Always turn hidden and internal symbols which have a dynamic index into local ones. ld/ PR ld/19908 * testsuite/ld-cris/tls-e-20.d: Adjust for hidden symbol handling fix. * testsuite/ld-cris/tls-e-20a.d: Likewise. * testsuite/ld-cris/tls-e-21.d: Likewise. * testsuite/ld-cris/tls-e-23.d: Likewise. * testsuite/ld-cris/tls-e-80.d: Likewise. * testsuite/ld-cris/tls-gd-3h.d: Likewise. * testsuite/ld-cris/tls-leie-19.d: Likewise. * testsuite/ld-mips-elf/export-class-ref-lib.sd: New test. * testsuite/ld-mips-elf/export-hidden-ref.sd: New test. * testsuite/ld-mips-elf/export-internal-ref.sd: New test. * testsuite/ld-mips-elf/export-protected-ref.sd: New test. * testsuite/ld-mips-elf/export-class-ref-f0.s: New test source. * testsuite/ld-mips-elf/export-class-ref-f1.s: New test source. * testsuite/ld-mips-elf/export-class-ref-f2.s: New test source. * testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
930 lines
31 KiB
Plaintext
930 lines
31 KiB
Plaintext
# Expect script for MIPS ELF linker tests
|
|
# Copyright (C) 2002-2016 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 "mips*-*-vxworks"]} {
|
|
set mipsvxtests {
|
|
{"VxWorks shared library test 1" "-shared -Tvxworks1.ld" ""
|
|
"-mips2" {vxworks1-lib.s}
|
|
{{readelf --relocs vxworks1-lib.rd} {objdump -dr vxworks1-lib.dd}
|
|
{readelf --symbols vxworks1-lib.nd} {readelf -d vxworks1-lib.td}}
|
|
"libvxworks1.so"}
|
|
{"VxWorks executable test 1 (dynamic)" \
|
|
"tmpdir/libvxworks1.so -Tvxworks1.ld -q --force-dynamic" ""
|
|
"-mips2" {vxworks1.s}
|
|
{{readelf --relocs vxworks1.rd} {objdump -dr vxworks1.dd}}
|
|
"vxworks1"}
|
|
{"VxWorks executable test 2 (dynamic)" \
|
|
"-Tvxworks1.ld -q --force-dynamic" ""
|
|
"-mips2" {vxworks2.s}
|
|
{{readelf --segments vxworks2.sd}}
|
|
"vxworks2"}
|
|
{"VxWorks executable test 2 (static)"
|
|
"-Tvxworks1.ld" ""
|
|
"-mips2" {vxworks2.s}
|
|
{{readelf --segments vxworks2-static.sd}}
|
|
"vxworks2"}
|
|
}
|
|
run_ld_link_tests $mipsvxtests
|
|
run_dump_test "vxworks1-static"
|
|
run_dump_test "vxworks-forced-local-1"
|
|
return
|
|
}
|
|
|
|
if {![istarget mips*-*-*] || ![is_elf_format]} {
|
|
return
|
|
}
|
|
|
|
set has_newabi [expr [istarget *-*-irix6*] \
|
|
|| [istarget mips*-*-linux*] \
|
|
|| [istarget mips*-sde-elf*] \
|
|
|| [istarget mips*-mti-elf*] \
|
|
|| [istarget mips*-img-elf*]]
|
|
set linux_gnu [expr [istarget mips*-*-linux*]]
|
|
set embedded_elf [expr [istarget mips*-*-elf]]
|
|
|
|
# Set defaults.
|
|
set abi_asflags(o32) "-32"
|
|
set abi_asflags(n32) "-march=from-abi -n32 -EB"
|
|
set abi_asflags(n64) "-march=from-abi -64 -EB"
|
|
set abi_ldflags(o32) ""
|
|
set abi_ldflags(n32) -melf32bmipn32
|
|
set abi_ldflags(n64) -melf64bmip
|
|
|
|
# Override as needed.
|
|
if { [istarget *-*-irix6*] } {
|
|
set abi_asflags(o32) "-32 -EB"
|
|
set abi_ldflags(o32) -melf32bsmip
|
|
} elseif { [istarget mips64*-linux*] } {
|
|
set abi_asflags(o32) "-32 -EB"
|
|
set abi_ldflags(o32) -melf32btsmip
|
|
} elseif { [istarget mips64*-*freebsd*] } {
|
|
set abi_asflags(o32) "-32 -EB"
|
|
set abi_ldflags(o32) -melf32btsmip_fbsd
|
|
}
|
|
if { [istarget mips*-*-linux*] || [istarget mips*-sde-elf*]
|
|
|| [istarget mips*-mti-elf*] || [istarget mips*-img-elf*]} {
|
|
set abi_ldflags(n32) -melf32btsmipn32
|
|
set abi_ldflags(n64) -melf64btsmip
|
|
} elseif { [istarget mips64*-*freebsd*] } {
|
|
set abi_ldflags(n32) -melf32btsmipn32_fbsd
|
|
set abi_ldflags(n64) -melf64btsmip_fbsd
|
|
}
|
|
|
|
if { $linux_gnu } {
|
|
run_ld_link_tests [list \
|
|
[list "Dummy shared library for MIPS16 PIC test 1" \
|
|
"-shared -melf32btsmip" "" \
|
|
"-EB -32 -mips1" \
|
|
{ mips16-pic-1-dummy.s } \
|
|
{} \
|
|
"mips16-pic-1-dummy.so"] \
|
|
[list "MIPS16 PIC test 1" \
|
|
"-melf32btsmip -T mips16-pic-1.ld tmpdir/mips16-pic-1-dummy.so" "" \
|
|
"-EB -32 -mips1 -I $srcdir/$subdir" \
|
|
{ mips16-pic-1a.s mips16-pic-1b.s } \
|
|
{ { objdump { -dr -j.text } mips16-pic-1.dd }
|
|
{ readelf -A mips16-pic-1.gd } } \
|
|
"mips16-pic-1"] \
|
|
[list "MIPS16 PIC test 2" \
|
|
"-melf32btsmip -T mips16-pic-1.ld -shared" "" \
|
|
"-EB -32 -mips1 -I $srcdir/$subdir" \
|
|
{ mips16-pic-2a.s mips16-pic-2b.s } \
|
|
{ { objdump { -dr -j.text } mips16-pic-2.dd } \
|
|
{ readelf -A mips16-pic-2.gd } \
|
|
{ readelf --symbols mips16-pic-2.nd } \
|
|
{ readelf --relocs mips16-pic-2.rd } \
|
|
{ readelf -d mips16-pic-2.ad } } \
|
|
"mips16-pic-2"] \
|
|
[list "MIPS16 PIC test 3" \
|
|
"-melf32btsmip -T mips16-pic-1.ld tmpdir/mips16-pic-1-dummy.so" "" \
|
|
"-EB -32 -mips1 -I $srcdir/$subdir" \
|
|
{ mips16-pic-3a.s mips16-pic-3b.s } \
|
|
{ { objdump -dr mips16-pic-3.dd } \
|
|
{ readelf --relocs mips16-pic-3.rd } \
|
|
{ readelf -A mips16-pic-3.gd } } \
|
|
"mips16-pic-3"] \
|
|
[list "MIPS16 PIC test 4 (shared library)" \
|
|
"-shared -melf32btsmip -T mips16-pic-1.ld --version-script mips16-pic-4.ver" "" \
|
|
"-EB -32 -mips1" \
|
|
{ mips16-pic-4a.s mips16-pic-4b.s } \
|
|
{ { objdump -dr mips16-pic-4a.dd } \
|
|
{ readelf --symbols mips16-pic-4a.nd } \
|
|
{ readelf -A mips16-pic-4a.gd } } \
|
|
"mips16-pic-4.so"] \
|
|
[list "MIPS16 PIC test 4 (executable)" \
|
|
"-melf32btsmip -T mips16-pic-1.ld tmpdir/mips16-pic-4.so" "" \
|
|
"-EB -32 -mips1" \
|
|
{ mips16-pic-4c.s } \
|
|
{ { objdump -dr mips16-pic-4b.dd } } \
|
|
"mips16-pic-4"]]
|
|
}
|
|
|
|
# Check MIPS16 markings being passed through link.
|
|
run_dump_test "mips16-1"
|
|
|
|
# MIPS branch offset final link checking.
|
|
run_dump_test "branch-misc-1"
|
|
|
|
# Jalx test
|
|
run_dump_test "jalx-1"
|
|
|
|
if { $linux_gnu } {
|
|
run_ld_link_tests [list \
|
|
[list "Dummy shared library for JALX test 2" \
|
|
"-shared -nostdlib -melf32btsmip" "" \
|
|
"-G0 -EB -mmicromips -no-mdebug -mabi=32 -march=mips32r2 -KPIC" \
|
|
{ jalx-2-printf.s } \
|
|
{} \
|
|
"libjalx-2.so"] \
|
|
[list "Dummy external function for JALX test 2" \
|
|
"-r -melf32btsmip" "" \
|
|
"-G0 -EB -no-mdebug -mabi=32 -march=mips32r2 -mno-shared -call_nonpic" \
|
|
{ jalx-2-ex.s } \
|
|
{} \
|
|
"jalx-2-ex.o.r"] \
|
|
[list "MIPS JALX test 2" \
|
|
"-nostdlib -T jalx-2.ld tmpdir/libjalx-2.so tmpdir/jalx-2-ex.o.r -melf32btsmip" "" \
|
|
"-G0 -EB -mmicromips -no-mdebug -mabi=32 -march=mips32r2 -mno-shared -call_nonpic" \
|
|
{ jalx-2-main.s } \
|
|
{ { objdump -d jalx-2.dd } } \
|
|
"jalx-2"]]
|
|
}
|
|
|
|
# Test multi-got link. We only do this on GNU/Linux because it requires
|
|
# the "traditional" emulations.
|
|
if { $linux_gnu } {
|
|
run_dump_test "multi-got-1"
|
|
run_dump_test "multi-got-no-shared"
|
|
run_dump_test "multi-got-hidden-1"
|
|
run_dump_test "multi-got-hidden-2"
|
|
}
|
|
|
|
# Test __gnu_local_gp accesses
|
|
if { $linux_gnu } {
|
|
run_dump_test "no-shared-1-o32"
|
|
if { $has_newabi } {
|
|
run_dump_test "no-shared-1-n32"
|
|
run_dump_test "no-shared-1-n64"
|
|
}
|
|
}
|
|
|
|
# Test PIE debug dynamic tags
|
|
if { $linux_gnu } {
|
|
run_dump_test "pie-o32"
|
|
if { $has_newabi } {
|
|
run_dump_test "pie-n32"
|
|
run_dump_test "pie-n64"
|
|
}
|
|
}
|
|
|
|
if $has_newabi {
|
|
if { $embedded_elf } {
|
|
run_dump_test "elf-rel-got-n32-embed" \
|
|
[list [list ld $abi_ldflags(n32)]]
|
|
run_dump_test "elf-rel-xgot-n32-embed" \
|
|
[list [list ld $abi_ldflags(n32)]]
|
|
} else {
|
|
run_dump_test "elf-rel-got-n32" [list [list ld $abi_ldflags(n32)]]
|
|
run_dump_test "elf-rel-xgot-n32" [list [list ld $abi_ldflags(n32)]]
|
|
}
|
|
if { $linux_gnu } {
|
|
run_dump_test "elf-rel-got-n64-linux" \
|
|
[list [list ld $abi_ldflags(n64)]]
|
|
run_dump_test "elf-rel-xgot-n64-linux" \
|
|
[list [list ld $abi_ldflags(n64)]]
|
|
} elseif { $embedded_elf } {
|
|
run_dump_test "elf-rel-got-n64-embed" \
|
|
[list [list ld $abi_ldflags(n64)]]
|
|
run_dump_test "elf-rel-xgot-n64-embed" \
|
|
[list [list ld $abi_ldflags(n64)]]
|
|
} else {
|
|
run_dump_test "elf-rel-got-n64" [list [list ld $abi_ldflags(n64)]]
|
|
run_dump_test "elf-rel-xgot-n64" [list [list ld $abi_ldflags(n64)]]
|
|
}
|
|
|
|
run_dump_test "relax-jalr-n32"
|
|
run_dump_test "relax-jalr-n32-shared"
|
|
run_dump_test "relax-jalr-n64"
|
|
run_dump_test "relax-jalr-n64-shared"
|
|
}
|
|
|
|
if { $linux_gnu } {
|
|
run_dump_test "rel32-o32"
|
|
if { $has_newabi } {
|
|
run_dump_test "rel32-n32"
|
|
run_dump_test "rel64"
|
|
}
|
|
# The first test checks that a mixed PIC/non-PIC relocatable link
|
|
# will not introduce any stubs itself, but will flag PIC functions
|
|
# for the final link.
|
|
#
|
|
# The second test checks that we insert stubs for calls from
|
|
# non-PIC functions to PIC functions when linking the original
|
|
# two objects together.
|
|
#
|
|
# The third test checks that we do the same when linking the
|
|
# result of the first link (with no other source files).
|
|
run_ld_link_tests {
|
|
{"PIC and non-PIC test 1 (relocatable)" "-r -melf32btsmip" ""
|
|
"-32 -EB -mips2" {pic-and-nonpic-1a.s pic-and-nonpic-1b.s}
|
|
{{objdump -dr pic-and-nonpic-1-rel.dd}
|
|
{readelf --symbols pic-and-nonpic-1-rel.nd}}
|
|
"pic-and-nonpic-1-rel.o"}
|
|
{"PIC and non-PIC test 1 (static 1)"
|
|
"-melf32btsmip -Tpic-and-nonpic-1.ld" ""
|
|
"-32 -EB -mips2" {pic-and-nonpic-1a.s pic-and-nonpic-1b.s}
|
|
{{objdump -dr pic-and-nonpic-1.dd}
|
|
{readelf --symbols pic-and-nonpic-1.nd}}
|
|
"pic-and-nonpic-1-static1.o"}
|
|
{"PIC and non-PIC test 1 (static 2)"
|
|
"-melf32btsmip -Tpic-and-nonpic-1.ld tmpdir/pic-and-nonpic-1-rel.o" ""
|
|
"" {}
|
|
{{objdump -dr pic-and-nonpic-1.dd}
|
|
{readelf --symbols pic-and-nonpic-1.nd}}
|
|
"pic-and-nonpic-1-static2.o"}
|
|
}
|
|
run_dump_test "pic-and-nonpic-2"
|
|
run_ld_link_tests {
|
|
{"PIC and non-PIC test 3 (shared library)"
|
|
"-melf32btsmip -shared -Tpic-and-nonpic-3a.ld" ""
|
|
"-32 -EB -mips2" {pic-and-nonpic-3a.s}
|
|
{{readelf --segments pic-and-nonpic-3a.sd}
|
|
{readelf -A pic-and-nonpic-3a.gd}
|
|
{objdump -dr pic-and-nonpic-3a.dd}}
|
|
"pic-and-nonpic-3a.so"}
|
|
{"PIC and non-PIC test 3 (executable)"
|
|
"-melf32btsmip -Tpic-and-nonpic-3b.ld tmpdir/pic-and-nonpic-3a.so" ""
|
|
"-32 -EB -mips2" {pic-and-nonpic-3b.s}
|
|
{{readelf --segments pic-and-nonpic-3b.sd}
|
|
{objdump -dr pic-and-nonpic-3b.dd}
|
|
{objdump {-s -j.got.plt} pic-and-nonpic-3b.pd}
|
|
{readelf -A pic-and-nonpic-3b.gd}
|
|
{readelf --relocs pic-and-nonpic-3b.rd}
|
|
{readelf --symbols pic-and-nonpic-3b.nd}
|
|
{readelf -d pic-and-nonpic-3b.ad}}
|
|
"pic-and-nonpic-3b"}
|
|
}
|
|
run_dump_test "pic-and-nonpic-3-error"
|
|
run_ld_link_tests {
|
|
{"PIC and non-PIC test 4 (shared library)"
|
|
"-melf32btsmip -shared -Tpic-and-nonpic-3a.ld" ""
|
|
"-32 -EB -mips2" {pic-and-nonpic-4a.s}
|
|
{}
|
|
"pic-and-nonpic-4a.so"}
|
|
{"PIC and non-PIC test 4 (executable)"
|
|
"-melf32btsmip -Tpic-and-nonpic-4b.ld tmpdir/pic-and-nonpic-4a.so" ""
|
|
"-32 -EB -mips2" {pic-and-nonpic-4b.s}
|
|
{{readelf --segments pic-and-nonpic-4b.sd}
|
|
{objdump -dr pic-and-nonpic-4b.dd}
|
|
{objdump {-s -j.got -j.data} pic-and-nonpic-4b.gd}
|
|
{readelf --relocs pic-and-nonpic-4b.rd}
|
|
{readelf --symbols pic-and-nonpic-4b.nd}
|
|
{readelf -d pic-and-nonpic-4b.ad}}
|
|
"pic-and-nonpic-4b"}
|
|
}
|
|
run_dump_test "pic-and-nonpic-4-error"
|
|
run_ld_link_tests {
|
|
{"PIC and non-PIC test 5 (executable)"
|
|
"-melf32btsmip -Tpic-and-nonpic-5b.ld tmpdir/pic-and-nonpic-3a.so tmpdir/pic-and-nonpic-4a.so" ""
|
|
"-32 -EB -mips2" {pic-and-nonpic-5a.s pic-and-nonpic-5b.s}
|
|
{{readelf --segments pic-and-nonpic-5b.sd}
|
|
{objdump -dr pic-and-nonpic-5b.dd}
|
|
{objdump {-s -j.got.plt -j.data} pic-and-nonpic-5b.pd}
|
|
{readelf -A pic-and-nonpic-5b.gd}
|
|
{readelf --relocs pic-and-nonpic-5b.rd}
|
|
{readelf --symbols pic-and-nonpic-5b.nd}
|
|
{readelf -d pic-and-nonpic-5b.ad}}
|
|
"pic-and-nonpic-5b"}
|
|
}
|
|
set abis { o32 -32 elf32btsmip }
|
|
if $has_newabi {
|
|
lappend abis n32 -n32 elf32btsmipn32
|
|
lappend abis n64 -64 elf64btsmip
|
|
}
|
|
foreach { abi flag emul } $abis {
|
|
run_ld_link_tests [list \
|
|
[list "PIC and non-PIC test 6 ($abi shared library)" \
|
|
"-m$emul -shared -Tpic-and-nonpic-3a.ld" "" \
|
|
"$flag -EB -mips3" \
|
|
[list "pic-and-nonpic-6-${abi}a.s"] {} \
|
|
"pic-and-nonpic-6-${abi}.so"] \
|
|
[list "PIC and non-PIC test 6 ($abi executable)" \
|
|
"-m$emul -Tpic-and-nonpic-6.ld tmpdir/pic-and-nonpic-6-${abi}.so" "" \
|
|
"$flag -EB -mips3" \
|
|
[list "pic-and-nonpic-6-${abi}b.s" \
|
|
"pic-and-nonpic-6-${abi}c.s"] \
|
|
[list "readelf {--wide --segments} pic-and-nonpic-6-${abi}.sd" \
|
|
"objdump -dr pic-and-nonpic-6-${abi}.dd" \
|
|
"objdump {-s -j.got.plt} pic-and-nonpic-6-${abi}.pd" \
|
|
"readelf -A pic-and-nonpic-6-${abi}.gd" \
|
|
"readelf --relocs pic-and-nonpic-6-${abi}.rd" \
|
|
"readelf --symbols pic-and-nonpic-6-${abi}.nd" \
|
|
"readelf -d pic-and-nonpic-6-${abi}.ad"] \
|
|
"pic-and-nonpic-6-${abi}"]]
|
|
|
|
# This checks whether our linker scripts get the scope of _gp right,
|
|
# and must therefore use default scripts. If they don't, then -- in
|
|
# addition to dumps failing to match -- the final link fails with:
|
|
#
|
|
# ld: gp-hidden.o: undefined reference to symbol '_gp'
|
|
# ld: note: '_gp' is defined in DSO ./tmpdir/gp-hidden-lib-${abi}.so
|
|
# so try adding it to the linker command line
|
|
#
|
|
set suff64 [string map {o32 "" n32 "" n64 -64} $abi]
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"_gp scope test ($abi shared library)" \
|
|
"$abi_ldflags($abi) -shared" "" \
|
|
"$abi_asflags($abi) -KPIC" \
|
|
{ gp-hidden-lib.s } \
|
|
[list \
|
|
"readelf --relocs gp-hidden-lib${suff64}.rd" \
|
|
"readelf --syms gp-hidden.sd"] \
|
|
"gp-hidden-lib-${abi}.so"] \
|
|
[list \
|
|
"_gp scope test ($abi versioned library)" \
|
|
"$abi_ldflags($abi) -shared -version-script gp-hidden-ver.ver tmpdir/gp-hidden-lib-${abi}.so" "" \
|
|
"$abi_asflags($abi) -KPIC" \
|
|
{ gp-hidden-ver.s } \
|
|
[list \
|
|
"readelf --relocs gp-hidden-ver${suff64}.rd" \
|
|
"readelf --syms gp-hidden.sd"] \
|
|
"gp-hidden-ver-${abi}.so"] \
|
|
[list \
|
|
"_gp scope test ($abi executable)" \
|
|
"$abi_ldflags($abi) -e 0 -rpath-link . tmpdir/gp-hidden-ver-${abi}.so" "" \
|
|
"$abi_asflags($abi) -call_nonpic" \
|
|
{ gp-hidden.s } \
|
|
[list \
|
|
"readelf --relocs gp-hidden${suff64}.rd" \
|
|
"readelf --syms gp-hidden.sd"] \
|
|
"gp-hidden-${abi}"]]
|
|
}
|
|
}
|
|
|
|
if { $embedded_elf } {
|
|
run_dump_test "region1"
|
|
}
|
|
|
|
if $embedded_elf {
|
|
# This could work on other targets too, but would need the appropriate
|
|
# ld -m switch.
|
|
run_dump_test "reloc-1-rel"
|
|
}
|
|
if $has_newabi {
|
|
run_dump_test "reloc-1-n32" [list [list ld $abi_ldflags(n32)]]
|
|
run_dump_test "reloc-1-n64" [list [list ld $abi_ldflags(n64)]]
|
|
}
|
|
run_dump_test "reloc-2"
|
|
run_dump_test "reloc-merge-lo16"
|
|
run_dump_test "reloc-3"
|
|
if {$has_newabi} {
|
|
run_dump_test "reloc-3-n32"
|
|
}
|
|
run_dump_test "reloc-4"
|
|
run_dump_test "reloc-5"
|
|
if { $has_newabi } {
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"reloc test 6a" \
|
|
"-shared $abi_ldflags(n32)" "" \
|
|
"$abi_asflags(n32)" \
|
|
"reloc-6a.s" \
|
|
{} \
|
|
"reloc-6a.so"] \
|
|
[list \
|
|
"reloc test 6b" \
|
|
"$abi_ldflags(n32) tmpdir/reloc-6a.so" "" \
|
|
"$abi_asflags(n32)" \
|
|
"reloc-6b.s" \
|
|
{} \
|
|
"reloc-6b"]]
|
|
}
|
|
|
|
if {$has_newabi && $linux_gnu} {
|
|
run_dump_test "eh-frame1-n32"
|
|
run_dump_test "eh-frame1-n64"
|
|
run_dump_test "eh-frame2-n32"
|
|
run_dump_test "eh-frame2-n64"
|
|
}
|
|
if {$embedded_elf} {
|
|
run_dump_test "eh-frame3"
|
|
run_dump_test "eh-frame4"
|
|
}
|
|
if {$linux_gnu} {
|
|
set eh_frame5_test {
|
|
{"MIPS eh-frame 5"
|
|
"-melf32btsmip -shared -Teh-frame5.ld" ""
|
|
"-32 -EB"
|
|
{eh-frame5.s}
|
|
{{readelf {--relocs -wf} eh-frame5.d}}
|
|
"eh-frame5.so"}
|
|
}
|
|
run_ld_link_tests $eh_frame5_test
|
|
}
|
|
|
|
if {$embedded_elf} {
|
|
run_dump_test "compact-eh1"
|
|
run_dump_test "compact-eh2"
|
|
run_dump_test "compact-eh3"
|
|
}
|
|
|
|
if {$linux_gnu} {
|
|
run_dump_test "compact-eh4"
|
|
run_dump_test "compact-eh5"
|
|
run_dump_test "compact-eh6"
|
|
}
|
|
|
|
run_dump_test "jaloverflow"
|
|
run_dump_test "jaloverflow-2"
|
|
run_dump_test "undefweak-overflow" [list [list as $abi_asflags(o32)] \
|
|
[list ld $abi_ldflags(o32)]]
|
|
|
|
if {$has_newabi} {
|
|
run_dump_test "undefweak-overflow" [list [list as $abi_asflags(n32)] \
|
|
[list ld $abi_ldflags(n32)]]
|
|
run_dump_test "undefweak-overflow" [list [list as $abi_asflags(n64)] \
|
|
[list ld $abi_ldflags(n64)]]
|
|
}
|
|
|
|
if {$has_newabi} {
|
|
run_dump_test "jalbal" [list [list ld $abi_ldflags(n32)]]
|
|
}
|
|
|
|
run_dump_test "mode-change-error-1"
|
|
|
|
run_dump_test "mips16-hilo"
|
|
if {$has_newabi} {
|
|
run_dump_test "mips16-hilo-n32"
|
|
}
|
|
|
|
if { $linux_gnu } {
|
|
if { $has_newabi } {
|
|
run_dump_test "textrel-1"
|
|
}
|
|
run_dump_test "got-page-1"
|
|
if $has_newabi {
|
|
run_dump_test "got-page-2"
|
|
run_dump_test "dyn-sec64"
|
|
}
|
|
run_dump_test "got-page-3"
|
|
run_ld_link_tests [subst {
|
|
{"GOT page 4 (one file)" "-shared $abi_ldflags(o32) -T got-page-1.ld"
|
|
"" "$abi_asflags(o32) -mips2" {got-page-4b.s}
|
|
{{objdump -dr got-page-4a.d}
|
|
{readelf -A got-page-4a.got}}
|
|
"got-page-4a.so"}
|
|
{"GOT page 4 (two files)" "-shared $abi_ldflags(o32) -T got-page-1.ld"
|
|
"" "$abi_asflags(o32) -mips2" {got-page-4a.s got-page-4b.s}
|
|
{{objdump -dr got-page-4b.d}
|
|
{readelf -A got-page-4b.got}}
|
|
"got-page-4b.so"}
|
|
}]
|
|
if $has_newabi {
|
|
run_ld_link_tests [subst {
|
|
{"GOT page 5" "-shared $abi_ldflags(n32) -T got-page-1.ld"
|
|
"" "$abi_asflags(n32)" {got-page-5.s}
|
|
{{objdump -dr got-page-5.d}
|
|
{readelf -A got-page-5.got}}
|
|
"got-page-5.so"}
|
|
{"GOT page 6" "-shared $abi_ldflags(n32) -T got-page-1.ld"
|
|
"" "$abi_asflags(n32)" {got-page-6.s}
|
|
{{objdump -dr got-page-6.d}
|
|
{readelf -A got-page-6.got}}
|
|
"got-page-6.so"}
|
|
{"GOT page 7 (order 1)" "-shared $abi_ldflags(n32) -T got-page-1.ld"
|
|
"" "$abi_asflags(n32)"
|
|
{got-page-7a.s got-page-7b.s got-page-7c.s got-page-7d.s
|
|
got-page-7e.s}
|
|
{{objdump -dr got-page-7.d}
|
|
{readelf -A got-page-7.got}}
|
|
"got-page-7a.so"}
|
|
{"GOT page 7 (order 2)" "-shared $abi_ldflags(n32) -T got-page-1.ld"
|
|
"" "$abi_asflags(n32)"
|
|
{got-page-7e.s got-page-7a.s got-page-7b.s got-page-7c.s
|
|
got-page-7d.s}
|
|
{{objdump -dr got-page-7.d}
|
|
{readelf -A got-page-7.got}}
|
|
"got-page-7b.so"}
|
|
}]
|
|
}
|
|
run_dump_test "got-dump-1"
|
|
if $has_newabi {
|
|
run_dump_test "got-dump-2"
|
|
}
|
|
run_dump_test "reloc-estimate-1"
|
|
}
|
|
|
|
if $has_newabi {
|
|
run_dump_test "emit-relocs-1"
|
|
}
|
|
|
|
run_dump_test "hash1a"
|
|
run_dump_test "hash1b"
|
|
run_dump_test "hash1c"
|
|
|
|
if {[istarget mips*-*-linux*]} {
|
|
# The number of symbols that are always included in the symbol table
|
|
# for these tests. The 4 are:
|
|
#
|
|
# the null symbol entry
|
|
# the .MIPS.stubs section symbol
|
|
set base_syms 2
|
|
foreach dynsym { 7fff 8000 fff0 10000 2fe80 } {
|
|
run_ld_link_tests \
|
|
[list [list \
|
|
"Stub for dynsym 0x$dynsym" \
|
|
"-shared -melf32btsmip -T stub-dynsym-1.ld" "" \
|
|
[concat \
|
|
"-EB -march=mips1 -32 -KPIC" \
|
|
"--defsym base_syms=$base_syms" \
|
|
"--defsym dynsym=0x$dynsym"] \
|
|
[list "stub-dynsym-1.s"] \
|
|
[list [list \
|
|
"objdump" "-dz" \
|
|
"stub-dynsym-1-$dynsym.d"]] \
|
|
"stub-dynsym-1-$dynsym"]]
|
|
}
|
|
}
|
|
|
|
# For tests which may involve multiple files, use run_ld_link_tests.
|
|
|
|
# List contains test-items with 3 items followed by 2 lists:
|
|
# 0:name 1:ld early options 2:ld late options 3:assembler options
|
|
# 4:filenames of assembler files 5: action and options. 6: name of output file
|
|
|
|
# Actions:
|
|
# objdump: Apply objdump options on result. Compare with regex (last arg).
|
|
# nm: Apply nm options on result. Compare with regex (last arg).
|
|
# readelf: Apply readelf options on result. Compare with regex (last arg).
|
|
|
|
set mips_tls_tests {
|
|
{"Static executable with TLS" "-static -melf32btsmip -T mips-dyn.ld" ""
|
|
"-EB -march=mips1 -32 -KPIC" {tlsbin-o32.s}
|
|
{{objdump {-dr -m mips:isa32r2} tlsbin-o32.d} {objdump -srj.got tlsbin-o32.got}}
|
|
"tls-static-o32"}
|
|
{"Shared library with TLS" "-shared -melf32btsmip -T mips-lib.ld" ""
|
|
"-EB -march=mips1 -32 -KPIC" {tlslib-o32.s}
|
|
{{objdump {-dr -m mips:isa32r2} tlslib-o32.d} {objdump -Rsj.got tlslib-o32.got}}
|
|
"tlslib-o32.so"}
|
|
{"Dynamic executable with TLS"
|
|
"-melf32btsmip -T mips-dyn.ld tmpdir/tlslib-o32.so" ""
|
|
"-EB -march=mips1 -32 -KPIC" {tlsdyn-o32.s}
|
|
{{objdump {-dr -m mips:isa32r2} tlsdyn-o32.d} {objdump -Rsj.got tlsdyn-o32.got}}
|
|
"tls-dynamic-o32"}
|
|
{"Shared library with multiple GOTs and TLS"
|
|
"-shared -melf32btsmip -T mips-lib.ld" ""
|
|
"-EB -march=mips1 -32 -KPIC" {tls-multi-got-1-1.s tls-multi-got-1-2.s}
|
|
{{readelf {-d -r} tls-multi-got-1.r}
|
|
{objdump {-dr -m mips:isa32r2} tls-multi-got-1.d}
|
|
{objdump -Rsj.got tls-multi-got-1.got}}
|
|
"tlslib-multi.so"}
|
|
{"Shared library with TLS and versioning"
|
|
"-shared -melf32btsmip -T mips-lib.ld --version-script tlslib.ver" ""
|
|
"-EB -march=mips1 -32 -KPIC" {tlslib-o32.s}
|
|
{{objdump {-dr -m mips:isa32r2} tlslib-o32.d} {objdump -Rsj.got tlslib-o32-ver.got}}
|
|
"tlslib-o32-ver.so"}
|
|
{"Dynamic executable with TLS and versioning"
|
|
"-melf32btsmip -T mips-dyn.ld tmpdir/tlslib-o32-ver.so" ""
|
|
"-EB -march=mips1 -32 -KPIC" {tlsdyn-o32.s tlsdyn-o32-2.s}
|
|
{{objdump {-dr -m mips:isa32r2} tlsdyn-o32-1.d} {objdump -Rsj.got tlsdyn-o32-1.got}}
|
|
"tls-dynamic-o32-ver"}
|
|
{"Dynamic executable with TLS and versioning (order 2)"
|
|
"-melf32btsmip -T mips-dyn.ld tmpdir/tlsdyn-o32.o tmpdir/tlslib-o32-ver.so tmpdir/tlsdyn-o32-2.o" ""
|
|
"-EB -march=mips1 -32 -KPIC" {}
|
|
{{objdump {-dr -m mips:isa32r2} tlsdyn-o32-2.d} {objdump -Rsj.got tlsdyn-o32-2.got}}
|
|
"tls-dynamic-o32-ver-2"}
|
|
{"Dynamic executable with TLS and versioning (order 3)"
|
|
"-melf32btsmip -T mips-dyn.ld tmpdir/tlsdyn-o32-2.o tmpdir/tlslib-o32-ver.so tmpdir/tlsdyn-o32.o" ""
|
|
"-EB -march=mips1 -32 -KPIC" {}
|
|
{{objdump {-dr -m mips:isa32r2} tlsdyn-o32-3.d} {objdump -Rsj.got tlsdyn-o32-3.got}}
|
|
"tls-dynamic-o32-ver-3"}
|
|
{"Shared library with TLS and hidden symbols"
|
|
"-shared -melf32btsmip -T mips-lib.ld --version-script tlslib-hidden.ver" ""
|
|
"-EB -march=mips1 -32 -KPIC" {tlslib-o32.s}
|
|
{{objdump {-dr -m mips:isa32r2} tlslib-o32.d} {objdump -Rsj.got tlslib-o32-hidden.got}}
|
|
"tlslib-o32-hidden.so"}
|
|
{"Shared library with TLS and hidden symbols (2)"
|
|
"-shared -melf32btsmip -T mips-lib.ld" ""
|
|
"-EB -march=mips1 -32 -KPIC" {tls-hidden2a.s tls-hidden2b.s}
|
|
{{objdump -drj.text tls-hidden2.d} {objdump -sj.got tls-hidden2-got.d}}
|
|
"tls-hidden2.so"}
|
|
{"Shared library with TLS and hidden symbols (3)"
|
|
"-shared -melf32btsmip -T tls-hidden3.ld" ""
|
|
"-EB -march=mips2 -32 -KPIC" {tls-hidden3a.s tls-hidden3b.s}
|
|
{{objdump -dj.text tls-hidden3.d} {objdump -sj.got tls-hidden3.got}
|
|
{readelf --relocs tls-hidden3.r}}
|
|
"tls-hidden3.so"}
|
|
{"Shared library with TLS and hidden symbols (4)"
|
|
"-shared -melf32btsmip -T tls-hidden3.ld" ""
|
|
"-EB -march=mips2 -32 -KPIC" {tls-hidden4a.s tls-hidden4b.s}
|
|
{{objdump -sj.got tls-hidden4.got} {readelf --relocs tls-hidden4.r}}
|
|
"tls-hidden4.so"}
|
|
}
|
|
|
|
if {[istarget mips*-*-linux*]} {
|
|
run_ld_link_tests $mips_tls_tests
|
|
}
|
|
|
|
set mips16_call_global_test [list \
|
|
[list "Global calls from mips16" \
|
|
"$abi_ldflags(o32) -T no-shared-1.ld" "" \
|
|
"$abi_asflags(o32) -mips32r2" \
|
|
{mips16-call-global-1.s mips16-call-global-2.s mips16-call-global-3.s} \
|
|
{{objdump -dr mips16-call-global.d}} \
|
|
"mips16-call-global"]]
|
|
|
|
run_ld_link_tests $mips16_call_global_test
|
|
|
|
set mips16_intermix_test [list \
|
|
[list "Intermixing mips32 and mips16 functions" \
|
|
"$abi_ldflags(o32)" "" \
|
|
"$abi_asflags(o32) -mips32r2" \
|
|
{mips16-intermix-1.s mips16-intermix-2.s} \
|
|
{{objdump -t mips16-intermix.d}} \
|
|
"mips16-intermix"]]
|
|
|
|
run_ld_link_tests $mips16_intermix_test
|
|
|
|
run_dump_test "mips16-local-stubs-1"
|
|
|
|
set mips16_fp_stub_test [list \
|
|
[list "Floating-point stub for mips16 functions" \
|
|
"$abi_ldflags(o32)" "" \
|
|
"$abi_asflags(o32) -mips32r2" \
|
|
{mips16-fp-stub-1.s mips16-fp-stub-2.s} \
|
|
{{readelf --debug-dump=frames mips16-fp-stub.d}} \
|
|
"mips16-fp-stub"]]
|
|
|
|
run_ld_link_tests $mips16_fp_stub_test
|
|
|
|
set o32flagslist [list [list as $abi_asflags(o32)] [list ld $abi_ldflags(o32)]]
|
|
|
|
foreach firstfpabi [list 0 1 2 3 4 5 6 7 ] {
|
|
foreach secondfpabi [list 4 5 6 7 ] {
|
|
run_dump_test "attr-gnu-4-${firstfpabi}${secondfpabi}" $o32flagslist
|
|
}
|
|
}
|
|
foreach firstfpabi [list 4 5 6 7 ] {
|
|
foreach secondfpabi [list 0 1 2 3 8 9] {
|
|
run_dump_test "attr-gnu-4-${firstfpabi}${secondfpabi}" $o32flagslist
|
|
}
|
|
}
|
|
foreach firstfpabi [list 0 1 2 3 ] {
|
|
foreach secondfpabi [list 0 1 2 3 8 9] {
|
|
run_dump_test "attr-gnu-4-${firstfpabi}${secondfpabi}"
|
|
}
|
|
}
|
|
|
|
run_dump_test "attr-gnu-4-81"
|
|
|
|
run_dump_test "attr-gnu-8-00"
|
|
run_dump_test "attr-gnu-8-01"
|
|
run_dump_test "attr-gnu-8-02"
|
|
run_dump_test "attr-gnu-8-10"
|
|
run_dump_test "attr-gnu-8-11"
|
|
run_dump_test "attr-gnu-8-12"
|
|
run_dump_test "attr-gnu-8-20"
|
|
run_dump_test "attr-gnu-8-21"
|
|
run_dump_test "attr-gnu-8-22"
|
|
|
|
run_dump_test "attr-gnu-4-0-ph" $o32flagslist
|
|
run_dump_test "attr-gnu-4-1-ph" $o32flagslist
|
|
run_dump_test "attr-gnu-4-2-ph" $o32flagslist
|
|
run_dump_test "attr-gnu-4-3-ph" $o32flagslist
|
|
run_dump_test "attr-gnu-4-4-ph" $o32flagslist
|
|
run_dump_test "attr-gnu-4-5-ph" $o32flagslist
|
|
run_dump_test "attr-gnu-4-6-ph" $o32flagslist
|
|
run_dump_test "attr-gnu-4-7-ph" $o32flagslist
|
|
|
|
if $has_newabi {
|
|
run_dump_test "attr-gnu-4-0-n32-ph"
|
|
run_dump_test "attr-gnu-4-1-n32-ph"
|
|
run_dump_test "attr-gnu-4-2-n32-ph"
|
|
run_dump_test "attr-gnu-4-3-n32-ph"
|
|
run_dump_test "attr-gnu-4-0-n64-ph"
|
|
run_dump_test "attr-gnu-4-1-n64-ph"
|
|
run_dump_test "attr-gnu-4-2-n64-ph"
|
|
run_dump_test "attr-gnu-4-3-n64-ph"
|
|
}
|
|
|
|
run_dump_test "abiflags-strip1-ph" $o32flagslist
|
|
run_dump_test "abiflags-strip2-ph" $o32flagslist
|
|
run_dump_test "abiflags-strip3-ph" $o32flagslist
|
|
run_dump_test "abiflags-strip4-ph" $o32flagslist
|
|
run_dump_test "abiflags-strip5-ph" $o32flagslist
|
|
run_dump_test "abiflags-strip6-ph" $o32flagslist
|
|
run_dump_test "abiflags-strip7-ph" $o32flagslist
|
|
run_dump_test "abiflags-strip8-ph" $o32flagslist
|
|
run_dump_test "abiflags-strip9-ph" $o32flagslist
|
|
run_dump_test "abiflags-strip10-ph" $o32flagslist
|
|
|
|
run_dump_test "nan-legacy"
|
|
run_dump_test "nan-2008"
|
|
run_dump_test "nan-mixed-1"
|
|
run_dump_test "nan-mixed-2"
|
|
|
|
if { $linux_gnu } {
|
|
run_ld_link_tests {
|
|
{"GOT and versioning 1"
|
|
"-shared -melf32btsmip --version-script got-vers-1.ver" ""
|
|
"-EB -mips2 -32" {got-vers-1a.s got-vers-1b.s}
|
|
{{readelf -d got-vers-1.dd}
|
|
{readelf --symbols got-vers-1.sd}
|
|
{readelf --relocs got-vers-1.rd}}
|
|
"got-vers-1.so"}
|
|
}
|
|
}
|
|
|
|
run_dump_test "undefined"
|
|
|
|
# Test the conversion from jr to b
|
|
if { $linux_gnu } {
|
|
run_dump_test "jr-to-b-1"
|
|
run_dump_test "jr-to-b-2"
|
|
}
|
|
|
|
# MIPS16 and microMIPS interlinking test.
|
|
run_dump_test "mips16-and-micromips"
|
|
|
|
# Export class call relocation tests.
|
|
set abis [concat o32 [expr {$has_newabi ? "n32 n64" : ""}]]
|
|
foreach { abi } $abis {
|
|
set loadaddr [string map \
|
|
{o32 0x12340000 n32 0x12340000 n64 0x123456789abc0000} $abi]
|
|
set suff [subst \
|
|
[expr { [istarget *-*-irix*] \
|
|
? [string map {o32 o32-irix n32 n32 n64 n64} $abi] \
|
|
: $abi }]]
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"MIPS export class call relocation test ($abi)" \
|
|
"$abi_ldflags($abi) -shared -Ttext $loadaddr -T export-class-call16.ld" "" \
|
|
"$abi_asflags($abi) -mips3 -KPIC" \
|
|
[list export-class-call16-${abi}.s export-class-call16-def.s] \
|
|
[list \
|
|
"objdump -d export-class-call16-${suff}.dd" \
|
|
"readelf -A export-class-call16-${abi}.gd"] \
|
|
"export-class-call16-${abi}.so"]]
|
|
}
|
|
|
|
# Magic __ehdr_start symbol tests.
|
|
set abis [concat o32 [expr {$has_newabi ? "n32 n64" : ""}]]
|
|
foreach { abi } $abis {
|
|
set suff [string map {o32 o32 n32 new n64 new} $abi]
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"MIPS magic __ehdr_start symbol test 1 ($abi)" \
|
|
"$abi_ldflags($abi) -T ehdr_start-1.ld" "" \
|
|
"$abi_asflags($abi)" \
|
|
[list ehdr_start-${suff}.s] \
|
|
[list "readelf -s ehdr_start-1.nd"] \
|
|
"ehdr_start-1-${abi}"]]
|
|
if [regexp "(?:n32|n64)" "$abi"] {
|
|
setup_kfail "mips*-*-*" "ld/15428"
|
|
}
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"MIPS magic __ehdr_start symbol test 2 ($abi)" \
|
|
"$abi_ldflags($abi) -T ehdr_start-2.ld" "" \
|
|
"$abi_asflags($abi)" \
|
|
[list ehdr_start-${suff}.s] \
|
|
[list "readelf -s ehdr_start-2.nd"] \
|
|
"ehdr_start-2-${abi}"]]
|
|
}
|
|
|
|
# R_MIPS_JALR reloc tests.
|
|
set abis [concat o32 [expr {$has_newabi ? "n32 n64" : ""}]]
|
|
foreach { abi } $abis {
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"MIPS JALR reloc test ($abi)" \
|
|
"$abi_ldflags($abi) -T jalr3.ld" "" \
|
|
"$abi_asflags($abi)" \
|
|
[list ../../../gas/testsuite/gas/mips/jalr3.s] \
|
|
[list "objdump -d jalr3.dd"] \
|
|
"jalr3-${abi}"]]
|
|
}
|
|
|
|
proc build_mips_plt_lib { abi } {
|
|
global abi_asflags
|
|
global abi_ldflags
|
|
|
|
run_ld_link_tests [list \
|
|
[list "Shared $abi library for compressed PLT tests" \
|
|
"-shared $abi_ldflags($abi)" "" \
|
|
"$abi_asflags($abi)" \
|
|
{ compressed-plt-1-dyn.s } \
|
|
{} \
|
|
"compressed-plt-1-${abi}-dyn.so"]]
|
|
}
|
|
|
|
proc run_mips_plt_test { name abi filter micromips suffix {extra {}} } {
|
|
global abi_asflags
|
|
global abi_ldflags
|
|
|
|
set as_flags "$abi_asflags($abi) --defsym filter=$filter"
|
|
append as_flags " --defsym micromips=$micromips --defsym $abi=1"
|
|
if {[string equal $abi o32]} {
|
|
append as_flags " -march=mips2"
|
|
}
|
|
set ld_flags "$abi_ldflags($abi) -T compressed-plt-1.ld"
|
|
set dynobj "tmpdir/compressed-plt-1-${abi}-dyn.so"
|
|
set files [list]
|
|
if { $filter & 3 } {
|
|
lappend files compressed-plt-1a.s
|
|
}
|
|
if { $filter & 12 } {
|
|
lappend files compressed-plt-1b.s
|
|
}
|
|
if { $filter & 16 } {
|
|
lappend files compressed-plt-1c.s
|
|
}
|
|
eval [list lappend files] $extra
|
|
set readelf_flags "-A --syms --relocs -d"
|
|
if { [string match "*word*" $suffix] } {
|
|
append readelf_flags " -x.data"
|
|
}
|
|
set objdump_flags "-d -Mgpr-names=numeric"
|
|
set basename "compressed-plt-1-${abi}-${suffix}"
|
|
run_ld_link_tests [list \
|
|
[list "$name" $ld_flags $dynobj \
|
|
"$as_flags" $files \
|
|
[list [list readelf $readelf_flags ${basename}.rd] \
|
|
[list objdump $objdump_flags ${basename}.od]] \
|
|
$basename]]
|
|
}
|
|
|
|
if { $linux_gnu } {
|
|
build_mips_plt_lib o32
|
|
run_mips_plt_test "o32 PLTs for standard encoding" o32 28 0 se
|
|
run_mips_plt_test "o32 PLTs for MIPS16 encoding" o32 19 0 mips16-only
|
|
run_mips_plt_test "o32 PLTs for microMIPS encoding" o32 19 1 umips-only
|
|
run_mips_plt_test "o32 PLTs for mixed MIPS and MIPS16" \
|
|
o32 -1 0 mips16
|
|
run_mips_plt_test "o32 PLTs for mixed MIPS and MIPS16 with %got" \
|
|
o32 -1 0 mips16-got compressed-plt-1d.s
|
|
run_mips_plt_test "o32 PLTs for mixed MIPS and MIPS16 with .word" \
|
|
o32 -1 0 mips16-word compressed-plt-1e.s
|
|
run_mips_plt_test "o32 PLTs for mixed MIPS and microMIPS" \
|
|
o32 -1 1 umips
|
|
run_mips_plt_test "o32 PLTs for mixed MIPS and microMIPS with %got" \
|
|
o32 -1 1 umips-got compressed-plt-1d.s
|
|
run_mips_plt_test "o32 PLTs for mixed MIPS and microMIPS with .word" \
|
|
o32 -1 1 umips-word compressed-plt-1e.s
|
|
|
|
if $has_newabi {
|
|
build_mips_plt_lib n32
|
|
run_mips_plt_test "n32 PLTs for mixed MIPS and MIPS16" \
|
|
n32 -1 0 mips16
|
|
run_mips_plt_test "n32 PLTs for mixed MIPS and microMIPS" \
|
|
n32 -1 1 umips
|
|
}
|
|
}
|
|
|
|
# PR ld/19908 export class tests.
|
|
if { $linux_gnu } {
|
|
run_ld_link_tests [list \
|
|
[list "Shared library for MIPS export class symbol reference tests" \
|
|
"$abi_ldflags(o32) -shared" "" \
|
|
"$abi_asflags(o32)" \
|
|
{ export-class-ref-f2.s } \
|
|
{ { readelf --dyn-syms export-class-ref-lib.sd } } \
|
|
"export-class-ref-lib.so"]]
|
|
foreach { class flag } { internal 1 hidden 2 protected 3 } {
|
|
run_ld_link_tests [list \
|
|
[list "MIPS $class symbol reference test 1" \
|
|
"$abi_ldflags(o32) -e f0" "tmpdir/export-class-ref-lib.so" \
|
|
"$abi_asflags(o32) --defsym defv=$flag" \
|
|
{ export-class-ref-f0.s export-class-ref-f1.s } \
|
|
[list [list readelf --dyn-syms export-$class-ref.sd] \
|
|
[list readelf --dyn-syms export-local-ref.sd]] \
|
|
"export-$class-ref"] \
|
|
[list "MIPS $class symbol reference test 2" \
|
|
"$abi_ldflags(o32) -e f0" "tmpdir/export-class-ref-lib.so" \
|
|
"$abi_asflags(o32) --defsym defv=$flag --defsym refv=$flag" \
|
|
{ export-class-ref-f0.s export-class-ref-f1.s } \
|
|
[list [list readelf --dyn-syms export-$class-ref.sd] \
|
|
[list readelf --dyn-syms export-local-ref.sd]] \
|
|
"export-$class-ref"]]
|
|
}
|
|
}
|