| # Expect script for --exclude-libs tests |
| # Copyright (C) 2004-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. |
| |
| # Make sure that ld can hide symbols from libraries when building a shared |
| # library. |
| |
| # This test can only be run on ELF platforms. |
| if ![is_elf_format] { |
| return |
| } |
| |
| # No shared lib support on this target. |
| if { [istarget "mcore-*-*"] } { |
| return |
| } |
| |
| set as_opt "" |
| |
| # This target requires extra as options when building code for shared |
| # libraries. |
| if { [istarget "tic6x-*-*"] } { |
| set as_opt "-mpic -mpid=near" |
| } |
| |
| global ar |
| global as |
| global ld |
| global nm |
| global nm_output |
| |
| set test1 "ld link shared library" |
| set test2 "ld export symbols from archive" |
| set test3 "ld link shared library with --exclude-libs" |
| set test4 "ld exclude symbols from archive - --exclude-libs libexclude" |
| set test5 "ld exclude symbols from archive - --exclude-libs libexclude.a" |
| set test6 "ld exclude symbols from archive - --exclude-libs ALL" |
| set test7 "ld exclude symbols from archive - --exclude-libs foo:libexclude.a" |
| set test8 "ld exclude symbols from archive - --exclude-libs foo,libexclude.a" |
| set test9 "ld don't exclude symbols from archive - --exclude-libs foo:bar" |
| |
| if { ![ld_assemble_flags $as $as_opt $srcdir/$subdir/exclude1.s tmpdir/exclude1.o ] |
| || ![ld_assemble_flags $as $as_opt $srcdir/$subdir/exclude2.s tmpdir/exclude2.o] } { |
| unresolved $test1 |
| return |
| } |
| |
| remote_file host delete "tmpdir/libexclude.a" |
| set catch_output [run_host_cmd "$ar" "cq tmpdir/libexclude.a tmpdir/exclude2.o"] |
| if {![string match "" $catch_output]} { |
| unresolved $test1 |
| return |
| } |
| |
| # Test that the symbol is normally exported. |
| |
| if { [ld_simple_link $ld tmpdir/exclude.so "--shared tmpdir/exclude1.o -Ltmpdir -lexclude"] } { |
| pass $test1 |
| } else { |
| if [string match "*shared not supported*" $link_output] { |
| unsupported "$test1 - -shared is not supported by this target" |
| } else { |
| fail $test1 |
| } |
| return |
| } |
| |
| if ![ld_nm $nm "-D" tmpdir/exclude.so] { |
| unresolved $test2 |
| } elseif { [info exists nm_output(exclude_common)] |
| && [info exists nm_output(exclude_sym)] } { |
| pass $test2 |
| } else { |
| fail $test2 |
| } |
| |
| # Test --exclude-libs libexclude |
| |
| if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs libexclude --shared tmpdir/exclude1.o -Ltmpdir -lexclude"] } { |
| pass $test3 |
| } else { |
| fail $test3 |
| } |
| |
| if ![ld_nm $nm "-D" tmpdir/exclude.so] { |
| unresolved $test4 |
| } elseif { ! [info exists nm_output(exclude_common)] |
| && ! [info exists nm_output(exclude_sym)] } { |
| pass $test4 |
| } else { |
| fail $test4 |
| } |
| |
| # Test alternate spellings of --exclude-libs |
| |
| if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs libexclude.a --shared tmpdir/exclude1.o -Ltmpdir -lexclude"] |
| && [ld_nm $nm "-D" tmpdir/exclude.so] |
| && ! [info exists nm_output(exclude_common)] |
| && ! [info exists nm_output(exclude_sym)] } { |
| pass $test5 |
| } else { |
| fail $test5 |
| } |
| |
| if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs ALL --shared tmpdir/exclude1.o -Ltmpdir -lexclude"] |
| && [ld_nm $nm "-D" tmpdir/exclude.so] |
| && ! [info exists nm_output(exclude_common)] |
| && ! [info exists nm_output(exclude_sym)] } { |
| pass $test6 |
| } else { |
| fail $test6 |
| } |
| |
| if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs foo:libexclude.a --shared tmpdir/exclude1.o -Ltmpdir -lexclude"] |
| && [ld_nm $nm "-D" tmpdir/exclude.so] |
| && ! [info exists nm_output(exclude_common)] |
| && ! [info exists nm_output(exclude_sym)] } { |
| pass $test7 |
| } else { |
| fail $test7 |
| } |
| |
| if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs foo,libexclude.a --shared tmpdir/exclude1.o -Ltmpdir -lexclude"] |
| && [ld_nm $nm "-D" tmpdir/exclude.so] |
| && ! [info exists nm_output(exclude_common)] |
| && ! [info exists nm_output(exclude_sym)] } { |
| pass $test8 |
| } else { |
| fail $test8 |
| } |
| |
| if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs foo:bar --shared tmpdir/exclude1.o -Ltmpdir -lexclude"] |
| && [ld_nm $nm "-D" tmpdir/exclude.so] |
| && [info exists nm_output(exclude_common)] |
| && [info exists nm_output(exclude_sym)] } { |
| pass $test9 |
| } else { |
| fail $test9 |
| } |