1# Expect script for various indirect symbol tests. 2# Copyright (C) 2012-2016 Free Software Foundation, Inc. 3# 4# This file is free software; you can redistribute it and/or modify 5# it under the terms of the GNU General Public License as published by 6# the Free Software Foundation; either version 2 of the License, or 7# (at your option) any later version. 8# 9# This program is distributed in the hope that it will be useful, 10# but WITHOUT ANY WARRANTY; without even the implied warranty of 11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12# GNU General Public License for more details. 13# 14# You should have received a copy of the GNU General Public License 15# along with this program; if not, write to the Free Software 16# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. 17# 18 19# 20# Written by H.J. Lu (hongjiu.lu@intel.com) 21# 22 23# Exclude non-ELF targets. 24 25if ![is_elf_format] { 26 return 27} 28 29# Skip target where -shared is not supported 30 31if ![check_shared_lib_support] { 32 return 33} 34 35# Check if compiler works 36if { [which $CC] == 0 } { 37 return 38} 39 40# Some bare-metal targets don't support shared libs or PIC. 41if { ![run_host_cmd_yesno $CC "-shared -fPIC $srcdir/$subdir/dummy.c -o tmpdir/t.so"] } { 42 return 43} 44 45proc check_link_message { cmd string testname } { 46 send_log "$cmd\n" 47 verbose "$cmd" 48 catch "exec $cmd" exec_output 49 send_log "$exec_output\n" 50 verbose "$exec_output" 51 52 foreach str $string { 53 if [string match "*$str*" $exec_output] { 54 pass "$testname: $str" 55 } else { 56 fail "$testname: $str" 57 } 58 } 59} 60 61if { ![ld_compile $CC $srcdir/$subdir/indirect1a.c tmpdir/indirect1a.o] 62 || ![ld_compile $CC $srcdir/$subdir/indirect1b.c tmpdir/indirect1b.o] 63 || ![ld_compile "$CC -fPIC" $srcdir/$subdir/indirect2.c tmpdir/indirect2.o] 64 || ![ld_compile $CC $srcdir/$subdir/indirect3a.c tmpdir/indirect3a.o] 65 || ![ld_compile $CC $srcdir/$subdir/indirect3b.c tmpdir/indirect3b.o] 66 || ![ld_compile $CC $srcdir/$subdir/indirect4a.c tmpdir/indirect4a.o] 67 || ![ld_compile $CC $srcdir/$subdir/indirect4b.c tmpdir/indirect4b.o] 68 || ![ld_compile "$CC -O2 -fPIC -I../bfd" $srcdir/$subdir/pr18720a.c tmpdir/pr18720a.o] 69 || ![ld_compile $CC $srcdir/$subdir/pr18720b.c tmpdir/pr18720b.o] 70 || ![ld_compile "$CC -fPIC" $srcdir/$subdir/pr19553d.c tmpdir/pr19553d.o] 71 || ![ld_compile "$CC -fPIC" $srcdir/$subdir/pr19553c.c tmpdir/pr19553c.o] 72 || ![ld_compile "$CC -fPIC" $srcdir/$subdir/pr19553b.c tmpdir/pr19553b.o] 73 || ![ld_compile $CC $srcdir/$subdir/pr19553a.c tmpdir/pr19553a.o] } { 74 unresolved "Indirect symbol tests" 75 return 76} 77 78set build_tests { 79 {"Build libindirect1c.so" 80 "-shared" "-fPIC" 81 {indirect1c.c} {} "libindirect1c.so"} 82 {"Build libindirect3c.so" 83 "-shared" "-fPIC" 84 {indirect3c.c} {} "libindirect3c.so"} 85 {"Build libindirect4c.so" 86 "-shared" "-fPIC" 87 {indirect4c.c} {} "libindirect4c.so"} 88 {"Build libpr18720c.so" 89 "-shared" "-fPIC" 90 {pr18720c.c} {} "libpr18720c.so"} 91 {"Build pr18720b1.o" 92 "-r -nostdlib tmpdir/pr18720b.o" "" 93 {dummy.c} {} "pr18720b1.o"} 94 {"Build libpr19553b.so" 95 "-shared -Wl,--version-script=pr19553.map" "-fPIC" 96 {pr19553b.c} {} "libpr19553b.so"} 97 {"Build libpr19553c.so" 98 "-shared -Wl,--version-script=pr19553.map" "-fPIC" 99 {pr19553c.c} {} "libpr19553c.so"} 100 {"Build libpr19553d.so" 101 "-shared tmpdir/libpr19553c.so" "-fPIC" 102 {pr19553d.c} {} "libpr19553d.so"} 103} 104 105run_cc_link_tests $build_tests 106 107global ld 108 109set string ": final link failed: Bad value" 110set string1 ": local symbol \`foo\' in tmpdir/indirect1b.o is referenced by DSO" 111 112set testname "Indirect symbol 1a" 113set cmd "$ld -e start -o tmpdir/indirect1 tmpdir/indirect1a.o tmpdir/indirect1b.o tmpdir/libindirect1c.so" 114check_link_message "$cmd" [list $string1 $string] "$testname" 115 116set testname "Indirect symbol 1b" 117set cmd "$ld -e start -o tmpdir/indirect1 tmpdir/indirect1a.o tmpdir/libindirect1c.so tmpdir/indirect1b.o" 118check_link_message "$cmd" [list $string1 $string] "$testname" 119 120set string ": final link failed: Nonrepresentable section on output" 121set string2 ": No symbol version section for versioned symbol \`foo@FOO\'" 122set testname "Indirect symbol 2" 123set cmd "$ld -shared -o tmpdir/indirect2.so tmpdir/indirect2.o" 124check_link_message "$cmd" [list $string2 $string] "$testname" 125 126# The following tests require running the executable generated by ld. 127if ![isnative] { 128 return 129} 130 131set run_tests { 132 {"Run with libindirect3c.so 1" 133 "tmpdir/indirect3a.o tmpdir/indirect3b.o tmpdir/libindirect3c.so" "" 134 {dummy.c} "indirect3a" "indirect3.out"} 135 {"Run with libindirect3c.so 2" 136 "tmpdir/indirect3a.o tmpdir/libindirect3c.so tmpdir/indirect3b.o" "" 137 {dummy.c} "indirect3b" "indirect3.out"} 138 {"Run with libindirect3c.so 3" 139 "tmpdir/indirect3b.o tmpdir/libindirect3c.so tmpdir/indirect3a.o" "" 140 {dummy.c} "indirect3c" "indirect3.out"} 141 {"Run with libindirect3c.so 4" 142 "tmpdir/libindirect3c.so tmpdir/indirect3b.o tmpdir/indirect3a.o" "" 143 {dummy.c} "indirect3d" "indirect3.out"} 144 {"Run with libindirect4c.so 1" 145 "tmpdir/indirect4a.o tmpdir/indirect4b.o tmpdir/libindirect4c.so" "" 146 {dummy.c} "indirect4a" "indirect4.out"} 147 {"Run with libindirect4c.so 2" 148 "tmpdir/indirect4a.o tmpdir/libindirect4c.so tmpdir/indirect4b.o" "" 149 {dummy.c} "indirect4b" "indirect4.out"} 150 {"Run with libindirect4c.so 3" 151 "tmpdir/indirect4b.o tmpdir/libindirect4c.so tmpdir/indirect4a.o" "" 152 {dummy.c} "indirect4c" "indirect4.out"} 153 {"Run with libindirect4c.so 4" 154 "tmpdir/libindirect4c.so tmpdir/indirect4b.o tmpdir/indirect4a.o" "" 155 {dummy.c} "indirect4d" "indirect4.out"} 156 {"Run with libpr18720c.so 1" 157 "tmpdir/pr18720a.o tmpdir/pr18720b.o tmpdir/libpr18720c.so" "" 158 {check-ptr-eq.c} "pr18720a" "pr18720.out"} 159 {"Run with libpr18720c.so 2" 160 "tmpdir/pr18720a.o tmpdir/libpr18720c.so tmpdir/pr18720b.o" "" 161 {check-ptr-eq.c} "pr18720b" "pr18720.out"} 162 {"Run with libpr18720c.so 3" 163 "tmpdir/pr18720b.o tmpdir/libpr18720c.so tmpdir/pr18720a.o" "" 164 {check-ptr-eq.c} "pr18720c" "pr18720.out"} 165 {"Run with libpr18720c.so 4" 166 "tmpdir/libpr18720c.so tmpdir/pr18720b.o tmpdir/pr18720a.o" "" 167 {check-ptr-eq.c} "pr18720d" "pr18720.out"} 168 {"Run with libpr18720c.so 5" 169 "tmpdir/libpr18720c.so tmpdir/pr18720b1.o tmpdir/pr18720a.o" "" 170 {check-ptr-eq.c} "pr18720d" "pr18720.out"} 171 {"Run with libpr19553b.so" 172 "tmpdir/libpr19553b.so tmpdir/libpr19553d.so -rpath-link ." "" 173 {pr19553a.c} "pr19553b" "pr19553b.out"} 174 {"Run with libpr19553c.so" 175 "tmpdir/libpr19553c.so tmpdir/libpr19553b.so tmpdir/libpr19553d.so" "" 176 {pr19553a.c} "pr19553c" "pr19553c.out"} 177 {"Run with libpr19553d.so" 178 "tmpdir/libpr19553d.so tmpdir/libpr19553b.so -rpath-link ." "" 179 {pr19553a.c} "pr19553d" "pr19553d.out"} 180} 181 182run_ld_link_exec_tests [] $run_tests 183