__fpscr_values 問題 †
- cvs版とdebian26版のglibcで__fpscr_valuesの扱い(グループ)が異なることが判明。
ことの発端はmemo/gentoo参照
- GLIBC_2.2グループ … SH-LinuxのFC版、silicon-linuxのebi版、debian26版のglibc
- GLIBC_PRIVATEグループ … 将来版(CVS版)のglibc
- グループなし … 素のglibc-2.3.5(gentoo版?) … __fpscr_valuesは、どうやって解決してるんだろう?
- グループが異なると何が問題か?
詳細は不明。
コマンドやライブラリを異グループ間で相互利用できないらしい。
特に_fpscr_valuesは全てのコマンドに含まれるため、
最悪ケースでは全てのコマンドやライブラリが相互利用できなくなる。
将来のglibcと互換性が保てなくなる恐れがある。
話を__fpscr_valuesに限定すれば、どうやら、ビルド済みのコマンドやライブラリは相互利用可能みたいです。
それぞれのグループをゴチャ混ぜにして再ビルドする場合にのみ問題が露呈するらしい。
私も
が妥当だと思います。 少し長いのですがどうしてこうなってしまったか書いてみます。
__fpscr_tableはSH-4の各浮動小数点モードでの細かい動作を規定する内容を含みます。
そのためその実体は(各プロセスイメージ中)ユニークであるのが正しいです。 (丸めモードとか例外に関する挙動とかを規定するので)
初期それが認識されず各ライブラリやコマンドが勝手にその実体を持っていた時期がありました。
それではまずいと実体を crt1.o に移しライブラリはそれを含まないようにしようということになりました。
当然ですがそうすると本来は古いコマンドやライブラリは全て作りなおしになります。
それが難しい場合に(一時的な)回避策として libc.so に weak な定義をおいてディストリビュートされることが多かったのです。
コマンドは crt1.o 由来の __fpscr_table を使う場合もあるのでこれは正確には __fpscr_table のユニークネスを壊してしまいます。
が、回避策なのでそこはあきらめるわけです。
そういったディストリビューションでは shared lib を作ると libc.so にある __fpscr_table を参照しています。 これが GLIBC_2.2グループです。
当然ですがGLIBC_2.2グループのライブラリと上に書いた回避策を持たない libc.so の組み合わせでは問題がでてしまいます。
GLIBC_PRIVATE で versioned されたシンボルは特殊なもので CVS 版の dl-machine.h にある __fpscr_table は ld.so にだけ含まれます。
実際観察されているように外ではつかわれません。
なぜこんなものが必要かはhttp://sourceware.org/ml/libc-hacker/2005-01/msg00016.htmlにあります。
ld.so は crt1.o をリンクしないのでこういうトリックが必要でした。
- いつも有益な情報をありがとうございます。生半可に動いちゃうと、こういう重要な情報を見落としてしまいますね。特に、今回のケースは、亜流ディストリビューションを増やしてしまう恐れがあるので、そうならないために、何処かでパッチを一元管理できると良いのですが。とりあえず、私が気付いた部分はできるだけWikiに記しておこうと思います。 -- 管理人?
- ここへ来ると各パッチに「どうしてこれが必要か」という見方での解釈がされていてすごく勉強になりますし、どういう場合に必要かもそれでわかるのでとてもありがたいです。 私も toolchain 関係でもし何か追加できる情報があれば付け加えるようにしたいと思います。 -- kkojima?
- glibc-2.3.5とglibc-cvsって随分と中身が違うのですね。glibc-2.3.5へCVSパッチを不用意に当てるとエンバグしかねないので、下記「CVS版glibc-2.3.x」に記したパッチのみを適用する方向で検討中ですが、そうした場合、何か思いつく不都合などありますでしょうか? 本パッチは、「[PATCH] SH: Re: archs need fixing」に記される複合パッチ群から__fpscr_valuesに関係する部分を正しく切り出せているでしょうか?glibc-cvsって、私はglibc-2.3.x用と思っていましたが、来るglibc-2.4(3.0?)用のCVSだったのですね。汗-- 管理人?
- あ、純粋な glibc-2.3.x base でしたら __fpscr_value に対する patch は必要ないはずです。 純粋な glibc-2.3.x には問題になった audit function の support がありませんので。 もちろん patch 自体は有害にはならないです。gentooの patch を見てみたのですがこれは 2.3.5 release と mailine CVS at 20050722 のdiff + alpha のように見えます。 ちなみに 2.3.6 はもうすぐにもreleaseされるかもしれない、という状態のようです <http://sources.redhat.com/ml/libc-alpha/2005-10/msg00023.html>。 2.3.x の最新の状態は glibc-2_3-branch というタグで cvs で取れます。 うむむ、どういう方針で行くかですね。 -- kkojima?
- glibc作成時、GLIBC_2.2パッチ無し状態では正常にビルドできなかったので、GLIBC_2.2パッチは必須だと誤解してしまいました。実はGLIBC_2.2グループ(FC版)のlibgcc_s.so.1を使用してglibcを作成したため、その様なパッチが必要になったようです。(glibcとgccは鶏と卵の関係でした。)てな背景があります。 私の中では、業に従えってことで案2が有力候補ですが、他の状況をみつつ決めたいと思います。もう少し状況が整理できたら、海老原さんにも打診してみます。-- 管理人?
案 | グループ | パッチなど | Shard lib 互換性 | 備考(etchではどうすべきか?) |
案0 | 案1,2 | 案3 |
案0 | GLIBC_2.2 | GLIBC_2.2パッチ | ◎ | ◎ | ○? | 用いない方向。案1,2環境で作成したshared libをリンク可能(グループ情報が含まれないため) |
案1 | GLIBC_PRIVATE | CVS-fpscr_valuesパッチのみ | △ | ◎ | ○? | 案1は、特に副作用は無いらしい。案2はグループ無しであるが問題ないらしい。「案1と案3は同じグループであるため、互換性が高い」というならば、積極的に案1を採用すべきだが、そういった利点がないなら案2を採用するのが無難 |
案2 | グループなし | glibc-2.3.5そのまま | △ | ◎ | ○? |
案3 | GLIBC_PRIVATE | glibc-2.3.5-branch update-20050722 audit function込み? | △? | ◎? | ◎ | 将来バージョン。下位互換性は考慮されていると推測。ただし、枯れてない可能性がある。またdebianとの相性問題も心配 |
#comment
debian26-etch版での対策メモ †
作るか作らないかは気分しだいです。(笑)
debian26版glibc-2.3.5 †
debian26版のglibcではどうなっているかというと!
- glibc-2.3.5リリース版に対する__fpscr_valuesパッチ部分
--- glibc-2.3.2-200310271512/sysdeps/unix/sysv/linux/sh/sysdep.S.orig 2002-10-11 19:51:13.000000000 +0900
+++ glibc-2.3.2-200310271512/sysdeps/unix/sysv/linux/sh/sysdep.S 2004-04-24 04:40:41.000000000 +0900
@@ -30,3 +30,13 @@
#define __syscall_error __syscall_error_1
#include <sysdeps/unix/sh/sysdep.S>
+
+ .data
+ .align 3
+ .globl ___fpscr_values
+ .type ___fpscr_values, @object
+ .size ___fpscr_values, 8
+___fpscr_values:
+ .long 0
+ .long 0x80000
+weak_alias (___fpscr_values, __fpscr_values)
--- glibc-2.3.2-200310271512/sysdeps/unix/sysv/linux/sh/Versions~ 2004-04-24 14:41:42.000000000 +0900
+++ glibc-2.3.2-200310271512/sysdeps/unix/sysv/linux/sh/Versions 2004-04-24 14:42:31.000000000 +0900
@@ -2,6 +2,7 @@
libc { ← 説明の便宜上追加
GLIBC_2.2 {
# functions used in other libraries
__xstat64; __fxstat64; __lxstat64;
+ __fpscr_values;
# a*
alphasort64;
- SH-LinuxのFC版互換である。
- __fpscr_valuesは、data セクション、サイズは8、グループはGLIBC_2.2である。
CVS版glibc-2.3.x †
- glibc-2.3.5リリース版に対する__fpscr_valuesパッチ部分
--- glibc-2.3.5/sysdeps/sh/sh4/Versions~ 1970-01-01 09:00:00.000000000 +0900
+++ glibc-2.3.5/sysdeps/sh/sh4/Versions 2005-01-12 11:58:13.000000000 +0900
@@ -0,0 +1,5 @@
+ld {
+ GLIBC_PRIVATE {
+ __fpscr_values;
+ }
+}
--- glibc-2.3.5/sysdeps/sh/dl-machine.h~ 2004-10-26 04:04:03.000000000 +0900
+++ glibc-2.3.5/sysdeps/sh/dl-machine.h 2005-10-13 22:07:08.000000000 +0900
@@ -459,6 +459,12 @@ _dl_start_user:\n\
.text\n\ ← 説明の便宜上追加
.long _rtld_local@GOT\n\
.L_dl_fini:\n\
.long _dl_fini@GOT\n\
+ .type __fpscr_values,@object\n\
+ .global __fpscr_values\n\
+__fpscr_values:\n\
+ .long 0\n\
+ .long 0x80000\n\
+ .weak __fpscr_values\n\
.previous\n\
");
- __fpscr_valuesは、text セクション、サイズ指定は無し、グループはGLIBC_PRIVATEである。
- 素朴な疑問:なぜ text セクションに__fpscr_valuesを配置するの?サイズ指定はなしでいいの?
- オブジェクトのチェック
glibcとそれを用いてビルドしたshared libの__fpscr_values を表示してみる。
landisk:/# objdump -T /lib/libc-2.3.5.so | grep fpscr
00000000 DO *UND* 00000000 GLIBC_PRIVATE __fpscr_values
landisk:/# objdump -T /lib/libgcc_s.so.1 | grep fpscr
00000000 D *UND* 00000000 __fpscr_values
- textと指定してあるのにdataセクションになっている。何故? サイズは0でいいのかな〜?
- 本来GLIBC_PRIVATEとなる部分がなぜかNULLになる。(ld{}の部分が関係しているのかも)
- __fpscr_valuesの実態がない。実態は各コマンドに存在するから、これはこれで正しいのかも。
サイズ0の理由も「実態がないから」と解釈すればツジツマが合う。
- __fpscr_values@GLIBC_2.2 を shared lib に含むパッケージ
a52dec
aalib
alsa-lib
apache
apt
arts
audiofile
bonobo
caudium
classpath
cupsys
db2
db3
directfb
e2fsprogs
evolution-data-server
expect
fltk1.1
freeglut
freetds
gcc-3.4
gimp-print
glib2.0
glibc
gnome-libs
gnome-print
gnome-vfs2
graphviz
gtk+2.0
guile-1.6
imagemagick
imlib+png2
jack-audio-connection-kit
jasper
kaffe
lcms
lesstif1-1
libbonoboui
libdv
libexif
libgd2
libggi
libglade
libgnome
libgnomeprint
libgnomeprintui
libgphoto2
libgsm
libmpeg3
libpng
libquicktime
libsdl1.2
libsndfile
libstroke
libvorbis
libwmf
libxml2
libxslt
mesa
net-snmp
ocaml
orbit
orbit2
php4
pike7.2
postgresql
qt-x11-free
recode
rpm
sane-backends
t1lib
tk8.4
w3c-libwww
wmaker
xaw3d
xawtv
xfree86
- shared lib 詳細
/lib/libc-2.3.5.so
/lib/libdb.so.3
/lib/libdb2.so.2.7.7
/lib/libext2fs.so.2.4
/lib/libgcc_s.so.1
/lib/libm-2.3.5.so
/lib/tls/libc-2.3.5.so
/lib/tls/libm-2.3.5.so
/usr/X11R6/lib/debug/libGL.so.1.2
/usr/X11R6/lib/debug/libGLU.so.1.3
/usr/X11R6/lib/debug/libXaw.so.6.1
/usr/X11R6/lib/debug/libXaw.so.7.0
/usr/X11R6/lib/debug/libXt.so.6.0
/usr/X11R6/lib/debug/libdps.so.1.0
/usr/X11R6/lib/debug/libdpstk.so.1.0
/usr/X11R6/lib/debug/libpsres.so.1.0
/usr/X11R6/lib/libGL.so.1.2
/usr/X11R6/lib/libGLU.so.1.3
/usr/X11R6/lib/libXaw.so.6.1
/usr/X11R6/lib/libXaw.so.7.0
/usr/X11R6/lib/libXaw3d.so.6.1
/usr/X11R6/lib/libXt.so.6.0
/usr/X11R6/lib/libdps.so.1.0
/usr/X11R6/lib/libdpstk.so.1.0
/usr/X11R6/lib/libpsres.so.1.0
/usr/lib/apache/1.3/libphp4.so
/usr/lib/apache/1.3/libproxy.so
/usr/lib/apache/1.3/mod_negotiation.so
/usr/lib/apache/1.3/mod_status.so
/usr/lib/apache2/modules/libphp4.so
/usr/lib/caudium/lib/7.2.580/UltraLog.so
/usr/lib/classpath/libgtkpeer.so.0.0.0
/usr/lib/classpath/libjavalang.so.0.0.0
/usr/lib/debug/libc-2.3.5.so
/usr/lib/debug/libdb2.so.2.7.7
/usr/lib/debug/libm-2.3.5.so
/usr/lib/directfb-0.9-udeb.20/systems/libdirectfb_fbdev.so
/usr/lib/directfb-0.9.20/interfaces/IDirectFBVideoProvider/libidirectfbvideoprovider_libmpeg3.so
/usr/lib/directfb-0.9.20/systems/libdirectfb_fbdev.so
/usr/lib/directfb-0.9.20/systems/libdirectfb_sdl.so
/usr/lib/gdk-imlib1/libimlib-ps.so
/usr/lib/ggi/display/xf86dga.so
/usr/lib/ggi/helper/helper_x_dga.so
/usr/lib/ggi/helper/helper_x_vidmode.so
/usr/lib/gphoto2/2.1.5/libgphoto2_canon.so
/usr/lib/gphoto2/2.1.5/libgphoto2_digita.so
/usr/lib/gphoto2/2.1.5/libgphoto2_dimera3500.so
/usr/lib/gphoto2/2.1.5/libgphoto2_jamcam.so
/usr/lib/gphoto2/2.1.5/libgphoto2_jd11.so
/usr/lib/gphoto2/2.1.5/libgphoto2_kodak_dc120.so
/usr/lib/gphoto2/2.1.5/libgphoto2_kodak_dc210.so
/usr/lib/gphoto2/2.1.5/libgphoto2_kodak_dc240.so
/usr/lib/gphoto2/2.1.5/libgphoto2_kodak_dc3200.so
/usr/lib/gphoto2/2.1.5/libgphoto2_konica.so
/usr/lib/gphoto2/2.1.5/libgphoto2_konica_qm150.so
/usr/lib/gphoto2/2.1.5/libgphoto2_mars.so
/usr/lib/gphoto2/2.1.5/libgphoto2_panasonic_coolshot.so
/usr/lib/gphoto2/2.1.5/libgphoto2_panasonic_dc1000.so
/usr/lib/gphoto2/2.1.5/libgphoto2_panasonic_dc1580.so
/usr/lib/gphoto2/2.1.5/libgphoto2_panasonic_l859.so
/usr/lib/gphoto2/2.1.5/libgphoto2_pccam600.so
/usr/lib/gphoto2/2.1.5/libgphoto2_polaroid_pdc700.so
/usr/lib/gphoto2/2.1.5/libgphoto2_ptp2.so
/usr/lib/gphoto2/2.1.5/libgphoto2_ricoh_g3.so
/usr/lib/gphoto2/2.1.5/libgphoto2_samsung.so
/usr/lib/gphoto2/2.1.5/libgphoto2_sierra.so
/usr/lib/gphoto2/2.1.5/libgphoto2_sipix_web2.so
/usr/lib/gphoto2/2.1.5/libgphoto2_smal.so
/usr/lib/gphoto2/2.1.5/libgphoto2_sx330z.so
/usr/lib/graphviz/libneatogen.so.0.0.0
/usr/lib/graphviz/libtclplan.so.0.0.0
/usr/lib/kaffe/jthreads/jre/lib/sh/libkaffegc-1.1.x-cvs.so
/usr/lib/kaffe/jthreads/jre/lib/sh/libkaffevm-1.1.x-cvs.so
/usr/lib/kaffe/jthreads/jre/lib/sh/libnative-1.1.x-cvs.so
/usr/lib/kaffe/pthreads/jre/lib/sh/libgtkpeer.so.0.0.0
/usr/lib/kaffe/pthreads/jre/lib/sh/libkaffegc-1.1.x-cvs.so
/usr/lib/kaffe/pthreads/jre/lib/sh/libkaffevm-1.1.x-cvs.so
/usr/lib/kaffe/pthreads/jre/lib/sh/libnative-1.1.x-cvs.so
/usr/lib/lib-gnu-java-awt-peer-gtk.so.5.0.0
/usr/lib/libGL.so.1.4.500
/usr/lib/libGLU.so.1.3.500
/usr/lib/libImlib.so.1.9.14
/usr/lib/libMagick.so.6.0.6
/usr/lib/libORBit-2.so.0.0.0
/usr/lib/libORBit.so.0.5.17
/usr/lib/libOSMesa.so.4.0.500
/usr/lib/libSDL-1.2.so.0.7.1
/usr/lib/libXm.so.1.0.2
/usr/lib/libXm.so.2.0.1
/usr/lib/liba52-0.7.4.so
/usr/lib/libaa.so.1.0.4
/usr/lib/libapt-pkg-libc6.3-6.so.3.3.0
/usr/lib/libartscbackend.so.0.0.0
/usr/lib/libartsflow.so.1.0.0
/usr/lib/libartsgslplayobject.so.0.0.0
/usr/lib/libartswavplayobject.so.0.0.0
/usr/lib/libasound.so.2.0.0
/usr/lib/libaudiofile.so.0.0.2
/usr/lib/libbonoboui-2.so.0.0.0
/usr/lib/libbonobox.so.2.0.1
/usr/lib/libct.so.1.0.0
/usr/lib/libcups.so.2
/usr/lib/libcupsimage.so.2
/usr/lib/libdb_tcl.so.3.0.2
/usr/lib/libdirectfb-0.9-udeb.so.20.0.0
/usr/lib/libdirectfb-0.9.so.20.0.0
/usr/lib/libdv.so.4.0.1
/usr/lib/libecal.so.6.3.0
/usr/lib/libecpg.so.4.1
/usr/lib/libexif.so.10.0.0
/usr/lib/libexpect5.42.so.1
/usr/lib/libfltk.so.1.1
/usr/lib/libfltk_forms.so.1.1
/usr/lib/libg2c.so.0.0.0
/usr/lib/libgcj.so.5.0.0
/usr/lib/libgd.so.2.0.33
/usr/lib/libgdk_pixbuf-2.0.so.0.600.2
/usr/lib/libgimpprint.so.1.1.3
/usr/lib/libglade.so.0.4.2
/usr/lib/libglut.so.3.8.0
/usr/lib/libgnome-2.so.0.800.1
/usr/lib/libgnome.so.32.4.3
/usr/lib/libgnomeprint.so.15.1.11
/usr/lib/libgnomeprint/2.8.2/modules/libgnomeprintcups.so
/usr/lib/libgnomeprintui-2-2.so.0.1.0
/usr/lib/libgnomeui.so.32.14.1
/usr/lib/libgnomevfs-2.so.0.800.4
/usr/lib/libgobject-2.0.so.0.600.3
/usr/lib/libgphoto2.so.2.0.3
/usr/lib/libgsm.so.1.0.10
/usr/lib/libgstroke.so.0.0.5
/usr/lib/libgtk-x11-2.0.so.0.600.2
/usr/lib/libgtkxmhtml.so.1.0.1
/usr/lib/libguile.so.12.3.0
/usr/lib/libjack-0.80.0.so.0.0.23
/usr/lib/libjack0.80.0-0/intime.so
/usr/lib/libjack0.80.0-0/jack_alsa.so
/usr/lib/libjack0.80.0-0/jack_dummy.so
/usr/lib/libjack0.80.0-0/jack_oss.so
/usr/lib/libjasper-1.701.so.1.0.0
/usr/lib/liblcms.so.1.0.13
/usr/lib/libmpeg3.so.1.5.4
/usr/lib/libnetsnmpmibs.so.5.1.2
/usr/lib/libpics.so.0.0.0
/usr/lib/libpng10.so.0.1.0.18
/usr/lib/libqt-mt.so.3.3.3
/usr/lib/libqt.so.3.3.3
/usr/lib/libquicktime.so.1.0.0
/usr/lib/libquicktime/lqt_audiocodec.so
/usr/lib/libquicktime/lqt_dv.so
/usr/lib/libquicktime/lqt_mjpeg.so
/usr/lib/libquicktime/lqt_opendivx.so
/usr/lib/libquicktime/lqt_png.so
/usr/lib/libquicktime/lqt_rtjpeg.so
/usr/lib/libquicktime/lqt_videocodec.so
/usr/lib/libquicktime/lqt_vorbis.so
/usr/lib/librecode.so.0.0.0
/usr/lib/librpm-4.0.4.so
/usr/lib/libsndfile.so.1.0.10
/usr/lib/libstroke.so.0.0.5
/usr/lib/libsybdb.so.3.0.0
/usr/lib/libt1.so.5.0.2
/usr/lib/libt1x.so.5.0.2
/usr/lib/libtds.so.2.0.0
/usr/lib/libtdssrv.so.1.0.0
/usr/lib/libtk8.4.so.0
/usr/lib/libvorbis.so.0.3.0
/usr/lib/libvorbisenc.so.2.0.0
/usr/lib/libvorbisfile.so.3.1.0
/usr/lib/libwmf-0.2.so.7.1.0
/usr/lib/libwmflite-0.2.so.7.0.1
/usr/lib/libwraster.so.3.1.0
/usr/lib/libxml2.so.2.6.16
/usr/lib/libxslt.so.1.1.12
/usr/lib/libzvt.so.2.3.0
/usr/lib/ocaml/3.08.3/stublibs/dllbigarray.so
/usr/lib/odbc/libtdsodbc.so
/usr/lib/php4/20020429/gd.so
/usr/lib/pike/7.2.580/lib/modules/GL.so
/usr/lib/pike/7.2.580/lib/modules/Image.so
/usr/lib/pike/7.2.580/lib/modules/_Image_JPEG.so
/usr/lib/pike/7.2.580/lib/modules/_Image_TTF.so
/usr/lib/pike/7.2.580/lib/modules/___GTK.so
/usr/lib/pike/7.2.580/lib/modules/___Math.so
/usr/lib/postgresql/lib/_int.so
/usr/lib/postgresql/lib/btree_gist.so
/usr/lib/postgresql/lib/ltree.so
/usr/lib/postgresql/lib/rtree_gist.so
/usr/lib/postgresql/lib/seg.so
/usr/lib/postgresql/lib/tsearch.so
/usr/lib/postgresql/lib/tsearch2.so
/usr/lib/qt3/plugins/imageformats/libqjpeg-non-mt.so
/usr/lib/qt3/plugins/imageformats/libqjpeg.so
/usr/lib/sane/libsane-agfafocus.so.1.0.15
/usr/lib/sane/libsane-artec.so.1.0.15
/usr/lib/sane/libsane-bh.so.1.0.15
/usr/lib/sane/libsane-canon.so.1.0.15
/usr/lib/sane/libsane-canon630u.so.1.0.15
/usr/lib/sane/libsane-dc25.so.1.0.15
/usr/lib/sane/libsane-hp5400.so.1.0.15
/usr/lib/sane/libsane-microtek.so.1.0.15
/usr/lib/sane/libsane-microtek2.so.1.0.15
/usr/lib/sane/libsane-snapscan.so.1.0.15
/usr/lib/sane/libsane-umax_pp.so.1.0.15
/usr/lib/xawtv/drv0-v4l2-old.so
/usr/lib/xawtv/drv0-v4l2.so
/usr/lib/xawtv/drv1-v4l.so
/usr/lib/xawtv/flt-disor.so
/usr/lib/xawtv/flt-gamma.so
/usr/lib/xawtv/snd-oss.so
/usr/lib/xawtv/write-qt.so
- チェックスクリプト
#!/usr/bin/perl
while (</share/www/download/debian26/binary-sh4/*/*sh4.deb>){
$file = $_;
$packag="";
$source="";
open (DPKG, "dpkg --info $file |");
while(<DPKG>){
chop;
$line=$_;
$line =~ s/^\s+//;
if($line =~ /^Package:/){
$packag = $line;
$source = $line;
}
if($line =~ /^Source:/){
$source = $line;
}
}
$_ = "$packag $source ";
($dummy1,$packag,$dummy2,$source) = /^(\S+):\s+(\S+)\s+(\S+):\s+(\S+).*$/;
close(DPKG);
system("rm -rf ./tmp");
system("mkdir ./tmp");
system("cp $file ./tmp");
system("cd ./tmp && mkdir ./tmp1 && ar x $file && tar vxfz data.tar.gz -C ./tmp1 > /dev/null");
$fname = $file;
$fname =~ s/^.*\///g;
print ("checking ... $source/$fname\n");
open (FLIST_, "find ./tmp/tmp1/ |");
while($filel = <FLIST_>){
chop($filel);
$file_type = qx{file $filel};
if($file_type =~ /shared object/){
$find = qx{objdump -T $filel | grep fpscr};
if($find){
chop($find);
print "$source:$fname:$filel -> $find\n";
}
}
}
close(FLIST);
}