forked from Imagelibrary/binutils-gdb
In early October, HJ Lu added support for a number of targets to "Dump dynamic relocation in read-only section with minfo". This extends that support to more targets, displays the symbol involved, and splits the existing function that sets TEXTREL into a "readonly_dynrelocs" and "maybe_set_textrel" function. I'll need "readonly_dynrelocs" if I ever get around to fixing "pr22374 function pointer initialization" fails. am33_2.0, arc, bfin, hppa64, mn10300, and nios2 fail to mark a binary needing text relocations with DT_TEXTREL. That's not good. xtensa also fails to do so but complains about "dangerous relocation: dynamic relocation in read-only section" so I reckon that is fine and have marked the test as an xfail. The other targets need maintainer attention. Curiously, the map file dump wasn't added for x86, so the map test currently fail on x86. It also fails on alpha, am33_2.0, arc, bfin, hppa64, ia64, m68k, mips, mn10300, nios2, score and vax. cris complains with "tmpdir/textrel.o, section .rodata: relocation R_CRIS_32 should not be used in a shared object; recompile with -fPIC" so I've marked it as an xfail. bfd/ * elf32-hppa.c (maybe_set_textrel): Print symbol for map file output. * elf32-ppc.c (maybe_set_textrel): Likewise. * elf64-ppc.c (maybe_set_textrel): Likewise. * elf32-arm.c (readonly_dynrelocs): New function. (maybe_set_textrel): New function, replacing.. (elf32_arm_readonly_dynrelocs): ..this. * elf32-lm32.c (readonly_dynrelocs): New function. (maybe_set_textrel): New function, replacing old version of.. (readonly_dynrelocs): ..this. * elf32-m32r.c (readonly_dynrelocs): New function. (maybe_set_textrel): New function, replacing old version of.. (readonly_dynrelocs): ..this. * elf32-metag.c (readonly_dynrelocs): New function. (maybe_set_textrel): New function, replacing old version of.. (readonly_dynrelocs): ..this. * elf32-nds32.c: Delete unnecessary forward declarations. (readonly_dynrelocs): New function. (maybe_set_textrel): New function, replacing old version of.. (readonly_dynrelocs): ..this. * elf32-or1k.c (readonly_dynrelocs): New function. (maybe_set_textrel): New function, replacing old version of.. (readonly_dynrelocs): ..this. * elf32-s390.c (readonly_dynrelocs): New function. (maybe_set_textrel): New function, replacing old version of.. (readonly_dynrelocs): ..this. * elf32-sh.c (readonly_dynrelocs): New function. (maybe_set_textrel): New function, replacing old version of.. (readonly_dynrelocs): ..this. * elf32-tic6x.c (readonly_dynrelocs): New function. (maybe_set_textrel): New function, replacing.. (elf32_tic6x_readonly_dynrelocs): ..this. * elf32-tilepro.c (readonly_dynrelocs): New function. (maybe_set_textrel): New function, replacing old version of.. (readonly_dynrelocs): ..this. * elf64-s390.c (readonly_dynrelocs): New function. (maybe_set_textrel): New function, replacing old version of.. (readonly_dynrelocs): ..this. * elfnn-aarch64.c (readonly_dynrelocs): New function. (maybe_set_textrel): New function, replacing.. (aarch64_readonly_readonly_dynrelocs): ..this. * elfnn-riscv.c (readonly_dynrelocs): New function. (maybe_set_textrel): New function, replacing old version of.. (readonly_dynrelocs): ..this. * elfxx-sparc.c (readonly_dynrelocs): New function. (maybe_set_textrel): New function, replacing old version of.. (readonly_dynrelocs): ..this. * elfxx-tilegx.c (readonly_dynrelocs): New function. (maybe_set_textrel): New function, replacing old version of.. (readonly_dynrelocs): ..this. ld/ * testsuite/ld-elf/shared.exp: Run new textrel tests. * testsuite/ld-elf/textrel.map: New file. * testsuite/ld-elf/textrel.rd: New file. * testsuite/ld-elf/textrel.s: New file. * testsuite/ld-elf/textrel.warn: New file.
1027 lines
34 KiB
Plaintext
1027 lines
34 KiB
Plaintext
# Expect script for various ELF tests.
|
|
# Copyright (C) 2006-2017 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
|
|
}
|
|
|
|
# Skip targets where -shared is not supported
|
|
|
|
if ![check_shared_lib_support] {
|
|
return
|
|
}
|
|
|
|
# Add $NOPIE_CFLAGS and $NOPIE_LDFLAGS if non-PIE is required.
|
|
global NOPIE_CFLAGS NOPIE_LDFLAGS
|
|
|
|
set old_ASFLAGS $ASFLAGS
|
|
|
|
# This target requires extra GAS options when building code for shared
|
|
# libraries.
|
|
set AFLAGS_PIC ""
|
|
if [istarget "tic6x-*-*"] {
|
|
append AFLAGS_PIC " -mpic -mpid=near"
|
|
}
|
|
# This target requires a non-default emulation for successful shared
|
|
# library/executable builds.
|
|
set LFLAGS ""
|
|
if [istarget "tic6x-*-*"] {
|
|
append LFLAGS " -melf32_tic6x_le"
|
|
}
|
|
|
|
if [is_underscore_target] {
|
|
set ASFLAGS "$ASFLAGS --defsym UNDERSCORE=1"
|
|
}
|
|
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"Build pr22471a.so" \
|
|
"$LFLAGS -shared" \
|
|
"" \
|
|
"$AFLAGS_PIC" \
|
|
{pr22471a.s} \
|
|
{} \
|
|
"pr22471a.so" \
|
|
] \
|
|
[list \
|
|
"Build pr22471b.so" \
|
|
"$LFLAGS -shared --version-script pr22471.t" \
|
|
"tmpdir/pr22471a.so" \
|
|
"$AFLAGS_PIC" \
|
|
{pr22471a.s} \
|
|
{} \
|
|
"pr22471b.so" \
|
|
] \
|
|
[list \
|
|
"Build pr22471" \
|
|
"$LFLAGS -rpath-link ." \
|
|
"tmpdir/pr22471b.so" \
|
|
"" \
|
|
{pr22471b.s} \
|
|
{} \
|
|
"pr22471" \
|
|
] \
|
|
]
|
|
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"DT_TEXTREL in shared lib" \
|
|
"$LFLAGS -shared --warn-shared-textrel" \
|
|
"" \
|
|
"$AFLAGS_PIC" \
|
|
{textrel.s} \
|
|
{{ld textrel.warn} \
|
|
{readelf {-d --wide} textrel.rd}} \
|
|
"textrel.so" \
|
|
] \
|
|
] "xtensa-*-*"
|
|
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"DT_TEXTREL map file warning" \
|
|
"$LFLAGS -shared -M" \
|
|
"" \
|
|
"$AFLAGS_PIC" \
|
|
{textrel.s} \
|
|
{{ld textrel.map}} \
|
|
"textrel.so" \
|
|
] \
|
|
] "cris*-*-*"
|
|
|
|
# PR ld/20828 check for correct dynamic symbol table entries where:
|
|
# - symbols have been defined with a linker script,
|
|
# - the same symbols have been seen in shared library used in the link,
|
|
# - 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 \
|
|
"PR ld/20828 dynamic symbols with section GC\
|
|
(auxiliary shared library)" \
|
|
"$LFLAGS -shared --gc-sections -T pr20828.ld" "" "$AFLAGS_PIC" \
|
|
{pr20828.s} \
|
|
{{readelf --dyn-syms pr20828-a.sd} \
|
|
{readelf --dyn-syms pr20828-b.sd}} \
|
|
"libpr20828.so"] \
|
|
[list \
|
|
"PR ld/20828 dynamic symbols with section GC (plain)" \
|
|
"$LFLAGS -shared --gc-sections -T pr20828.ld" \
|
|
"tmpdir/libpr20828.so" "$AFLAGS_PIC" \
|
|
{pr20828.s} \
|
|
{{readelf --dyn-syms pr20828-a.sd} \
|
|
{readelf --dyn-syms pr20828-b.sd}} \
|
|
"pr20828-1.so"] \
|
|
[list \
|
|
"PR ld/20828 dynamic symbols with section GC (version script)" \
|
|
"$LFLAGS -shared --gc-sections -T pr20828.ld\
|
|
--version-script=pr20828.ver" \
|
|
"tmpdir/libpr20828.so" \
|
|
"$AFLAGS_PIC" \
|
|
{pr20828.s} \
|
|
{{readelf --dyn-syms pr20828-b.sd} \
|
|
{readelf --dyn-syms pr20828-c.sd}} \
|
|
"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 --no-dynamic-linker -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 --no-dynamic-linker -e foo --gc-sections -E -T pr20828-v.ld" "" "" \
|
|
{pr20828-v.s} \
|
|
{{objdump -p pr20828-v.od}} \
|
|
"pr20828-v-2"]]
|
|
}
|
|
# PR ld/21233 check for correct dynamic symbol table entries where:
|
|
# - a symbol has been defined in a shared library used in the link,
|
|
# - the symbol has been referenced from a section swept in garbage collection,
|
|
# - the symbol has also been forced to be entered in the output file as an
|
|
# undefined symbol, either with a command-line option or a linker script
|
|
# command.
|
|
# Verify that the undefined symbol is global rather than local.
|
|
if { [check_gc_sections_available] } {
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"PR ld/21233 dynamic symbols with section GC\
|
|
(auxiliary shared library)" \
|
|
"$LFLAGS -shared -T pr21233.ld" "" "$AFLAGS_PIC" \
|
|
{pr21233-l.s} \
|
|
{{readelf --dyn-syms pr21233-l.sd}} \
|
|
"libpr21233.so"]]
|
|
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"PR ld/21233 dynamic symbols with section GC (--undefined)" \
|
|
"$LFLAGS --gc-sections -e foo --undefined=bar -T pr21233.ld" \
|
|
"tmpdir/libpr21233.so" "" \
|
|
{pr21233.s} \
|
|
{{readelf --dyn-syms pr21233.sd}} \
|
|
"pr21233-1"]]
|
|
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"PR ld/21233 dynamic symbols with section GC (--require-defined)" \
|
|
"$LFLAGS --gc-sections -e foo --require-defined=bar\
|
|
-T pr21233.ld" \
|
|
"tmpdir/libpr21233.so" "" \
|
|
{pr21233.s} \
|
|
{{readelf --dyn-syms pr21233.sd}} \
|
|
"pr21233-2"]]
|
|
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"PR ld/21233 dynamic symbols with section GC (EXTERN)" \
|
|
"$LFLAGS --gc-sections -e foo -T pr21233-e.ld" \
|
|
"tmpdir/libpr21233.so" "" \
|
|
{pr21233.s} \
|
|
{{readelf --dyn-syms pr21233.sd}} \
|
|
"pr21233-3"]]
|
|
}
|
|
|
|
if { [check_gc_sections_available] } {
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"Build pr22150.so" \
|
|
"$LFLAGS -shared --version-script pr22150.ver" \
|
|
"" \
|
|
"$AFLAGS_PIC" \
|
|
{pr22150a.s} \
|
|
{} \
|
|
"pr22150.so" \
|
|
] \
|
|
[list \
|
|
"Build pr22150" \
|
|
"$LFLAGS -e _start --gc-sections" \
|
|
"tmpdir/pr22150.so" \
|
|
"" \
|
|
{pr22150b.s} \
|
|
{{readelf -V pr22150.vd}} \
|
|
"pr22150" \
|
|
] \
|
|
]
|
|
}
|
|
|
|
set ASFLAGS $old_ASFLAGS
|
|
|
|
# Check to see if the C compiler works
|
|
if { [which $CC] == 0 } {
|
|
return
|
|
}
|
|
|
|
# Add -ldl to extralibs if needed
|
|
set extralibs ""
|
|
if { ![istarget *-*-freebsd*]} {
|
|
set extralibs "-ldl"
|
|
}
|
|
|
|
set build_tests {
|
|
{"Build libfoo.so"
|
|
"-shared" "-fPIC"
|
|
{foo.c} {} "libfoo.so"}
|
|
{"Build versioned libfoo.so"
|
|
"-shared -Wl,--version-script=foo.map" "-fPIC"
|
|
{foo.c} {} "libfoov.so"}
|
|
{"Build libbar.so"
|
|
"-shared" "-fPIC"
|
|
{begin.c end.c} {} "libbar.so"}
|
|
{"Build warn libbar.so"
|
|
"-shared" "-fPIC"
|
|
{beginwarn.c end.c}
|
|
{{readelf {-S --wide} libbarw.rd}
|
|
{warning "^.*beginwarn.c:7: warning: function foo is deprecated$"}}
|
|
"libbarw.so" "c"}
|
|
{"Build hidden libbar.so"
|
|
"-shared" "-fPIC"
|
|
{begin.c endhidden.c} {} "libbarh.so"}
|
|
{"Build protected libbar.so"
|
|
"-shared" "-fPIC"
|
|
{begin.c endprotected.c} {} "libbarp.so"}
|
|
{"Build libbar.so with libfoo.so"
|
|
"-shared tmpdir/begin.o tmpdir/libfoo.so" "-fPIC"
|
|
{end.c} {} "libbarfoo.so"}
|
|
{"Build libar.so with versioned libfoo.so"
|
|
"-shared tmpdir/begin.o tmpdir/libfoov.so" "-fPIC"
|
|
{end.c} {} "libbarfoov.so"}
|
|
{"Build hidden libbar.so with libfoo.so"
|
|
"-shared tmpdir/begin.o tmpdir/libfoo.so" "-fPIC"
|
|
{endhidden.c} {} "libbarhfoo.so"}
|
|
{"Build hidden libar.so with versioned libfoo.so"
|
|
"-shared tmpdir/begin.o tmpdir/libfoov.so" "-fPIC"
|
|
{endhidden.c} {} "libbarhfoov.so"}
|
|
{"Build protected libbar.so with libfoo.so"
|
|
"-shared tmpdir/begin.o tmpdir/libfoo.so" "-fPIC"
|
|
{endprotected.c} {} "libbarpfoo.so"}
|
|
{"Build protected libbar.so with versioned libfoo.so"
|
|
"-shared tmpdir/begin.o tmpdir/libfoov.so" "-fPIC"
|
|
{endprotected.c} {} "libbarpfoov.so"}
|
|
{"Build libdl1.so"
|
|
"-shared" "-fPIC"
|
|
{dl1.c} {} "libdl1.so"}
|
|
{"Build libdl2a.so with --dynamic-list=dl2.list"
|
|
"-shared -Wl,--dynamic-list=dl2.list" "-fPIC"
|
|
{dl2.c dl2xxx.c} {} "libdl2a.so"}
|
|
{"Build libdl2a.so with --dynamic-list=dl2a.list"
|
|
"-shared -Wl,--dynamic-list=dl2a.list" "-fPIC"
|
|
{dl2.c dl2xxx.c} {} "libdl2a.so"}
|
|
{"Build libdl2a.so with --dynamic-list-data"
|
|
"-shared -Wl,--dynamic-list-data" "-fPIC"
|
|
{dl2.c dl2xxx.c} {} "libdl2a.so"}
|
|
{"Build libdl2b.so with --dynamic-list=dl2.list and dl2xxx.list"
|
|
"-shared -Wl,--dynamic-list=dl2.list,--dynamic-list=dl2xxx.list" "-fPIC"
|
|
{dl2.c dl2xxx.c} {} "libdl2b.so"}
|
|
{"Build libdl2c.so with --dynamic-list-data and dl2xxx.list"
|
|
"-shared -Wl,--dynamic-list-data,--dynamic-list=dl2xxx.list" "-fPIC"
|
|
{dl2.c dl2xxx.c} {} "libdl2c.so"}
|
|
{"Build libdl4a.so with --dynamic-list=dl4.list"
|
|
"-shared -Wl,--dynamic-list=dl4.list" "-fPIC"
|
|
{dl4.c dl4xxx.c} {} "libdl4a.so"}
|
|
{"Build libdl4b.so with --dynamic-list-data"
|
|
"-shared -Wl,--dynamic-list-data" "-fPIC"
|
|
{dl4.c dl4xxx.c} {} "libdl4b.so"}
|
|
{"Build libdl4c.so with --dynamic-list=dl4.list and dl4xxx.list"
|
|
"-shared -Wl,--dynamic-list=dl4.list,--dynamic-list=dl4xxx.list" "-fPIC"
|
|
{dl4.c dl4xxx.c} {} "libdl4c.so"}
|
|
{"Build libdl4d.so with --dynamic-list-data and dl4xxx.list"
|
|
"-shared -Wl,--dynamic-list-data,--dynamic-list=dl4xxx.list" "-fPIC"
|
|
{dl4.c dl4xxx.c} {} "libdl4d.so"}
|
|
{"Build libdl4e.so with -Bsymbolic-functions --dynamic-list-cpp-new"
|
|
"-shared -Wl,-Bsymbolic-functions,--dynamic-list-cpp-new" "-fPIC"
|
|
{dl4.c dl4xxx.c} {} "libdl4e.so"}
|
|
{"Build libdl4f.so with --dynamic-list-cpp-new -Bsymbolic-functions"
|
|
"-shared -Wl,--dynamic-list-cpp-new,-Bsymbolic-functions" "-fPIC"
|
|
{dl4.c dl4xxx.c} {} "libdl4f.so"}
|
|
{"Build libdl6a.so"
|
|
"-shared" "-fPIC"
|
|
{dl6.c} {} "libdl6a.so"}
|
|
{"Build libdl6b.so with -Bsymbolic --dynamic-list-data"
|
|
"-shared -Wl,-Bsymbolic,--dynamic-list-data" "-fPIC"
|
|
{dl6.c} {} "libdl6b.so"}
|
|
{"Build libdl6c.so with -Bsymbolic"
|
|
"-shared -Wl,-Bsymbolic" "-fPIC"
|
|
{dl6.c} {} "libdl6c.so"}
|
|
{"Build libdl6d.so with --dynamic-list-data -Bsymbolic"
|
|
"-shared -Wl,--dynamic-list-data,-Bsymbolic" "-fPIC"
|
|
{dl6.c} {} "libdl6d.so"}
|
|
{"Build libdata1.so"
|
|
"-shared" "-fPIC"
|
|
{data1.c} {} "libdata1.so"}
|
|
{"Build libdata2.so"
|
|
"-shared" "-fPIC"
|
|
{data2.c} {} "libdata2.so"}
|
|
{"Build libcomm1.o"
|
|
"-r -nostdlib" ""
|
|
{comm1.c} {} "libcomm1.o"}
|
|
{"Build libfunc1.so"
|
|
"-shared" "-fPIC"
|
|
{func1.c} {} "libfunc1.so"}
|
|
{"Build libpr9676-1.a"
|
|
"" "-fPIC"
|
|
{pr9676-1.c} {} "libpr9676-1.a"}
|
|
{"Build libpr9676-2.a"
|
|
"" "-fPIC"
|
|
{pr9676-2.c} {} "libpr9676-2.a"}
|
|
{"Build libpr9676-3.so"
|
|
"-shared" "-fPIC"
|
|
{pr9676-3.c} {} "libpr9676-3.so"}
|
|
{"Build libpr9676-4.so"
|
|
"-shared" "-fPIC"
|
|
{pr9676-4.c} {} "libpr9676-4.so"}
|
|
{"Build libpr9676-4a.so"
|
|
"-shared tmpdir/pr9676-4.o -Ltmpdir -lpr9676-3 -Wl,--start-group -lpr9676-1 -lpr9676-2 -Wl,--end-group"
|
|
"-fPIC"
|
|
{dummy.c} {{readelf {-s} pr9676.rd}} "libpr9676-4a.so"}
|
|
{"Build libpr9679.so"
|
|
"-shared" "-fPIC -O0"
|
|
{pr9679-1.c pr9679-2.c} {{readelf {-s} pr9679.rd}} "libpr9679.so"}
|
|
{"Build libpr11138-1.so"
|
|
"-shared -Wl,--version-script=pr11138-1.map" "-fPIC"
|
|
{pr11138-1.c} {} "libpr11138-1.so"}
|
|
{"Build libpr11138-2.o"
|
|
"-r -nostdlib" ""
|
|
{pr11138-2.c} {} "libpr11138-2.o"}
|
|
{"Build pr13250-1.so"
|
|
"-shared" "-fPIC"
|
|
{pr13250-1.c} {} "libpr13250-1.so"}
|
|
{"Build pr13250-2.so with libpr13250-1.so"
|
|
"-shared -Wl,--no-as-needed tmpdir/libpr13250-1.so" "-fPIC"
|
|
{pr13250-2.c} {} "libpr13250-2.so"}
|
|
{"Build libpr13250-3.o"
|
|
"-r -nostdlib" ""
|
|
{pr13250-3.c} {} "libpr13250-3.o"}
|
|
{"Build libpr14323-2.so"
|
|
"-shared" "-fPIC"
|
|
{pr14323-2.c} {} "libpr14323-2.so"}
|
|
{"Build pr14862-1.o"
|
|
"-r -nostdlib" ""
|
|
{pr14862-1.c} {} "libpr14862-1.o"}
|
|
{"Build libpr14862.so"
|
|
"-shared -Wl,--version-script=pr11138-1.map" "-fPIC"
|
|
{pr14862-2.c} {} "libpr14862.so"}
|
|
{"Build libneeded1b.so"
|
|
"-shared" "-fPIC"
|
|
{needed1b.c} {} "libneeded1b.so"}
|
|
{"Build libneeded1a.so"
|
|
"-shared -Wl,--add-needed,--no-as-needed -Ltmpdir -lneeded1b" "-fPIC"
|
|
{needed1a.c} {} "libneeded1a.so"}
|
|
{"Build libneeded1c.o"
|
|
"-r -nostdlib" ""
|
|
{needed1c.c} {} "libneeded1c.o"}
|
|
{"Build libneeded1pic.o"
|
|
"-r -nostdlib" "-fPIC"
|
|
{needed1c.c} {} "libneeded1pic.o"}
|
|
{"Build needed1a.so with --add-needed"
|
|
"-shared tmpdir/libneeded1pic.o -Wl,--no-as-needed,--add-needed,-rpath=tmpdir,-rpath-link=tmpdir,-z,defs -Ltmpdir -lneeded1a" ""
|
|
{dummy.c} {} "needed1a.so"}
|
|
{"Build needed1b.so with --copy-dt-needed-entries"
|
|
"-shared tmpdir/libneeded1pic.o -Wl,--no-as-needed,--copy-dt-needed-entries,-rpath=tmpdir,-rpath-link=tmpdir,-z,defs -Ltmpdir -lneeded1a" ""
|
|
{dummy.c} {} "needed1b.so"}
|
|
{"Build needed1a.so with --no-add-needed"
|
|
"-shared tmpdir/libneeded1pic.o -Wl,--no-as-needed,--no-add-needed -Ltmpdir -lneeded1a" ""
|
|
{dummy.c} {} "needed1c.so"}
|
|
{"Build needed1b.so with --no-copy-dt-needed-entries"
|
|
"-shared tmpdir/libneeded1pic.o -Wl,--no-as-needed,--no-copy-dt-needed-entries -Ltmpdir -lneeded1a" ""
|
|
{dummy.c} {} "needed1d.so"}
|
|
{"Build librel.so"
|
|
"-shared" "-fPIC"
|
|
{rel.c} {} "librel.so"}
|
|
{"Build libneeded2a.so"
|
|
"-shared" "-fPIC"
|
|
{needed2a.c} {} "libneeded2a.so"}
|
|
{"Build libneeded2b.so"
|
|
"-shared -Wl,--version-script,needed2.ver" "-fPIC"
|
|
{needed2b.c} {} "libneeded2b.so"}
|
|
{"Build libneeded2c.o"
|
|
"-r -nostdlib" ""
|
|
{needed2c.c} {} "libneeded2c.o"}
|
|
{"Build needed2"
|
|
"tmpdir/libneeded2c.o -Wl,--as-needed tmpdir/libneeded2a.so tmpdir/libneeded2b.so" ""
|
|
{dummy.c} {} "needed2"}
|
|
{"Build libneeded3a.so"
|
|
"-shared -Wl,--no-add-needed" "-fPIC"
|
|
{needed1a.c} {} "libneeded3a.so"}
|
|
{"Build libneeded3b.so"
|
|
"-shared -Wl,--no-as-needed,--add-needed -Ltmpdir -lneeded1b" "-fPIC"
|
|
{dummy.c} {} "libneeded3b.so"}
|
|
{"Build needed3.o"
|
|
"-r -nostdlib" ""
|
|
{needed3.c} {} "libneeded3.so"}
|
|
{"Build needed3"
|
|
"tmpdir/needed3.o -Wl,--as-needed -Ltmpdir -lneeded3a -lneeded3b -lneeded1b" ""
|
|
{dummy.c} {} "needed3"}
|
|
{"Build libpr2404a.so"
|
|
"-shared" "-fPIC"
|
|
{pr2404a.c} {} "libpr2404a.so"}
|
|
{"Build libpr2404n.so"
|
|
"-shared -Wl,-z,now" "-fPIC"
|
|
{pr2404a.c} {} "libpr2404n.so"}
|
|
{"Build libpr2404b.a"
|
|
"" ""
|
|
{pr2404b.c} {} "libpr2404b.a"}
|
|
{"Build rdynamic-1"
|
|
"-Wl,--no-dynamic-linker,-export-dynamic,--gc-sections" "-ffunction-sections"
|
|
{rdynamic-1.c} {{readelf {-s} rdynamic-1.rd}} "rdynamic-1"}
|
|
{"Build dynamic-1"
|
|
"-Wl,--no-dynamic-linker,--dynamic-list,dynamic-1.syms -Wl,--gc-sections" "-ffunction-sections"
|
|
{dynamic-1.c} {{readelf {-s} dynamic-1.rd}} "dynamic-1"}
|
|
{"Build libpr16496a.so"
|
|
"-shared -Wl,--version-script=pr16496a.map" "-fPIC"
|
|
{pr16496a.c} {} "libpr16496a.so"}
|
|
{"Build libpr16496b.a"
|
|
"" "-fPIC"
|
|
{pr16496b.c} {} "libpr16496b.a"}
|
|
{"Build libpr16496b.so"
|
|
"-shared -Wl,--no-as-needed tmpdir/pr16496b.o tmpdir/libpr16496a.so" ""
|
|
{dummy.c} {{objdump {-R} pr16496b.od}} "libpr16496b.so"}
|
|
{"Build libpr16452a.so"
|
|
"-shared -Wl,-soname,libpr16452a.so,--version-script=pr16452.map" "-fPIC"
|
|
{pr16452a.c} {} "libpr16452a.so"}
|
|
{"Build libpr16452b.so"
|
|
"-shared -Wl,-soname,libpr16452b.so,--no-as-needed tmpdir/libpr16452a.so" "-fPIC"
|
|
{dummy.c} {} "libpr16452b.so"}
|
|
{"Build pr16452"
|
|
"-Wl,--no-as-needed,-rpath=tmpdir,-rpath-link=tmpdir tmpdir/libpr16452b.so" ""
|
|
{pr16452b.c} {{objdump {-p} pr16452.od}} "pr16452"}
|
|
{"Build pr16457"
|
|
"-Wl,--no-as-needed,-rpath=tmpdir,-rpath-link=tmpdir tmpdir/libpr16452b.so" ""
|
|
{pr16452b.c} {{objdump {-p} pr16457.od}} "pr16457"}
|
|
{"Build libpr18458a.so"
|
|
"-shared -Wl,-z,now" "-fPIC"
|
|
{pr18458a.c} {} "libpr18458a.so"}
|
|
{"Build libpr18458b.so"
|
|
"-shared -Wl,-z,now tmpdir/libpr18458a.so" "-fPIC"
|
|
{pr18458b.c} {} "libpr18458b.so"}
|
|
{"Build pr19073a.o"
|
|
"-r -nostdlib" ""
|
|
{pr19073.s} {} "pr19073a.o"}
|
|
{"Build libpr19073.so"
|
|
"-shared -Wl,--version-script=pr19073.map tmpdir/pr19073a.o" "-fPIC"
|
|
{dummy.c} {{readelf {--dyn-syms --wide} pr19073.rd}} "libpr19073.so"}
|
|
{"Build pr21964-1a.so"
|
|
"-shared" "-fPIC"
|
|
{pr21964-1a.c} {} "pr21964-1a.so"}
|
|
{"Build pr21964-1b.so"
|
|
"-shared" "-fPIC"
|
|
{pr21964-1b.c} {} "pr21964-1b.so"}
|
|
{"Build pr21964-2a.so"
|
|
"-shared" "-fPIC"
|
|
{pr21964-2a.c} {} "pr21964-2a.so"}
|
|
{"Build pr21964-2b.so"
|
|
"-shared" "-fPIC"
|
|
{pr21964-2b.c} {} "pr21964-2b.so"}
|
|
{"Dump pr21978.so"
|
|
"-shared" "-fPIC -g -O2"
|
|
{pr21978a.c pr21978b.c} {{objdump {-Sl} pr21978.od}} "pr21978.so"}
|
|
}
|
|
|
|
run_cc_link_tests $build_tests
|
|
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"Build pr22269-1" \
|
|
"-pie -e _start --no-dynamic-linker -z text" \
|
|
"" \
|
|
"" \
|
|
{ pr22269-1.c } \
|
|
{{readelf -rW pr22269-1.rd}} \
|
|
"pr22269-1" \
|
|
"-fPIE -O2" \
|
|
] \
|
|
]
|
|
|
|
set run_tests [list \
|
|
[list "Run normal with libfoo.so" \
|
|
"-Wl,--no-as-needed tmpdir/begin.o tmpdir/libfoo.so tmpdir/end.o" "" \
|
|
{main.c} "normal" "normal.out" ] \
|
|
[list "Run protected with libfoo.so" \
|
|
"-Wl,--no-as-needed tmpdir/begin.o tmpdir/libfoo.so tmpdir/endprotected.o" "" \
|
|
{main.c} "protected" "normal.out" ] \
|
|
[list "Run hidden with libfoo.so" \
|
|
"-Wl,--no-as-needed tmpdir/begin.o tmpdir/libfoo.so tmpdir/endhidden.o" "" \
|
|
{main.c} "hidden" "hidden.out" ] \
|
|
[list "Run normal with versioned libfoo.so" \
|
|
"-Wl,--no-as-needed tmpdir/begin.o tmpdir/libfoov.so tmpdir/end.o" "" \
|
|
{main.c} "normalv" "normal.out" ] \
|
|
[list "Run warn with versioned libfoo.so" \
|
|
"-Wl,--no-as-needed tmpdir/beginwarn.o tmpdir/libfoov.so" "" \
|
|
{main.c} "warn" "warn.out" \
|
|
"" "c" {^.*beginwarn.c:7: warning: function foo is deprecated$} ] \
|
|
[list "Run protected with versioned libfoo.so" \
|
|
"-Wl,--no-as-needed tmpdir/begin.o tmpdir/libfoov.so tmpdir/endprotected.o" "" \
|
|
{main.c} "protected" "normal.out" ] \
|
|
[list "Run hidden with versioned libfoo.so" \
|
|
"-Wl,--no-as-needed tmpdir/begin.o tmpdir/libfoov.so tmpdir/endhidden.o" "" \
|
|
{main.c} "hiddenv" "hidden.out" ] \
|
|
[list "Run normal libbar.so with libfoo.so" \
|
|
"-Wl,--no-as-needed tmpdir/libbarfoo.so tmpdir/libfoo.so" "" \
|
|
{main.c} "normal" "normal.out" ] \
|
|
[list "Run protected libbar.so with libfoo.so" \
|
|
"-Wl,--no-as-needed tmpdir/libbarpfoo.so tmpdir/libfoo.so" "" \
|
|
{main.c} "protected" "normal.out" ] \
|
|
[list "Run hidden libbar.so with libfoo.so" \
|
|
"-Wl,--no-as-needed tmpdir/libbarhfoo.so tmpdir/libfoo.so" "" \
|
|
{main.c} "hidden" "hidden.out" ] \
|
|
[list "Run normal libbar.so with versioned libfoo.so" \
|
|
"-Wl,--no-as-needed tmpdir/libbarfoov.so tmpdir/libfoov.so" "" \
|
|
{main.c} "normal" "normal.out" ] \
|
|
[list "Run protected libbar.so with versioned libfoo.so" \
|
|
"-Wl,--no-as-needed tmpdir/libbarpfoov.so tmpdir/libfoov.so" "" \
|
|
{main.c} "protected" "normal.out" ] \
|
|
[list "Run hidden libbar.so with versioned libfoo.so" \
|
|
"-Wl,--no-as-needed tmpdir/libbarhfoov.so tmpdir/libfoov.so" "" \
|
|
{main.c} "hidden" "hidden.out" ] \
|
|
[list "Run with libdl2a.so" \
|
|
"-Wl,--no-as-needed tmpdir/libdl2a.so" "" \
|
|
{dl2main.c} "dl2a" "dl2a.out" ] \
|
|
[list "Run with libdl2b.so" \
|
|
"-Wl,--no-as-needed tmpdir/libdl2b.so" "" \
|
|
{dl2main.c} "dl2b" "dl2b.out" ] \
|
|
[list "Run with libdl2c.so" \
|
|
"-Wl,--no-as-needed tmpdir/libdl2c.so" "" \
|
|
{dl2main.c} "dl2c" "dl2b.out" ] \
|
|
[list "Run with libdl4a.so" \
|
|
"-Wl,--no-as-needed tmpdir/libdl4a.so" "" \
|
|
{dl4main.c} "dl4a" "dl4a.out" ] \
|
|
[list "Run with libdl4b.so" \
|
|
"-Wl,--no-as-needed tmpdir/libdl4b.so" "" \
|
|
{dl4main.c} "dl4b" "dl4a.out" ] \
|
|
[list "Run with libdl4c.so" \
|
|
"-Wl,--no-as-needed tmpdir/libdl4c.so" "" \
|
|
{dl4main.c} "dl4c" "dl4b.out" ] \
|
|
[list "Run with libdl4d.so" \
|
|
"-Wl,--no-as-needed tmpdir/libdl4d.so" "" \
|
|
{dl4main.c} "dl4d" "dl4b.out" ] \
|
|
[list "Run with libdl4e.so" \
|
|
"-Wl,--no-as-needed tmpdir/libdl4e.so" "" \
|
|
{dl4main.c} "dl4e" "dl4a.out" ] \
|
|
[list "Run with libdl4f.so" \
|
|
"-Wl,--no-as-needed tmpdir/libdl4f.so" "" \
|
|
{dl4main.c} "dl4f" "dl4a.out" ] \
|
|
[list "Run with libdata1.so" \
|
|
"-Wl,--no-as-needed tmpdir/libdata1.so" "" \
|
|
{dynbss1.c} "dynbss1" "pass.out" ] \
|
|
[list "Run with libdata2.so" \
|
|
"-Wl,--no-as-needed tmpdir/libdata2.so" "" \
|
|
{weakdef1.c} "weakdef1" "pass.out" ] \
|
|
[list "Run with libfunc1.so comm1.o" \
|
|
"-Wl,--no-as-needed tmpdir/libfunc1.so tmpdir/comm1.o" "" \
|
|
{dummy.c} "comm1" "pass.out" ] \
|
|
[list "Run with comm1.o libfunc1.so" \
|
|
"-Wl,--no-as-needed tmpdir/comm1.o tmpdir/libfunc1.so" "" \
|
|
{dummy.c} "comm1" "pass.out" ] \
|
|
[list "Run with pr11138-2.c libpr11138-1.so" \
|
|
"-Wl,--no-as-needed,--version-script=pr11138-2.map tmpdir/pr11138-2.o tmpdir/libpr11138-1.so" "" \
|
|
{dummy.c} "pr11138a" "pr11138.out" ] \
|
|
[list "Run with libpr11138-1.so pr11138-2.c" \
|
|
"-Wl,--no-as-needed,--version-script=pr11138-2.map tmpdir/libpr11138-1.so tmpdir/pr11138-2.o" "" \
|
|
{dummy.c} "pr11138b" "pr11138.out" ] \
|
|
[list "Run with pr13250-3.c, libpr13250-1.so and libpr13250-2.so" \
|
|
"-Wl,--as-needed tmpdir/pr13250-3.o tmpdir/libpr13250-1.so tmpdir/libpr13250-2.so" "" \
|
|
{dummy.c} "pr13250" "pass.out" ] \
|
|
[list "Run with pr14323-1.c pr14323-2.so" \
|
|
"-Wl,--no-as-needed tmpdir/libpr14323-2.so" "" \
|
|
{pr14323-1.c} "pr14323" "pass.out" ] \
|
|
[list "Run with pr14862-1.c libpr14862.so" \
|
|
"-Wl,--as-needed tmpdir/libpr14862-1.o tmpdir/libpr14862.so" "" \
|
|
{dummy.c} "pr14862" "pr14862.out" ] \
|
|
[list "Link with --add-needed" \
|
|
"tmpdir/libneeded1c.o -Wl,--no-as-needed,--add-needed,-rpath=tmpdir,-rpath-link=tmpdir -Ltmpdir -lneeded1a" "" \
|
|
{dummy.c} "needed1a" "needed1.out" ] \
|
|
[list "Link with --copy-dt-needed-entries" \
|
|
"tmpdir/libneeded1c.o -Wl,--no-as-needed,--copy-dt-needed-entries,-rpath=tmpdir,-rpath-link=tmpdir -Ltmpdir -lneeded1a" "" \
|
|
{dummy.c} "needed1b" "needed1.out" ] \
|
|
[list "Run relmain" \
|
|
"-Wl,--no-as-needed,-rpath=tmpdir -Ltmpdir -lrel" "" \
|
|
{relmain.c} "relmain" "relmain.out" ] \
|
|
[list "Run pr2404" \
|
|
"-Wl,--no-as-needed tmpdir/pr2404b.o tmpdir/libpr2404a.so" "" \
|
|
{dummy.c} "pr2404" "pr2404.out" ] \
|
|
[list "Run pr2404n" \
|
|
"-Wl,-z,now -Wl,--no-as-needed tmpdir/pr2404b.o tmpdir/libpr2404n.so" "" \
|
|
{dummy.c} "pr2404n" "pr2404.out" ] \
|
|
[list "Run pr18458" \
|
|
"-Wl,--no-as-needed,-z,now tmpdir/libpr18458a.so tmpdir/libpr18458b.so" "" \
|
|
{pr18458c.c} "pr18458" "pass.out" ] \
|
|
[list "Run pr21964-1" \
|
|
"-Wl,--no-as-needed,-rpath,tmpdir tmpdir/pr21964-1a.so tmpdir/pr21964-1b.so" "" \
|
|
{pr21964-1c.c} "pr21964-1" "pass.out" ] \
|
|
]
|
|
|
|
# NetBSD ELF systems do not currently support the .*_array sections.
|
|
run_ld_link_exec_tests $run_tests "*-*-netbsdelf*"
|
|
|
|
# These tests require dlopen support.
|
|
set dlopen_run_tests [list \
|
|
[list "Run dl1a with --dynamic-list=dl1.list and dlopen on libdl1.so" \
|
|
"-Wl,--no-as-needed,--dynamic-list=dl1.list $extralibs" "" \
|
|
{dl1main.c} "dl1a" "dl1.out" ] \
|
|
[list "Run dl1b with --dynamic-list-data and dlopen on libdl1.so" \
|
|
"-Wl,--no-as-needed,--dynamic-list-data $extralibs" "" \
|
|
{dl1main.c} "dl1b" "dl1.out" ] \
|
|
[list "Run dl6a1 with --dynamic-list-data and dlopen on libdl6a.so" \
|
|
"-Wl,--no-as-needed,--dynamic-list-data $extralibs" "" \
|
|
{dl6amain.c} "dl6a1" "dl6a.out" ] \
|
|
[list "Run dl6a2 with -Bsymbolic-functions and dlopen on libdl6a.so" \
|
|
"$NOPIE_LDFLAGS -Wl,--no-as-needed,-Bsymbolic-functions $extralibs" "" \
|
|
{dl6amain.c} "dl6a2" "dl6b.out" "$NOPIE_CFLAGS" ] \
|
|
[list "Run dl6a3 with -Bsymbolic and dlopen on libdl6a.so" \
|
|
"-Wl,--no-as-needed,-Bsymbolic $extralibs" "" \
|
|
{dl6amain.c} "dl6a3" "dl6b.out" ] \
|
|
[list "Run dl6a4 with -Bsymbolic --dynamic-list-data and dlopen on libdl6a.so" \
|
|
"-Wl,--no-as-needed,-Bsymbolic,--dynamic-list-data $extralibs" "" \
|
|
{dl6amain.c} "dl6a4" "dl6a.out" ] \
|
|
[list "Run dl6a5 with -Bsymbolic-functions --dynamic-list-cpp-new and dlopen on libdl6a.so" \
|
|
"$NOPIE_LDFLAGS -Wl,--no-as-needed,-Bsymbolic-functions,--dynamic-list-cpp-new $extralibs" "" \
|
|
{dl6amain.c} "dl6a5" "dl6b.out" "$NOPIE_CFLAGS" ] \
|
|
[list "Run dl6a6 with --dynamic-list-cpp-new -Bsymbolic-functions and dlopen on libdl6a.so" \
|
|
"$NOPIE_LDFLAGS -Wl,--no-as-needed,--dynamic-list-cpp-new,-Bsymbolic-functions $extralibs" "" \
|
|
{dl6amain.c} "dl6a6" "dl6b.out" "$NOPIE_CFLAGS" ] \
|
|
[list "Run dl6a7 with --dynamic-list-data -Bsymbolic and dlopen on libdl6a.so" \
|
|
"$NOPIE_LDFLAGS -Wl,--no-as-needed,--dynamic-list-data,-Bsymbolic $extralibs" "" \
|
|
{dl6amain.c} "dl6a7" "dl6a.out" "$NOPIE_CFLAGS" ] \
|
|
[list "Run dl6b1 with --dynamic-list-data and dlopen on libdl6b.so" \
|
|
"-Wl,--no-as-needed,--dynamic-list-data $extralibs" "" \
|
|
{dl6bmain.c} "dl6b1" "dl6a.out" ] \
|
|
[list "Run dl6b2 with dlopen on libdl6b.so" \
|
|
"-Wl,--no-as-needed $extralibs" "" \
|
|
{dl6bmain.c} "dl6b2" "dl6b.out" ] \
|
|
[list "Run dl6c1 with --dynamic-list-data and dlopen on libdl6c.so" \
|
|
"-Wl,--no-as-needed,--dynamic-list-data $extralibs" "" \
|
|
{dl6cmain.c} "dl6c1" "dl6b.out" ] \
|
|
[list "Run dl6d1 with --dynamic-list-data and dlopen on libdl6d.so" \
|
|
"-Wl,--no-as-needed,--dynamic-list-data $extralibs" "" \
|
|
{dl6dmain.c} "dl6d1" "dl6b.out" ] \
|
|
[list "Run pr21964-2" \
|
|
"-Wl,--no-as-needed,-rpath,tmpdir tmpdir/pr21964-2a.so $extralibs" "" \
|
|
{pr21964-2c.c} "pr21964-2" "pass.out" ] \
|
|
]
|
|
|
|
# Only run them when libdl is available.
|
|
if [check_libdl_available] {
|
|
# XFAIL on NetBSD ELF systems as they do not currently support the .*_array
|
|
# sections.
|
|
run_ld_link_exec_tests $dlopen_run_tests "*-*-netbsdelf*"
|
|
}
|
|
|
|
# Check --no-add-needed and --no-copy-dt-needed-entries
|
|
set testname "--no-add-needed"
|
|
set exec_output [run_host_cmd "$CC" "tmpdir/libneeded1c.o -Wl,--no-add-needed,-rpath-link=tmpdir -Ltmpdir -lneeded1a"]
|
|
if { [ regexp "tmpdir/libneeded1b.so: .*: DSO missing" $exec_output ] } {
|
|
pass $testname
|
|
} {
|
|
fail $testname
|
|
}
|
|
set testname "--no-copy-dt-needed-entries"
|
|
set exec_output [run_host_cmd "$CC" "tmpdir/libneeded1c.o -Wl,--no-copy-dt-needed-entries,-rpath-link=tmpdir -Ltmpdir -lneeded1a"]
|
|
if { [ regexp "tmpdir/libneeded1b.so: .*: DSO missing" $exec_output ] } {
|
|
pass $testname
|
|
} {
|
|
fail $testname
|
|
}
|
|
set testname "--no-add-needed -shared"
|
|
set exec_output [run_host_cmd "$CC" "-shared tmpdir/libneeded1pic.o -Wl,--no-add-needed,-z,defs -Ltmpdir -lneeded1a"]
|
|
if { [ regexp "undefined reference to `\.?bar'" $exec_output ] } {
|
|
pass $testname
|
|
} {
|
|
fail $testname
|
|
}
|
|
set testname "--no-copy-dt-needed-entries -shared"
|
|
set exec_output [run_host_cmd "$CC" "-shared tmpdir/libneeded1pic.o -Wl,--no-copy-dt-needed-entries,-z,defs -Ltmpdir -lneeded1a"]
|
|
if { [ regexp "undefined reference to `\.?bar'" $exec_output ] } {
|
|
pass $testname
|
|
} {
|
|
fail $testname
|
|
}
|
|
|
|
# Check to see if the C++ compiler works
|
|
if { [which $CXX] == 0 } {
|
|
return
|
|
}
|
|
|
|
set build_cxx_tests {
|
|
{"Build libdl3a.so with --dynamic-list=dl3.list"
|
|
"-shared -Wl,--dynamic-list=dl3.list" "-fPIC"
|
|
{dl3.cc} {} "libdl3a.so" "c++"}
|
|
{"Build libdl3b.so with -Bsymbolic"
|
|
"-shared -Wl,-Bsymbolic" "-fPIC"
|
|
{dl3.cc} {} "libdl3b.so" "c++"}
|
|
{"Build libdl3a.so with --dynamic-list-cpp-typeinfo"
|
|
"-shared -Wl,--dynamic-list-cpp-typeinfo" "-fPIC"
|
|
{dl3.cc} {} "libdl3c.so" "c++"}
|
|
{"Build libdnew1a.so with --Bsymbolic-functions --dynamic-list-cpp-new"
|
|
"-shared -Wl,-Bsymbolic-functions,--dynamic-list-cpp-new" "-fPIC -ansi"
|
|
{del.cc new.cc} {} "libnew1a.so" "c++"}
|
|
{"Build libdnew1b.so with --dynamic-list-data --dynamic-list-cpp-new"
|
|
"-shared -Wl,--dynamic-list-data,--dynamic-list-cpp-new" "-fPIC -ansi"
|
|
{del.cc new.cc} {} "libnew1b.so" "c++"}
|
|
}
|
|
|
|
# "-shared -Bsymbolic" only works with gcc 4.5.0 and newer.
|
|
# {"Run with libdl3b.so"
|
|
# "tmpdir/libdl3b.so" ""
|
|
# {dl3main.cc} "dl3b" "dl3b.out" "" "c++"}
|
|
set run_cxx_tests {
|
|
{"Run with libdl3a.so"
|
|
"-Wl,--no-as-needed tmpdir/libdl3a.so" ""
|
|
{dl3main.cc} "dl3a" "dl3a.out" "" "c++"}
|
|
{"Run with libdl3c.so"
|
|
"-Wl,--no-as-needed tmpdir/libdl3c.so" ""
|
|
{dl3main.cc} "dl3c" "dl3a.out" "" "c++"}
|
|
{"Run with libnew1a.so"
|
|
"-Wl,--no-as-needed tmpdir/libnew1a.so" ""
|
|
{dl5.cc} "dl5a" "dl5.out" "-ansi" "c++"}
|
|
{"Run with libnew1b.so"
|
|
"-Wl,--no-as-needed tmpdir/libnew1b.so" ""
|
|
{dl5.cc} "dl5b" "dl5.out" "-ansi" "c++"}
|
|
}
|
|
|
|
run_cc_link_tests $build_cxx_tests
|
|
run_ld_link_exec_tests $run_cxx_tests
|
|
|
|
if { [istarget *-*-linux*]
|
|
|| [istarget *-*-nacl*]
|
|
|| [istarget *-*-gnu*] } {
|
|
run_cc_link_tests [list \
|
|
[list \
|
|
"Build libpr2404b.a with PIE" \
|
|
"" \
|
|
"-fPIE" \
|
|
{ pr2404b.c } \
|
|
{} \
|
|
"libpr2404b.a" \
|
|
] \
|
|
[list \
|
|
"Build pr19579a.o" \
|
|
"" "-fPIE" \
|
|
{pr19579a.c} \
|
|
{} \
|
|
"libpr19579a.a" \
|
|
] \
|
|
[list \
|
|
"Build libpr19579.so" \
|
|
"-shared" \
|
|
"-fPIC" \
|
|
{pr19579b.c} \
|
|
{} \
|
|
"libpr19579.so" \
|
|
] \
|
|
[list \
|
|
"Build libpr19579now.so" \
|
|
"-shared -Wl,-z,now" \
|
|
"-fPIC" \
|
|
{pr19579b.c} \
|
|
{} \
|
|
"libpr19579.so" \
|
|
] \
|
|
]
|
|
run_ld_link_exec_tests [list \
|
|
[list \
|
|
"Run pr18458 with PIE" \
|
|
"-pie -Wl,--no-as-needed,-z,now tmpdir/libpr18458a.so tmpdir/libpr18458b.so" \
|
|
"" \
|
|
{pr18458c.c} \
|
|
"pr18458p" \
|
|
"pass.out" \
|
|
"-fPIE" \
|
|
] \
|
|
[list \
|
|
"Run pr2404 with PIE" \
|
|
"-pie -Wl,--no-as-needed tmpdir/pr2404b.o tmpdir/libpr2404a.so" \
|
|
"" \
|
|
{ dummy.c } \
|
|
"pr2404pie" \
|
|
"pr2404.out" \
|
|
"-fPIE" \
|
|
] \
|
|
[list \
|
|
"Run pr2404 with PIE (-z now)" \
|
|
"-pie -Wl,-z,now -Wl,--no-as-needed tmpdir/pr2404b.o tmpdir/libpr2404n.so" \
|
|
"" \
|
|
{ dummy.c } \
|
|
"pr2404pien" \
|
|
"pr2404.out" \
|
|
"-fPIE" \
|
|
] \
|
|
[list \
|
|
"Run pr18718" \
|
|
"" \
|
|
"" \
|
|
{ pr18718.c check-ptr-eq.c } \
|
|
"pr18718" \
|
|
"pass.out" \
|
|
"-O2 -I../bfd" \
|
|
] \
|
|
[list \
|
|
"Run pr18718 (-z now)" \
|
|
"-Wl,-z,now" \
|
|
"" \
|
|
{ pr18718.c check-ptr-eq.c } \
|
|
"pr18718" \
|
|
"pass.out" \
|
|
"-O2 -I../bfd" \
|
|
] \
|
|
[list \
|
|
"Run pr18718 with PIE (1)" \
|
|
"-pie" \
|
|
"" \
|
|
{ pr18718.c check-ptr-eq.c } \
|
|
"pr18718pie1" \
|
|
"pass.out" \
|
|
"-O2 -fPIE -I../bfd" \
|
|
] \
|
|
[list \
|
|
"Run pr18718 with PIE (2)" \
|
|
"" \
|
|
"" \
|
|
{ pr18718.c check-ptr-eq.c } \
|
|
"pr18718pie2" \
|
|
"pass.out" \
|
|
"-O2 -fPIE -I../bfd" \
|
|
] \
|
|
[list \
|
|
"Run pr18718 with PIE (3)" \
|
|
"-pie -Wl,-z,now" \
|
|
"" \
|
|
{ pr18718.c check-ptr-eq.c } \
|
|
"pr18718pie3" \
|
|
"pass.out" \
|
|
"-O2 -fPIE -I../bfd" \
|
|
] \
|
|
[list \
|
|
"Run pr18718 with PIE (4)" \
|
|
"-Wl,-z,now" \
|
|
"" \
|
|
{ pr18718.c check-ptr-eq.c } \
|
|
"pr18718pie4" \
|
|
"pass.out" \
|
|
"-O2 -fPIE -I../bfd" \
|
|
] \
|
|
[list \
|
|
"Run pr18718 with PIC (1)" \
|
|
"" \
|
|
"" \
|
|
{ pr18718.c check-ptr-eq.c } \
|
|
"pr18718pic1" \
|
|
"pass.out" \
|
|
"-O2 -fPIC -I../bfd" \
|
|
] \
|
|
[list \
|
|
"Run pr18718 with PIC (2)" \
|
|
"-pie" \
|
|
"" \
|
|
{ pr18718.c check-ptr-eq.c } \
|
|
"pr18718pic2" \
|
|
"pass.out" \
|
|
"-O2 -fPIC -I../bfd" \
|
|
] \
|
|
[list \
|
|
"Run pr18718 with PIC (3)" \
|
|
"-Wl,-z,now" \
|
|
"" \
|
|
{ pr18718.c check-ptr-eq.c } \
|
|
"pr18718pic3" \
|
|
"pass.out" \
|
|
"-O2 -fPIC -I../bfd" \
|
|
] \
|
|
[list \
|
|
"Run pr18718 with PIC (4)" \
|
|
"-pie -Wl,-z,now" \
|
|
"" \
|
|
{ pr18718.c check-ptr-eq.c } \
|
|
"pr18718pic4" \
|
|
"pass.out" \
|
|
"-O2 -fPIC -I../bfd" \
|
|
] \
|
|
[list \
|
|
"Run pr19579" \
|
|
"-pie -Wl,--no-as-needed,-z,text tmpdir/pr19579a.o tmpdir/libpr19579.so" \
|
|
"" \
|
|
{dummy.c} \
|
|
"pr19579" \
|
|
"pass.out" \
|
|
"-fPIE" \
|
|
] \
|
|
[list \
|
|
"Run pr19579 (-z now)" \
|
|
"-pie -Wl,-z,now -Wl,--no-as-needed,-z,text tmpdir/pr19579a.o tmpdir/libpr19579.so" \
|
|
"" \
|
|
{dummy.c} \
|
|
"pr19579n" \
|
|
"pass.out" \
|
|
"-fPIE" \
|
|
] \
|
|
]
|
|
}
|
|
|
|
proc mix_pic_and_non_pic {xfails cflags ldflags exe} {
|
|
run_cc_link_tests [list \
|
|
[list \
|
|
"Build libpr19719a.so" \
|
|
"-shared -Wl,-soname,libpr19719.so" \
|
|
"-fPIC" \
|
|
{ pr19719d.c } \
|
|
{} \
|
|
"libpr19719a.so" \
|
|
] \
|
|
[list \
|
|
"Build libpr19719b.so" \
|
|
"-shared -Wl,-soname,libpr19719.so" \
|
|
"-fPIC" \
|
|
{ dummy.c } \
|
|
{} \
|
|
"libpr19719b.so" \
|
|
] \
|
|
[list \
|
|
"Build libpr19719b.o" \
|
|
"-r -nostdlib" \
|
|
"-fPIC" \
|
|
{ pr19719b.c } \
|
|
{} \
|
|
"libpr19719b.o" \
|
|
] \
|
|
]
|
|
|
|
send_log "cp tmpdir/libpr19719b.so tmpdir/libpr19719.so\n"
|
|
exec cp tmpdir/libpr19719b.so tmpdir/libpr19719.so
|
|
|
|
run_ld_link_exec_tests [list \
|
|
[list \
|
|
"Run $exe fun defined" \
|
|
"-Wl,--no-as-needed,-rpath,tmpdir $ldflags tmpdir/libpr19719b.o tmpdir/libpr19719.so" \
|
|
"" \
|
|
{ pr19719a.c pr19719c.c } \
|
|
$exe \
|
|
"pass.out" \
|
|
"$cflags" \
|
|
] \
|
|
]
|
|
|
|
send_log "cp tmpdir/libpr19719a.so tmpdir/libpr19719.so\n"
|
|
exec cp tmpdir/libpr19719a.so tmpdir/libpr19719.so
|
|
|
|
foreach targ $xfails {
|
|
setup_xfail $targ
|
|
}
|
|
|
|
if ![isnative] {
|
|
unsupported "Run $exe fun undefined"
|
|
return
|
|
}
|
|
|
|
set exec_output [run_host_cmd "tmpdir/$exe" ""]
|
|
if {![string match "PASS" $exec_output]} {
|
|
fail "Run $exe fun undefined"
|
|
} else {
|
|
pass "Run $exe fun undefined"
|
|
}
|
|
}
|
|
|
|
mix_pic_and_non_pic [list "arm*-*-*" "aarch64*-*-*"] "" "" "pr19719"
|
|
mix_pic_and_non_pic [] "-fPIE" "-pie" "pr19719pie"
|