mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-06 12:09:26 +08:00
f3a9baf18d
Move those ELF shared library tests that are in ld-elf/elf.exp over to ld-elf/shared.exp, to keep them all together and make the maintenance of extra flags needed with some targets and shared library builds easier, and also removing the need for the large: if { [check_shared_lib_support] } then { [...] } conditional block and consequently reducing indentation, which always helps with TCL code. No functional change, except for the order of individual test case execution which has changed accordingly, i.e. the test results are shuffled. ld/ * testsuite/ld-elf/elf.exp: Move shared library tests over to... * testsuite/ld-elf/shared.exp: ... here.
262 lines
7.1 KiB
Plaintext
262 lines
7.1 KiB
Plaintext
# Expect script for various ELF tests.
|
|
# Copyright (C) 2002-2018 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.
|
|
#
|
|
|
|
# Exclude non-ELF targets.
|
|
|
|
if ![is_elf_format] {
|
|
return
|
|
}
|
|
|
|
set old_ldflags $LDFLAGS
|
|
if { [istarget spu*-*-*] } {
|
|
set LDFLAGS "$LDFLAGS --local-store 0:0"
|
|
}
|
|
|
|
# hpux .comm differs from everyone else
|
|
set hpux ""
|
|
set old_asflags $ASFLAGS
|
|
if [istarget "*-*-hpux*"] {
|
|
set hpux "--defsym HPUX=1"
|
|
set ASFLAGS "$ASFLAGS --defsym HPUX=1"
|
|
}
|
|
|
|
if { [istarget alpha*-*-* ] } {
|
|
# The compress1 test is written expecting 32-bit addresses; force the
|
|
# executable down into the low address space to match.
|
|
# ??? How can we adjust just the one testcase?
|
|
set LDFLAGS "$LDFLAGS -Ttext-segment 0x1000000"
|
|
}
|
|
|
|
if { [istarget "*-*-nacl*"] } {
|
|
# The eh[1-4] cases are written to expect ELFCLASS64 layout on x86-64.
|
|
# But the target default is ELFCLASS32. So the cases explicitly use
|
|
# -melf_x86_64 to select that, but NaCl needs a different emulation name.
|
|
set options_regsub(ld) {-melf_x86_64 -melf_x86_64_nacl}
|
|
}
|
|
|
|
if { [istarget "*-*-solaris*"] } {
|
|
# Same for Solaris
|
|
set options_regsub(ld) {-melf_x86_64 -melf_x86_64_sol2}
|
|
}
|
|
|
|
if { [is_remote host] } then {
|
|
remote_download host merge.ld
|
|
}
|
|
|
|
# Note - the output file from the second test (symbol3w.a) is
|
|
# used in the proc is_elf64 test below...
|
|
run_ld_link_tests [list \
|
|
[list "Build symbol3.a" \
|
|
"" "" $hpux \
|
|
{symbol3.s} {} "symbol3.a" ] \
|
|
[list "Build symbol3w.a" \
|
|
"" "" "" \
|
|
{symbol3w.s} {} "symbol3w.a" ] \
|
|
]
|
|
|
|
|
|
# True if the object format is known to be 64-bit ELF.
|
|
#
|
|
proc is_elf64 { binary_file } {
|
|
global READELF
|
|
global READELFFLAGS
|
|
|
|
set readelf_size ""
|
|
catch "exec $READELF $READELFFLAGS -h $binary_file > readelf.out" got
|
|
|
|
if ![string match "" $got] then {
|
|
return 0
|
|
}
|
|
|
|
if { ![regexp "\n\[ \]*Class:\[ \]*ELF(\[0-9\]+)\n" \
|
|
[file_contents readelf.out] nil readelf_size] } {
|
|
verbose "FAILED to determine ELF size"
|
|
return 0
|
|
}
|
|
|
|
if { $readelf_size == "64" } {
|
|
return 1
|
|
}
|
|
|
|
return 0
|
|
}
|
|
|
|
if [is_elf64 tmpdir/symbol3w.a] {
|
|
set ASFLAGS "$ASFLAGS --defsym ALIGN=3"
|
|
} else {
|
|
set ASFLAGS "$ASFLAGS --defsym ALIGN=2"
|
|
}
|
|
|
|
|
|
|
|
# Targets that use _bfd_generic_link_add_symbols won't pass pr21703 tests
|
|
run_ld_link_tests {
|
|
{"PR ld/21703"
|
|
"--allow-multiple-definition tmpdir/pr21703-1.o tmpdir/pr21703-2.o" "" "" \
|
|
{pr21703-1.s pr21703-2.s} {{readelf {-s} pr21703.sd}} "pr21703" }
|
|
{"PR ld/21703 -r"
|
|
"-r --allow-multiple-definition tmpdir/pr21703-3.o tmpdir/pr21703-4.o" "" "" \
|
|
{pr21703-3.s pr21703-4.s} {{readelf {-s} pr21703-r.sd}} "pr21703.o" }
|
|
} "d30v-*-*" "dlx-*-*" "pj-*-*"
|
|
|
|
if [is_underscore_target] {
|
|
set ASFLAGS "$ASFLAGS --defsym UNDERSCORE=1"
|
|
}
|
|
|
|
set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
|
|
foreach t $test_list {
|
|
# We need to strip the ".d", but can leave the dirname.
|
|
verbose [file rootname $t]
|
|
run_dump_test [file rootname $t]
|
|
}
|
|
|
|
# Targets using the generic linker backend don't support generating
|
|
# an import library.
|
|
set xfail_implib ""
|
|
if [is_generic_elf] {
|
|
set xfail_implib "*-*-*"
|
|
}
|
|
|
|
# Check that the --out-implib option work correctly.
|
|
run_ld_link_tests [list \
|
|
[list "Generate empty import library" \
|
|
"--out-implib=tmpdir/implib.lib" "" \
|
|
[concat "--defsym NO_GLOBAL=1" $hpux] \
|
|
{implib.s} \
|
|
{{ld empty-implib.out}} \
|
|
"implib" ] \
|
|
[list "Generate import library" \
|
|
"--out-implib=tmpdir/implib.lib" "" \
|
|
$hpux \
|
|
{implib.s} \
|
|
{{readelf {-s tmpdir/implib.lib} implib.rd}} \
|
|
"implib" ] \
|
|
] $xfail_implib
|
|
|
|
#v850 gas complains about .tbss.var section attributes.
|
|
if { [check_gc_sections_available] && ![istarget "v850-*-*"] } {
|
|
run_ld_link_tests {
|
|
{"--gc-sections on tls variable"
|
|
"--gc-section" "" "" {tls_gc.s} {} "tls_gc"}
|
|
}
|
|
}
|
|
|
|
if { [istarget *-*-*linux*]
|
|
|| [istarget *-*-nacl*]
|
|
|| [istarget *-*-gnu*] } {
|
|
run_ld_link_tests {
|
|
{"stack exec" "-z execstack" "" "" {stack.s}
|
|
{{readelf {-Wl} stack-exec.rd}} "stack-exec.exe"}
|
|
{"stack size" "-z stack-size=0x123400" "" "" {stack.s}
|
|
{{readelf {-Wl} stack-size.rd}} "stack-size.exe"}
|
|
}
|
|
}
|
|
|
|
set LDFLAGS $old_ldflags
|
|
set ASFLAGS $old_asflags
|
|
|
|
# Check to see if the C compiler works
|
|
if { [which $CC] == 0 } {
|
|
return
|
|
}
|
|
|
|
if [check_gc_sections_available] {
|
|
run_cc_link_tests {
|
|
{"PR ld/13195" "-Wl,--gc-sections" ""
|
|
{pr13195.c} {} "pr13195"}
|
|
}
|
|
}
|
|
|
|
set array_tests {
|
|
{"preinit array" "" ""
|
|
{preinit.c} "preinit" "preinit.out"}
|
|
{"init array" "" ""
|
|
{init.c} "init" "init.out"}
|
|
{"fini array" "" ""
|
|
{fini.c} "fini" "fini.out"}
|
|
{"init array mixed" "" ""
|
|
{init-mixed.c} "init-mixed" "init-mixed.out" "-I."}
|
|
}
|
|
set array_tests_pie {
|
|
{"PIE preinit array" "-pie" ""
|
|
{preinit.c} "preinit" "preinit.out" "-fPIE"}
|
|
{"PIE init array" "-pie" ""
|
|
{init.c} "init" "init.out" "-fPIE"}
|
|
{"PIE fini array" "-pie" ""
|
|
{fini.c} "fini" "fini.out" "-fPIE"}
|
|
{"PIE init array mixed" "-pie" ""
|
|
{init-mixed.c} "init-mixed" "init-mixed.out" "-I. -fPIE"}
|
|
{"PIE PR ld/14525" "-pie" ""
|
|
{pr14525.c} "pr14525" "pr14525.out" "-fPIE"}
|
|
}
|
|
set array_tests_static {
|
|
{"static preinit array" "-static" ""
|
|
{preinit.c} "preinit" "preinit.out"}
|
|
{"static init array" "-static" ""
|
|
{init.c} "init" "init.out"}
|
|
{"static fini array" "-static" ""
|
|
{fini.c} "fini" "fini.out"}
|
|
{"static init array mixed" "-static" ""
|
|
{init-mixed.c} "init-mixed" "init-mixed.out" "-I."}
|
|
}
|
|
|
|
# NetBSD ELF systems do not currently support the .*_array sections.
|
|
set xfails "*-*-netbsdelf*"
|
|
run_ld_link_exec_tests $array_tests $xfails
|
|
|
|
if { [istarget *-*-linux*]
|
|
|| [istarget *-*-nacl*]
|
|
|| [istarget *-*-gnu*] } {
|
|
run_ld_link_exec_tests $array_tests_pie $xfails
|
|
|
|
run_ld_link_exec_tests [list \
|
|
[list \
|
|
"Run mbind2a" \
|
|
"$NOPIE_LDFLAGS -Wl,-z,common-page-size=0x4000" \
|
|
"" \
|
|
{ mbind2a.s mbind2b.c } \
|
|
"mbind2a" \
|
|
"pass.out" \
|
|
"-O2 -I../bfd" \
|
|
] \
|
|
[list \
|
|
"Run mbind2b" \
|
|
"-static -Wl,-z,common-page-size=0x4000" \
|
|
"" \
|
|
{ mbind2a.s mbind2b.c } \
|
|
"mbind2b" \
|
|
"pass.out" \
|
|
"-O2 -I../bfd" \
|
|
] \
|
|
]
|
|
}
|
|
|
|
# <http://www.gnu.org/software/hurd/open_issues/binutils.html#static>
|
|
# Be cautious to not XFAIL for *-*-linux-gnu*, *-*-kfreebsd-gnu*, etc.
|
|
switch -regexp $target_triplet {
|
|
^\[^-\]*-\[^-\]*-gnu.*$ {
|
|
set xfails "*-*-*"
|
|
}
|
|
}
|
|
run_ld_link_exec_tests $array_tests_static $xfails
|
|
|
|
catch "exec rm -f tmpdir/preinit tmpdir/init tmpdir/fini tmpdir/init-mixed" status
|