1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
|
# Expect script for ld-plugin tests
# Copyright (C) 2010-2014 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.
# These tests require the plugin API to be configured in.
if ![check_plugin_api_available] {
return
}
# And a compiler to be available.
set can_compile 1
set failure_kind "unresolved"
if { [which $CC] == 0 } {
# Don't fail immediately,
set can_compile 0
set failure_kind "unsupported"
}
pass "plugin API enabled"
global base_dir
# Look for the name we can dlopen in the test plugin's libtool control script.
set plugin_name [file_contents "$base_dir/libldtestplug.la"]
set plugin_name [regsub "'.*" [regsub ".*dlname='" "$plugin_name" ""] ""]
verbose "plugin name is '$plugin_name'"
# Use libtool to find full path to plugin rather than worrying
# about run paths or anything like that.
catch "exec $base_dir/libtool --config" lt_config
verbose "Full lt config: $lt_config" 3
# Look for "objdir=.libs"
regexp -line "^objdir=.*$" "$lt_config" lt_objdir
verbose "lt_objdir line is '$lt_objdir'" 3
set lt_objdir [regsub "objdir=" "$lt_objdir" ""]
set plugin_path "$base_dir/$lt_objdir/$plugin_name"
verbose "Full plugin path $plugin_path" 2
set regclm "-plugin-opt registerclaimfile"
set regas "-plugin-opt registerallsymbolsread"
set regcln "-plugin-opt registercleanup"
if { [istarget m681*-*-*] || [istarget m68hc1*-*-*] || [istarget m9s12x*-*-*] } {
# otherwise get FAILS due to _.frame
set CFLAGS "$CFLAGS -fomit-frame-pointer"
}
# In order to define symbols in plugin options in the list of tests below,
# we need to know if the platform prepends an underscore to C symbols,
# which we find out by compiling the test objects now. If there is any
# error compiling, we defer reporting it until after the list of tests has
# been initialised, so that we can use the names in the list to report;
# otherwise, we scan one of the files with 'nm' and look for a known symbol
# in the output to see if it is prefixed or not.
set failed_compile 0
set _ ""
set plugin_nm_output ""
if { $can_compile && \
(![ld_compile "$CC $CFLAGS" $srcdir/$subdir/main.c tmpdir/main.o] \
|| ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/func.c tmpdir/func.o] \
|| ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/text.c tmpdir/text.o]) } {
# Defer fail until we have list of tests set.
set failed_compile 1
}
if { $can_compile && !$failed_compile } {
# Find out if symbols have prefix on this platform before setting tests.
catch "exec $NM tmpdir/func.o" plugin_nm_output
if { [regexp "_func" "$plugin_nm_output"] } {
set _ "_"
}
}
set testobjfiles "tmpdir/main.o tmpdir/func.o tmpdir/text.o"
set testobjfiles_notext "tmpdir/main.o tmpdir/func.o"
# Rather than having libs we just define dummy values for anything
# we may need to link a target exe; we aren't going to run it anyway.
set libs "[ld_simple_link_defsyms] --defsym ${_}printf=${_}main --defsym ${_}puts=${_}main"
set plugin_tests [list \
[list "load plugin" "-plugin $plugin_path \
$testobjfiles $libs" "" "" "" {{ld plugin-1.d}} "main.x" ] \
[list "fail plugin onload" "-plugin $plugin_path -plugin-opt failonload \
$testobjfiles $libs" "" "" "" {{ld plugin-2.d}} "main.x" ] \
[list "fail plugin allsymbolsread" "-plugin $plugin_path $regas \
-plugin-opt failallsymbolsread \
$testobjfiles $libs" "" "" "" {{ld plugin-3.d}} "main.x" ] \
[list "fail plugin cleanup" "-plugin $plugin_path -plugin-opt failcleanup \
$regcln \
$testobjfiles $libs" "" "" "" {{ld plugin-4.d}} "main.x" ] \
[list "plugin all hooks" "-plugin $plugin_path $regclm $regas $regcln \
$testobjfiles $libs" "" "" "" {{ld plugin-5.d}} "main.x" ] \
[list "plugin claimfile lost symbol" "-plugin $plugin_path $regclm \
$regas $regcln -plugin-opt claim:tmpdir/func.o \
$testobjfiles $libs" "" "" "" {{ld plugin-6.d}} "main.x" ] \
[list "plugin claimfile replace symbol" "-plugin $plugin_path $regclm \
$regas $regcln -plugin-opt claim:tmpdir/func.o \
-plugin-opt sym:${_}func::0:0:0 \
$testobjfiles $libs" "" "" "" {{ld plugin-7.d}} "main.x" ] \
[list "plugin claimfile resolve symbol" "-plugin $plugin_path $regclm \
$regas $regcln -plugin-opt claim:tmpdir/func.o \
-plugin-opt sym:${_}func::0:0:0 \
-plugin-opt sym:${_}func2::0:0:0 \
-plugin-opt dumpresolutions \
$testobjfiles $libs" "" "" "" {{ld plugin-8.d}} "main.x" ] \
[list "plugin claimfile replace file" "-plugin $plugin_path $regclm \
$regas $regcln -plugin-opt claim:tmpdir/func.o \
-plugin-opt sym:${_}func::0:0:0 \
-plugin-opt sym:${_}func2::0:0:0 \
-plugin-opt dumpresolutions \
-plugin-opt add:tmpdir/func.o \
$testobjfiles $libs" "" "" "" {{ld plugin-9.d}} "main.x" ] \
]
set plugin_lib_tests [list \
[list "plugin ignore lib" "-plugin $plugin_path $regclm \
$regas $regcln -plugin-opt claim:tmpdir/func.o \
-plugin-opt sym:${_}func::0:0:0 \
-plugin-opt sym:${_}func2::0:0:0 \
-plugin-opt dumpresolutions \
-plugin-opt add:tmpdir/func.o \
$testobjfiles_notext -Ltmpdir -ltext $libs" "" "" "" {{ld plugin-10.d}} "main.x" ] \
[list "plugin claimfile replace lib" "-plugin $plugin_path $regclm \
$regas $regcln -plugin-opt claim:tmpdir/func.o \
-plugin-opt sym:${_}func::0:0:0 \
-plugin-opt sym:${_}func2::0:0:0 \
-plugin-opt dumpresolutions \
-plugin-opt add:tmpdir/func.o \
-plugin-opt claim:tmpdir/libtext.a \
-plugin-opt sym:${_}text::0:0:0 \
-plugin-opt add:tmpdir/text.o \
$testobjfiles_notext -Ltmpdir -ltext $libs" "" "" "" {{ld plugin-11.d}} "main.x" ] \
]
set plugin_extra_elf_tests [list \
[list "plugin set symbol visibility" "-plugin $plugin_path $regclm \
$regas $regcln -plugin-opt claim:tmpdir/func.o \
-plugin-opt sym:${_}func::0:0:0 \
-plugin-opt sym:${_}func1::0:1:0 \
-plugin-opt sym:${_}func2::0:2:0 \
-plugin-opt sym:${_}func3::0:3:0 \
-plugin-opt dumpresolutions \
-plugin-opt add:tmpdir/func.o \
-plugin-opt add:tmpdir/func1p.o \
-plugin-opt add:tmpdir/func2i.o \
-plugin-opt add:tmpdir/func3h.o \
$testobjfiles $libs --verbose=2" "" "" "" {{ld plugin-12.d} \
{readelf -s plugin-vis-1.d}} "main.x" ] \
]
if { !$can_compile || $failed_compile } {
foreach testitem $plugin_tests {
$failure_kind [lindex $testitem 0]
}
if { [is_elf_format] } {
foreach testitem $plugin_extra_elf_tests {
$failure_kind [lindex $testitem 0]
}
}
return
}
run_ld_link_tests $plugin_tests
if { [is_elf_format] \
&& [ld_compile "$CC $CFLAGS" $srcdir/$subdir/func1p.c tmpdir/func1p.o] \
&& [ld_compile "$CC $CFLAGS" $srcdir/$subdir/func2i.c tmpdir/func2i.o] \
&& [ld_compile "$CC $CFLAGS" $srcdir/$subdir/func3h.c tmpdir/func3h.o] } {
run_ld_link_tests $plugin_extra_elf_tests
}
if ![ar_simple_create $ar "" "tmpdir/libtext.a" "tmpdir/text.o"] {
foreach testitem $plugin_lib_tests {
unresolved [lindex $testitem 0]
}
} else {
run_ld_link_tests $plugin_lib_tests
}
|