?? vers.exp
字號(hào):
# objdump_versionstuff# Dump version definitions/references and make sure that it is sane.#proc objdump_versionstuff { objdump object expectfile } { global VOBJDUMP_FLAGS global version_output global diff global tmpdir if {[which $objdump] == 0} then { perror "$objdump does not exist" return 0 } if ![info exists VOBJDUMP_FLAGS] { set VOBJDUMP_FLAGS "" } verbose -log "$objdump $VOBJDUMP_FLAGS $object | sed -n /Version/,\\\$p > $tmpdir/objdump.out" catch "exec $objdump $VOBJDUMP_FLAGS $object | sed -n /Version/,\\\$p > $tmpdir/objdump.out" exec_output set exec_output [prune_warnings $exec_output] 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 "$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 } if [string match "" $other] then { set other_lib "" } else { set other_lib $tmpdir/$other } 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 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
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -