aec6b87e0b
For i386 and x86-64, non-PIC references to undefined weak symbols are resolved without dynamic relocation when creating executable. Resolved undefined weak symbols are removed from the dynamic symbol table in executable. One exception is on i386, we need resolved undefined weak symbols in the dynamic symbol table in PIE if input relocatable files contain branchs without PLT so that we can branch to 0 with dynamic relocation in text section. This makes behaviors of dynamic executable and position independent executable predictable with mixed PIC and non-PIC references to undefined weak symbols. If all references to undefined weak symbols are PIC, dynamic relocations against undefined weak symbols will be generated in executable unless -z nodynamic-undefined-weak is passed to linker. bfd/ PR ld/19636 PR ld/19704 PR ld/19719 * elf32-i386.c (UNDEFINED_WEAK_RESOLVED_TO_ZERO): New. (elf_i386_link_hash_entry): Add has_got_reloc and has_non_got_reloc. (elf_i386_link_hash_table): Add interp. (elf_i386_link_hash_newfunc): Initialize has_got_reloc and has_non_got_reloc. (elf_i386_copy_indirect_symbol): Copy has_got_reloc and has_non_got_reloc. (elf_i386_check_relocs): Set has_got_reloc and has_non_got_reloc. (elf_i386_fixup_symbol): New function. (elf_i386_pie_finish_undefweak_symbol): Likewise. (elf_i386_allocate_dynrelocs): Don't allocate space for dynamic relocations and discard relocations against resolved undefined weak symbols in executable. Don't make resolved undefined weak symbols in executable dynamic. Keep dynamic non-GOT/non-PLT relocation against undefined weak symbols in PIE. (elf_i386_size_dynamic_sections): Set interp to .interp section. (elf_i386_relocate_section): Don't generate dynamic relocations against resolved undefined weak symbols in PIE, except for R_386_PC32. (elf_i386_finish_dynamic_symbol): Keep PLT/GOT entries without dynamic PLT/GOT relocations for resolved undefined weak symbols. Don't generate dynamic relocation against resolved undefined weak symbol in executable. (elf_i386_finish_dynamic_sections): Call elf_i386_pie_finish_undefweak_symbol on all symbols in PIE. (elf_backend_fixup_symbol): New. * elf64-x86-64.c (UNDEFINED_WEAK_RESOLVED_TO_ZERO): New. (elf_x86_64_link_hash_entry): Add has_got_reloc and has_non_got_reloc. (elf_x86_64_link_hash_table): Add interp. (elf_x86_64_link_hash_newfunc): Initialize has_got_reloc and has_non_got_reloc. (elf_x86_64_copy_indirect_symbol): Copy has_got_reloc and has_non_got_reloc. (elf_x86_64_check_relocs): Set has_got_reloc and has_non_got_reloc. (elf_x86_64_fixup_symbol): New function. (elf_x86_64_pie_finish_undefweak_symbol): Likewise. (elf_x86_64_allocate_dynrelocs): Don't allocate space for dynamic relocations and discard relocations against resolved undefined weak symbols in executable. Don't make resolved undefined weak symbols in executable dynamic. (elf_x86_64_size_dynamic_sections): Set interp to .interp section. (elf_x86_64_relocate_section): Check relocation overflow for dynamic relocations against unresolved weak undefined symbols. Don't generate dynamic relocations against resolved weak undefined symbols in PIE. (elf_x86_64_finish_dynamic_symbol): Keep PLT/GOT entries without dynamic PLT/GOT relocations for resolved undefined weak symbols. Don't generate dynamic relocation against resolved undefined weak symbol in executable. (elf_x86_64_finish_dynamic_sections): Call elf_x86_64_pie_finish_undefweak_symbol on all symbols in PIE. (elf_backend_fixup_symbol): New. include/ PR ld/19636 PR ld/19704 PR ld/19719 * bfdlink.h (bfd_link_info): Add dynamic_undefined_weak. ld/ PR ld/19636 PR ld/19704 PR ld/19719 * Makefile.am (ELF_X86_DEPS): Add dynamic_undefined_weak.sh. * Makefile.in: Regenerated. * NEWS: Mention -z nodynamic-undefined-weak. * ld.texinfo: Document -z nodynamic-undefined-weak. * ldmain.c (main): Initialize dynamic_undefined_weak to -1. * emulparams/dynamic_undefined_weak.sh: New file. * emulparams/elf32_x86_64.sh: Source dynamic_undefined_weak.sh. * emulparams/elf_i386.sh: Likewise. * emulparams/elf_i386_be.sh: Likewise. * emulparams/elf_i386_chaos.sh: Likewise. * emulparams/elf_i386_ldso.sh: Likewise. * emulparams/elf_i386_vxworks.sh: Likewise. * emulparams/elf_iamcu.sh: Likewise. * emulparams/elf_k1om.sh: Likewise. * emulparams/elf_l1om.sh: Likewise. * emulparams/elf_x86_64.sh: Likewise. * emulparams/extern_protected_data.sh (PARSE_AND_LIST_OPTIONS): Append. (PARSE_AND_LIST_ARGS_CASE_Z): Likewise. * testsuite/ld-elf/pr19719a.c: New file. * testsuite/ld-elf/pr19719b.c: Likewise. * testsuite/ld-elf/pr19719c.c: Likewise. * testsuite/ld-elf/pr19719d.c: Likewise. * testsuite/ld-i386/pr19636-1.s: Likewise. * testsuite/ld-i386/pr19636-1a.d: Likewise. * testsuite/ld-i386/pr19636-1b.d: Likewise. * testsuite/ld-i386/pr19636-1c.d: Likewise. * testsuite/ld-i386/pr19636-1d-nacl.d: Likewise. * testsuite/ld-i386/pr19636-1d.d: Likewise. * testsuite/ld-i386/pr19636-1e.d: Likewise. * testsuite/ld-i386/pr19636-1f.d: Likewise. * testsuite/ld-i386/pr19636-1g.d: Likewise. * testsuite/ld-i386/pr19636-1h.d: Likewise. * testsuite/ld-i386/pr19636-1i.d: Likewise. * testsuite/ld-i386/pr19636-2.s: Likewise. * testsuite/ld-i386/pr19636-2a.d: Likewise. * testsuite/ld-i386/pr19636-2b.d: Likewise. * testsuite/ld-i386/pr19636-2c-nacl.d: Likewise. * testsuite/ld-i386/pr19636-2c.d: Likewise. * testsuite/ld-i386/pr19636-2d-nacl.d: Likewise. * testsuite/ld-i386/pr19636-2d.d: Likewise. * testsuite/ld-i386/pr19636-2e-nacl.d: Likewise. * testsuite/ld-i386/pr19636-2e.d: Likewise. * testsuite/ld-i386/pr19636-3.s: Likewise. * testsuite/ld-i386/pr19636-3a.d: Likewise. * testsuite/ld-i386/pr19636-3b.d: Likewise. * testsuite/ld-i386/pr19636-3c.d: Likewise. * testsuite/ld-i386/pr19636-3d.d: Likewise. * testsuite/ld-i386/pr19636-3e.d: Likewise. * testsuite/ld-i386/pr19636-3f.d: Likewise. * testsuite/ld-i386/pr19636-3g.d: Likewise. * testsuite/ld-i386/pr19636-4.s: Likewise. * testsuite/ld-i386/pr19636-4a.d: Likewise. * testsuite/ld-i386/pr19636-4b.d: Likewise. * testsuite/ld-i386/pr19636-4c.d: Likewise. * testsuite/ld-i386/pr19636-4d.d: Likewise. * testsuite/ld-i386/pr19704.out: Likewise. * testsuite/ld-i386/pr19704a.c: Likewise. * testsuite/ld-i386/pr19704b.c: Likewise. * testsuite/ld-x86-64/pr19636-1.s: Likewise. * testsuite/ld-x86-64/pr19636-1a.d: Likewise. * testsuite/ld-x86-64/pr19636-1b.d: Likewise. * testsuite/ld-x86-64/pr19636-1c.d: Likewise. * testsuite/ld-x86-64/pr19636-1d.d: Likewise. * testsuite/ld-x86-64/pr19636-1e.d: Likewise. * testsuite/ld-x86-64/pr19636-1f.d: Likewise. * testsuite/ld-x86-64/pr19636-1g.d: Likewise. * testsuite/ld-x86-64/pr19636-2.s: Likewise. * testsuite/ld-x86-64/pr19636-2a.d: Likewise. * testsuite/ld-x86-64/pr19636-2b.d: Likewise. * testsuite/ld-x86-64/pr19636-2c.d: Likewise. * testsuite/ld-x86-64/pr19636-2d-nacl.d: Likewise. * testsuite/ld-x86-64/pr19636-2d.d: Likewise. * testsuite/ld-x86-64/pr19636-2e.d: Likewise. * testsuite/ld-x86-64/pr19636-2f.d: Likewise. * testsuite/ld-x86-64/pr19636-2g.d: Likewise. * testsuite/ld-x86-64/pr19636-2h.d: Likewise. * testsuite/ld-x86-64/pr19636-2i.d: Likewise. * testsuite/ld-x86-64/pr19636-3.s: Likewise. * testsuite/ld-x86-64/pr19636-3a.d: Likewise. * testsuite/ld-x86-64/pr19636-3b.d: Likewise. * testsuite/ld-x86-64/pr19636-3c.d: Likewise. * testsuite/ld-x86-64/pr19636-3d.d: Likewise. * testsuite/ld-x86-64/pr19704.out: Likewise. * testsuite/ld-x86-64/pr19704a.c: Likewise. * testsuite/ld-x86-64/pr19704b.c: Likewise. * testsuite/ld-elf/shared.exp (mix_pic_and_non_pic): New. Run mix_pic_and_non_pic. * testsuite/ld-i386/i386.exp (undefined_weak): New. Run undefined_weak and PR ld/19636 tests. * testsuite/ld-x86-64/x86-64.exp: Likewise. * testsuite/ld-x86-64/pr13082-3b.d: Updated. * testsuite/ld-x86-64/pr13082-4b.d: Likewise.
644 lines
22 KiB
Text
644 lines
22 KiB
Text
# Expect script for various ELF tests.
|
|
# Copyright (C) 2006-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.
|
|
#
|
|
|
|
# Exclude non-ELF targets.
|
|
|
|
# The following tests require running the executable generated by ld,
|
|
# or enough of a build environment to create a fully linked executable.
|
|
# This is not commonly available when testing a cross-built linker.
|
|
if ![isnative] {
|
|
return
|
|
}
|
|
|
|
if ![is_elf_format] {
|
|
return
|
|
}
|
|
|
|
# Check to see if the C compiler works
|
|
if { [which $CC] == 0 } {
|
|
return
|
|
}
|
|
|
|
# Add -ldl to extralibs if needed
|
|
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}} "libbarw.so"
|
|
"C" "^.*\\\): warning: function foo is deprecated$"}
|
|
{"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,--add-needed,-rpath=tmpdir,-z,defs -Ltmpdir -lneeded1a" ""
|
|
{dummy.c} {} "needed1a.so"}
|
|
{"Build needed1b.so with --copy-dt-needed-entries"
|
|
"-shared tmpdir/libneeded1pic.o -Wl,--copy-dt-needed-entries,-rpath=tmpdir,-z,defs -Ltmpdir -lneeded1a" ""
|
|
{dummy.c} {} "needed1b.so"}
|
|
{"Build needed1a.so with --no-add-needed"
|
|
"-shared tmpdir/libneeded1pic.o -Wl,--no-add-needed -Ltmpdir -lneeded1a" ""
|
|
{dummy.c} {} "needed1c.so"}
|
|
{"Build needed1b.so with --no-copy-dt-needed-entries"
|
|
"-shared tmpdir/libneeded1pic.o -Wl,--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 libpr2404b.a"
|
|
"" ""
|
|
{pr2404b.c} {} "libpr2404b.a"}
|
|
{"Build rdynamic-1"
|
|
"-rdynamic -Wl,--gc-sections" "-ffunction-sections"
|
|
{rdynamic-1.c} {{readelf {-s} rdynamic-1.rd}} "rdynamic-1"}
|
|
{"Build dynamic-1"
|
|
"-Wl,--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 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"
|
|
"tmpdir/libpr16452b.so -Wl,-rpath=tmpdir" ""
|
|
{pr16452b.c} {{objdump {-p} pr16452.od}} "pr16452"}
|
|
{"Build pr16457"
|
|
"tmpdir/libpr16452b.so -Wl,-rpath=tmpdir" ""
|
|
{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"}
|
|
}
|
|
|
|
run_cc_link_tests $build_tests
|
|
|
|
set run_tests {
|
|
{"Run normal with libfoo.so"
|
|
"tmpdir/begin.o tmpdir/libfoo.so tmpdir/end.o" ""
|
|
{main.c} "normal" "normal.out"}
|
|
{"Run protected with libfoo.so"
|
|
"tmpdir/begin.o tmpdir/libfoo.so tmpdir/endprotected.o" ""
|
|
{main.c} "protected" "normal.out"}
|
|
{"Run hidden with libfoo.so"
|
|
"tmpdir/begin.o tmpdir/libfoo.so tmpdir/endhidden.o" ""
|
|
{main.c} "hidden" "hidden.out"}
|
|
{"Run normal with versioned libfoo.so"
|
|
"tmpdir/begin.o tmpdir/libfoov.so tmpdir/end.o" ""
|
|
{main.c} "normalv" "normal.out"}
|
|
{"Run warn with versioned libfoo.so"
|
|
"tmpdir/beginwarn.o tmpdir/libfoov.so" ""
|
|
{main.c} "warn" "warn.out"
|
|
"" "" "^.*\\\): warning: function foo is deprecated$"}
|
|
{"Run protected with versioned libfoo.so"
|
|
"tmpdir/begin.o tmpdir/libfoov.so tmpdir/endprotected.o" ""
|
|
{main.c} "protected" "normal.out"}
|
|
{"Run hidden with versioned libfoo.so"
|
|
"tmpdir/begin.o tmpdir/libfoov.so tmpdir/endhidden.o" ""
|
|
{main.c} "hiddenv" "hidden.out"}
|
|
{"Run normal libbar.so with libfoo.so"
|
|
"tmpdir/libbarfoo.so tmpdir/libfoo.so" ""
|
|
{main.c} "normal" "normal.out"}
|
|
{"Run protected libbar.so with libfoo.so"
|
|
"tmpdir/libbarpfoo.so tmpdir/libfoo.so" ""
|
|
{main.c} "protected" "normal.out"}
|
|
{"Run hidden libbar.so with libfoo.so"
|
|
"tmpdir/libbarhfoo.so tmpdir/libfoo.so" ""
|
|
{main.c} "hidden" "hidden.out"}
|
|
{"Run normal libbar.so with versioned libfoo.so"
|
|
"tmpdir/libbarfoov.so tmpdir/libfoov.so" ""
|
|
{main.c} "normal" "normal.out"}
|
|
{"Run protected libbar.so with versioned libfoo.so"
|
|
"tmpdir/libbarpfoov.so tmpdir/libfoov.so" ""
|
|
{main.c} "protected" "normal.out"}
|
|
{"Run hidden libbar.so with versioned libfoo.so"
|
|
"tmpdir/libbarhfoov.so tmpdir/libfoov.so" ""
|
|
{main.c} "hidden" "hidden.out"}
|
|
{"Run dl1a with --dynamic-list=dl1.list and dlopen on libdl1.so"
|
|
"--dynamic-list=dl1.list $extralibs" ""
|
|
{dl1main.c} "dl1a" "dl1.out"}
|
|
{"Run dl1b with --dynamic-list-data and dlopen on libdl1.so"
|
|
"--dynamic-list-data $extralibs" ""
|
|
{dl1main.c} "dl1b" "dl1.out"}
|
|
{"Run with libdl2a.so"
|
|
"tmpdir/libdl2a.so" ""
|
|
{dl2main.c} "dl2a" "dl2a.out"}
|
|
{"Run with libdl2b.so"
|
|
"tmpdir/libdl2b.so" ""
|
|
{dl2main.c} "dl2b" "dl2b.out"}
|
|
{"Run with libdl2c.so"
|
|
"tmpdir/libdl2c.so" ""
|
|
{dl2main.c} "dl2c" "dl2b.out"}
|
|
{"Run with libdl4a.so"
|
|
"tmpdir/libdl4a.so" ""
|
|
{dl4main.c} "dl4a" "dl4a.out"}
|
|
{"Run with libdl4b.so"
|
|
"tmpdir/libdl4b.so" ""
|
|
{dl4main.c} "dl4b" "dl4a.out"}
|
|
{"Run with libdl4c.so"
|
|
"tmpdir/libdl4c.so" ""
|
|
{dl4main.c} "dl4c" "dl4b.out"}
|
|
{"Run with libdl4d.so"
|
|
"tmpdir/libdl4d.so" ""
|
|
{dl4main.c} "dl4d" "dl4b.out"}
|
|
{"Run with libdl4e.so"
|
|
"tmpdir/libdl4e.so" ""
|
|
{dl4main.c} "dl4e" "dl4a.out"}
|
|
{"Run with libdl4f.so"
|
|
"tmpdir/libdl4f.so" ""
|
|
{dl4main.c} "dl4f" "dl4a.out"}
|
|
{"Run dl6a1 with --dynamic-list-data and dlopen on libdl6a.so"
|
|
"--dynamic-list-data $extralibs" ""
|
|
{dl6amain.c} "dl6a1" "dl6a.out"}
|
|
{"Run dl6a2 with -Bsymbolic-functions and dlopen on libdl6a.so"
|
|
"-Bsymbolic-functions $extralibs" ""
|
|
{dl6amain.c} "dl6a2" "dl6b.out"}
|
|
{"Run dl6a3 with -Bsymbolic and dlopen on libdl6a.so"
|
|
"-Bsymbolic $extralibs" ""
|
|
{dl6amain.c} "dl6a3" "dl6b.out"}
|
|
{"Run dl6a4 with -Bsymbolic --dynamic-list-data and dlopen on libdl6a.so"
|
|
"-Bsymbolic --dynamic-list-data $extralibs" ""
|
|
{dl6amain.c} "dl6a4" "dl6a.out"}
|
|
{"Run dl6a5 with -Bsymbolic-functions --dynamic-list-cpp-new and dlopen on libdl6a.so"
|
|
"-Bsymbolic-functions --dynamic-list-cpp-new $extralibs" ""
|
|
{dl6amain.c} "dl6a5" "dl6b.out"}
|
|
{"Run dl6a6 with --dynamic-list-cpp-new -Bsymbolic-functions and dlopen on libdl6a.so"
|
|
"--dynamic-list-cpp-new -Bsymbolic-functions $extralibs" ""
|
|
{dl6amain.c} "dl6a6" "dl6b.out"}
|
|
{"Run dl6a7 with --dynamic-list-data -Bsymbolic and dlopen on libdl6a.so"
|
|
"--dynamic-list-data -Bsymbolic $extralibs" ""
|
|
{dl6amain.c} "dl6a7" "dl6a.out"}
|
|
{"Run dl6b1 with --dynamic-list-data and dlopen on libdl6b.so"
|
|
"--dynamic-list-data $extralibs" ""
|
|
{dl6bmain.c} "dl6b1" "dl6a.out"}
|
|
{"Run dl6b2 with dlopen on libdl6b.so"
|
|
"$extralibs" ""
|
|
{dl6bmain.c} "dl6b2" "dl6b.out"}
|
|
{"Run dl6c1 with --dynamic-list-data and dlopen on libdl6c.so"
|
|
"--dynamic-list-data $extralibs" ""
|
|
{dl6cmain.c} "dl6c1" "dl6b.out"}
|
|
{"Run dl6d1 with --dynamic-list-data and dlopen on libdl6d.so"
|
|
"--dynamic-list-data $extralibs" ""
|
|
{dl6dmain.c} "dl6d1" "dl6b.out"}
|
|
{"Run with libdata1.so"
|
|
"tmpdir/libdata1.so" ""
|
|
{dynbss1.c} "dynbss1" "pass.out"}
|
|
{"Run with libdata2.so"
|
|
"tmpdir/libdata2.so" ""
|
|
{weakdef1.c} "weakdef1" "pass.out"}
|
|
{"Run with libfunc1.so comm1.o"
|
|
"tmpdir/libfunc1.so tmpdir/comm1.o" ""
|
|
{dummy.c} "comm1" "pass.out"}
|
|
{"Run with comm1.o libfunc1.so"
|
|
"tmpdir/comm1.o tmpdir/libfunc1.so" ""
|
|
{dummy.c} "comm1" "pass.out"}
|
|
{"Run with pr11138-2.c libpr11138-1.so"
|
|
"--version-script=pr11138-2.map tmpdir/pr11138-2.o tmpdir/libpr11138-1.so" ""
|
|
{dummy.c} "pr11138a" "pr11138.out"}
|
|
{"Run with libpr11138-1.so pr11138-2.c"
|
|
"--version-script=pr11138-2.map tmpdir/libpr11138-1.so tmpdir/pr11138-2.o" ""
|
|
{dummy.c} "pr11138b" "pr11138.out"}
|
|
{"Run with pr13250-3.c, libpr13250-1.so and libpr13250-2.so"
|
|
"--as-needed tmpdir/pr13250-3.o tmpdir/libpr13250-1.so tmpdir/libpr13250-2.so" ""
|
|
{dummy.c} "pr13250" "pass.out"}
|
|
{"Run with pr14323-1.c pr14323-2.so"
|
|
"tmpdir/libpr14323-2.so" ""
|
|
{pr14323-1.c} "pr14323" "pass.out"}
|
|
{"Run with pr14862-1.c libpr14862.so"
|
|
"--as-needed tmpdir/libpr14862-1.o tmpdir/libpr14862.so" ""
|
|
{dummy.c} "pr14862" "pr14862.out"}
|
|
{"Link with --add-needed"
|
|
"tmpdir/libneeded1c.o --add-needed -rpath=tmpdir -Ltmpdir -lneeded1a" ""
|
|
{dummy.c} "needed1a" "needed1.out"}
|
|
{"Link with --copy-dt-needed-entries"
|
|
"tmpdir/libneeded1c.o --copy-dt-needed-entries -rpath=tmpdir -Ltmpdir -lneeded1a" ""
|
|
{dummy.c} "needed1b" "needed1.out"}
|
|
{"Run relmain"
|
|
"--no-as-needed -rpath=tmpdir -Ltmpdir -lrel" ""
|
|
{relmain.c} "relmain" "relmain.out"}
|
|
{"Run pr2404"
|
|
"tmpdir/pr2404b.o tmpdir/libpr2404a.so" ""
|
|
{dummy.c} "pr2404" "pr2404.out"}
|
|
{"Run pr18458"
|
|
"tmpdir/libpr18458a.so tmpdir/libpr18458b.so -z now" ""
|
|
{pr18458c.c} "pr18458" "pass.out"}
|
|
}
|
|
|
|
# NetBSD ELF systems do not currently support the .*_array sections.
|
|
run_ld_link_exec_tests [list "*-*-netbsdelf*"] $run_tests
|
|
|
|
# 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"
|
|
{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"
|
|
{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"
|
|
"tmpdir/libnew1a.so" ""
|
|
{dl5.cc} "dl5a" "dl5.out" "" "c++"}
|
|
{"Run with libnew1b.so"
|
|
"tmpdir/libnew1b.so" ""
|
|
{dl5.cc} "dl5b" "dl5.out" "" "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" \
|
|
] \
|
|
]
|
|
run_ld_link_exec_tests [] [list \
|
|
[list \
|
|
"Run pr2404 with PIE" \
|
|
"-pie tmpdir/pr2404b.o tmpdir/libpr2404a.so" \
|
|
"" \
|
|
{ dummy.c } \
|
|
"pr2404pie" \
|
|
"pr2404.out" \
|
|
"-fPIE" \
|
|
] \
|
|
[list \
|
|
"Run pr18718" \
|
|
"" \
|
|
"" \
|
|
{ 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 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" \
|
|
] \
|
|
]
|
|
}
|
|
|
|
proc mix_pic_and_non_pic {cflags ldflags} {
|
|
set testname "Mixing PIC and non-PIC"
|
|
if { ![ string match "" $cflags$ldflags] } {
|
|
set testname "$testname ($cflags $ldflags)"
|
|
}
|
|
|
|
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 pr19073b.o" \
|
|
"-r -nostdlib" \
|
|
"-fPIC" \
|
|
{ pr19719b.c } \
|
|
{} \
|
|
"libpr19719b.o" \
|
|
] \
|
|
]
|
|
|
|
exec cp tmpdir/libpr19719b.so tmpdir/libpr19719.so
|
|
|
|
run_ld_link_exec_tests [] [list \
|
|
[list \
|
|
"Run pr19719" \
|
|
"$ldflags tmpdir/libpr19719b.o tmpdir/libpr19719.so -R tmpdir" \
|
|
"" \
|
|
{ pr19719a.c pr19719c.c } \
|
|
"pr19719" \
|
|
"pass.out" \
|
|
"$cflags" \
|
|
] \
|
|
]
|
|
|
|
exec cp tmpdir/libpr19719a.so tmpdir/libpr19719.so
|
|
|
|
set exec_output [run_host_cmd tmpdir/pr19719 ""]
|
|
if {![string match "PASS" $exec_output]} {
|
|
fail $testname
|
|
} else {
|
|
pass $testname
|
|
}
|
|
}
|
|
|
|
mix_pic_and_non_pic "" ""
|
|
mix_pic_and_non_pic "-fPIE" "-pie"
|