📄 vers.exp
字号:
if [string match "" $exec_output] then { # It's OK if there are extra lines in the actual output; they # may come from version information in libc. We require that # every line in EXPECTFILE appear in the output in order. set f1 [open $tmpdir/objdump.out r] set f2 [open $expectfile r] gets $f2 l2 while { [gets $f1 l1] != -1 } { if { [string match $l2 $l1] } then { if { [gets $f2 l2] == -1 } then { close $f1 close $f2 return 1 } } } # We reached the end of the output without seeing the line we # expected. This is a test failure. close $f1 close $f2 verbose -log "Did not find \"$l2\"" set f1 [open $tmpdir/objdump.out r] while { [gets $f1 l1] != -1 } { verbose -log $l1 } verbose -log "$exec_output" return 0 } else { verbose -log "$exec_output" return 0 }}proc build_vers_lib { test source libname other mapfile verexp versymexp symexp } { global ld global srcdir global subdir global exec_output global host_triplet global tmpdir global as global objdump global CC global CFLAGS global shared global script if ![ld_compile "$CC -S $CFLAGS" $srcdir/$subdir/$source $tmpdir/$libname.s] { unresolved "$test" return } if ![ld_assemble $as $tmpdir/$libname.s $tmpdir/$libname.o ] { unresolved "$test" return } set other_lib "" if ![string match "" $other] then { foreach o $other { set other_lib "$other_lib $tmpdir/$o" } } if [string match "" $mapfile] then { set script_arg "" } else { set script_arg "$script $srcdir/$subdir/$mapfile" } if {![ld_simple_link $ld $tmpdir/$libname.so "$shared $tmpdir/$libname.o $other_lib $script_arg"]} { fail "$test" return } if {![objdump_versionstuff $objdump $tmpdir/$libname.so $srcdir/$subdir/$verexp ]} { fail "$test" return } if {![objdump_dynsymstuff $objdump $tmpdir/$libname.so $srcdir/$subdir/$versymexp ]} { fail "$test" return } if [string match "" $symexp] then { if {![objdump_emptysymstuff $objdump $tmpdir/$libname.o ]} { fail "$test" return } } else { if {![objdump_symstuff $objdump $tmpdir/$libname.o $srcdir/$subdir/$symexp ]} { fail "$test" return } } pass $test }proc test_ldfail { test flag source execname other mapfile whyfail } { global ld global srcdir global subdir global exec_output global host_triplet global tmpdir global as global objdump global CC global CFLAGS global script if [string match "" $other] then { set other_lib "" } else { set other_lib $tmpdir/$other } if ![ld_compile "$CC -S $flag $CFLAGS" $srcdir/$subdir/$source $tmpdir/$execname.s] { unresolved "$test" return } if ![ld_assemble $as $tmpdir/$execname.s $tmpdir/$execname.o ] { unresolved "$test" return } verbose -log "This link should fail because of $whyfail" if [string match "" $mapfile] then { set script_arg "" } else { set script_arg "$script $srcdir/$subdir/$mapfile" } if {![ld_link $ld $tmpdir/$execname "$tmpdir/$execname.o $other_lib $script_arg"]} { pass "$test" return } fail "$test"}proc test_asfail { test flag source execname whyfail } { global srcdir global subdir global tmpdir global as global CC global CFLAGS if ![ld_compile "$CC -S $flag $CFLAGS" $srcdir/$subdir/$source $tmpdir/$execname.s] { unresolved "$test" return } verbose -log "This assemble should fail because of $whyfail" catch "exec $as -o $tmpdir/$execname.o $tmpdir/$execname.s" exec_output set exec_output [prune_warnings $exec_output] if [string match "" $exec_output] then { fail "$test" return } verbose -log "$exec_output" pass "$test"}proc test_strip_vers_lib { test srclib libname verexp versymexp } { global strip global srcdir global subdir global exec_output global host_triplet global tmpdir global objdump verbose -log "cp $tmpdir/$srclib $tmpdir/$libname.so" exec cp $tmpdir/$srclib $tmpdir/$libname.so verbose -log "$strip $tmpdir/$libname.so" catch "exec $strip $tmpdir/$libname.so" exec_output if [string match "" $exec_output] then {# If strip went OK, then run the usual tests on the thing to make sure that# it is sane. if {![objdump_versionstuff $objdump $tmpdir/$libname.so $srcdir/$subdir/$verexp ]} { fail "$test" return } if {![objdump_dynsymstuff $objdump $tmpdir/$libname.so $srcdir/$subdir/$versymexp ]} { fail "$test" return } } else { verbose -log "$exec_output" fail "$test" return } pass $test}proc build_exec { test source execname flags solibname verexp versymexp symexp } { global ld global srcdir global subdir global exec_output global host_triplet global tmpdir global as global objdump global CC global CFLAGS set shared "--shared --no-undefined-version" set script --version-script if ![ld_compile "$CC -S $CFLAGS" $srcdir/$subdir/$source $tmpdir/$execname.s] { unresolved "$test" return } if ![ld_assemble $as $tmpdir/$execname.s $tmpdir/$execname.o ] { unresolved "$test" return } if [string match "" $solibname] then { set solibname_lib "" } else { set solibname_lib $tmpdir/$solibname } if {![ld_link $ld $tmpdir/$execname "$flags $tmpdir/$execname.o $solibname_lib"]} { fail "$test" return } if [string match "" $verexp] then {## Make sure we get nothing back.# if {![objdump_emptyverstuff $objdump $tmpdir/$execname ]} { fail "$test" return } } else { if {![objdump_versionstuff $objdump $tmpdir/$execname $srcdir/$subdir/$verexp ]} { fail "$test" return } } if [string match "" $versymexp] then { if {![objdump_emptydynsymstuff $objdump $tmpdir/$execname ]} { fail "$test" return } } else { if {![objdump_dynsymstuff $objdump $tmpdir/$execname $srcdir/$subdir/$versymexp ]} { fail "$test" return } } if [string match "" $symexp] then { if {![objdump_emptysymstuff $objdump $tmpdir/$execname.o ]} { fail "$test" return } } else { if {![objdump_symstuff $objdump $tmpdir/$execname.o $srcdir/$subdir/$symexp ]} { fail "$test" return } } pass $test}## Basic test - build a library with versioned symbols.#build_vers_lib "vers1" vers1.c vers1 "" vers1.map vers1.ver vers1.dsym vers1.sym## Test #2 - build a library, and link it against the library we built in step# 1.#build_vers_lib "vers2" vers2.c vers2 vers1.so vers2.map vers2.ver vers2.dsym ""## Test #3 - build an executable, and link it against vers1.so.#build_exec "vers3" vers3.c vers3 "" vers1.so vers3.ver vers3.dsym ""## Test #4 - Make sure a version implicitly defined in an executable# causes a version node to be created. Verify this both with and without# --export-dynamic.## This test fails on MIPS. On the MIPS we must put foo in the dynamic# symbol table, which the test does not expect.setup_xfail "mips*-*-*"build_exec "vers4" vers4.c vers4 "" "" "" "" vers4.symbuild_exec "vers4a" vers4.c vers4a "-export-dynamic" "" vers4a.ver vers4a.dsym vers4a.sym## Try multiple definitions foo@BAR and foo@@BAR and make sure the linker# complains.#test_ldfail "vers5" "" vers5.c vers5 "" "" "multiple definition of foo@VERS_1.2"### Now build a test that should reference a bunch of versioned symbols.# All of them should be correctly referenced.#build_exec "vers6" vers6.c vers6 "" vers1.so vers6.ver vers6.dsym vers6.sym## Another test to verify that something made local via 'local' is truly not# accessible.#build_vers_lib "vers7a" vers7a.c vers7a "" vers7.map vers7a.ver vers7a.dsym vers7a.symtest_ldfail "vers7" "" vers7.c vers7 vers7a.so "" "undefined reference to hide_a"## This test is designed to verify that we can pass a linker script on the# command line as if it were a normal .o file.#catch "exec cp $srcdir/$subdir/vers8.map $tmpdir/" ignore_outputbuild_vers_lib "vers8" vers1.c vers8 vers8.map "" vers8.ver vers1.dsym vers1.sym## This test tries to make sure that version references to versioned symbols# don't collide with default definitions with the same symbol.#build_exec "vers9" vers9.c vers9 "-export-dynamic" "" vers9.ver vers9.dsym vers9.sym## Try and use a non-existant version node. The linker should fail with# an error message.#test_ldfail "vers10" "-DDO_TEST10" vers1.c vers10 "" "vers1.map --shared" "invalid version"## Try and some things the assembler should complain about.#test_asfail "vers11" "-DDO_TEST11" vers1.c vers11 "no @ in symver"test_asfail "vers12" "-DDO_TEST12" vers1.c vers12 "extern version definition"## Put a shared library in an archive library, and make sure the global# archive symbol table is sane.#test_ar "ar with versioned solib" vers13.a vers1.so vers13.asym## Strip a shared library, and make sure we didn't screw something up in there.#test_strip_vers_lib "vers14" vers1.so vers14 vers1.ver vers1.dsym ## Build another test with some versioned symbols. Here we are going to # try and override something from the library, and we shouldn't get# any errors.#build_exec "vers15" vers15.c vers15 "" vers1.so vers15.ver vers15.dsym vers15.sym## Test that when we override a versioned symbol from the library this# symbol appears in the dynamic symbol table of the executable.#build_vers_lib "vers16a" vers16a.c vers16a "" vers16.map vers16a.ver vers16a.dsym ""build_exec "vers16" vers16.c vers16 "" vers16a.so "" vers16.dsym ""# Test a weak versioned symbol.build_vers_lib "vers17" vers17.c vers17 "" vers17.map vers17.ver vers17.dsym ""build_vers_lib "vers18" vers18.c vers18 vers17.so vers18.map vers18.ver vers18.dsym vers18.symbuild_exec "vers19" vers19.c vers19 "-rpath ." vers18.so vers19.ver vers19.dsym ""build_vers_lib "vers20a" vers20.c vers20a "" vers20.map vers20a.ver vers20.dsym ""exec cp $tmpdir/vers20a.so $tmpdir/vers20b.sobuild_vers_lib "vers20" vers20.c vers20 "vers20a.so vers20b.so" vers20.map vers20.ver vers20.dsym ""# Test .symver override.build_vers_lib "vers21" vers21.c vers21 "" vers21.map vers21.ver vers21.dsym vers21.sym# Test moving default definition from one DSO to another.build_vers_lib "vers22a" vers22a.c vers22a "" vers22.map vers22a.ver vers22a.dsym vers22a.symbuild_vers_lib "vers22b" vers22b.c vers22b "" vers22.map vers22b.ver vers22b.dsym ""build_vers_lib "vers22" vers22.c vers22 "vers22a.so vers22b.so" "" vers22.ver vers22.dsym ""# Test versioned definitions in different files.build_vers_lib "vers23a" vers23a.c vers23a "" vers23a.map vers23a.ver vers23a.dsym vers23a.symbuild_vers_lib "vers23b" vers23b.c vers23b "" vers23b.map vers23b.ver vers23b.dsym ""build_vers_lib "vers23c" vers23b.c vers23c "vers23a.so" vers23b.map vers23c.ver vers23b.dsym ""build_exec "vers23d" vers23.c vers23d "tmpdir/vers23a.so tmpdir/vers23c.so" "" vers23.ver vers23d.dsym ""build_exec "vers23" vers23.c vers23 "tmpdir/vers23a.so tmpdir/vers23b.o tmpdir/vers23b.so" "" vers23.ver vers23.dsym ""
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -