mrs.suzu841.com 管理人の四方山(よもやま) tips





edit.gifCentOS5.5 shell スクリプトのワンライナーで libstdc++.so.6 を探す



 /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9′ not found (required by /opt/firefox4.0/libxul.so)


上記のメッセージは CentOS5.5 に Firefox4.0 をインストールするページを書くため検証作業をしながら編集している時、 Firefox4.0 を CentOS5.5 にインストールし終わり、いざ、起動! という時に表示されてしまったエラーメッセージです。

これを解消するために LibreOffice をダウンロードして解凍したのですが、複数の rpm パッケージが展開され、 どこに libstdc++.so.6 が含まれているのかわかりません。 このため、rpm -qlp オプションで含まれているファイルを探すことにしたのですが、 パッケージがたくさんあるので、展開したディレクトリで以下のような shell スクリプトのワンライナーを使います。



for i in `ls ` 
> do
> echo ----------------------------- $i
> rpm -qlp $i
> echo
> done | less


ワンライナーを実行すると、rpm パッケージに含まれるファイルがパッケージ名に続いて以下のように出力されます。


--------------------------------- libobasis3.3-base-3.3.2-202.i586.rpm
/opt/libreoffice
/opt/libreoffice/basis3.3
/opt/libreoffice/basis3.3/program
/opt/libreoffice/basis3.3/program/libabpli.so
/opt/libreoffice/basis3.3/program/libadabasuili.so
/opt/libreoffice/basis3.3/program/libdbpli.so
/opt/libreoffice/basis3.3/program/libdbuli.so
/opt/libreoffice/basis3.3/program/librptli.so
/opt/libreoffice/basis3.3/program/librptuili.so
/opt/libreoffice/basis3.3/program/librptxmlli.so
/opt/libreoffice/basis3.3/share
/opt/libreoffice/basis3.3/share/registry
/opt/libreoffice/basis3.3/share/registry/base.xcd

--------------------------------- libobasis3.3-binfilter-3.3.2-202.i586.rpm
/opt/libreoffice
/opt/libreoffice/basis3.3
/opt/libreoffice/basis3.3/program
/opt/libreoffice/basis3.3/program/legacy_binfilters.rdb
/opt/libreoffice/basis3.3/program/libbf_frmli.so
/opt/libreoffice/basis3.3/program/libbf_goli.so
/opt/libreoffice/basis3.3/program/libbf_migratefilterli.so
/opt/libreoffice/basis3.3/program/libbf_ofali.so
/opt/libreoffice/basis3.3/program/libbf_sbli.so
/opt/libreoffice/basis3.3/program/libbf_schli.so
/opt/libreoffice/basis3.3/program/libbf_scli.so
/opt/libreoffice/basis3.3/program/libbf_sdli.so
/opt/libreoffice/basis3.3/program/libbf_smli.so
/opt/libreoffice/basis3.3/program/libbf_soli.so
/opt/libreoffice/basis3.3/program/libbf_svtli.so
/opt/libreoffice/basis3.3/program/libbf_svxli.so


less の検索モードで libstdc++.so.6 を検索すると、ライブラリは以下のパッケージに含まれることがわかりました。
libreoffice3-ure-1.7.0-202.i586.rpm

ちなみにこのワンライナーは ls で表示される rpm パッケージごとに -qlp を行い、結果を表示するだけですので、 出力する方法を工夫しないと画面がスクロールして最後の部分しか読めません。 このため、スクリプトの出力はファイルにリダイレクトするか、この例のように less に pipe するといいかもしれません。 出力を less に pipe する場合は、less の検索モードで /libstdc としてやれば含まれているパッケージがどれかわかりますので、簡単です。



--------------------------------- libreoffice3-ure-1.7.0-202.i586.rpm
/opt/libreoffice
/opt/libreoffice/ure
/opt/libreoffice/ure/bin
/opt/libreoffice/ure/bin/javaldx
/opt/libreoffice/ure/bin/regcomp
/opt/libreoffice/ure/bin/regcomp.bin
/opt/libreoffice/ure/bin/regmerge
/opt/libreoffice/ure/bin/regview
/opt/libreoffice/ure/bin/startup.sh
/opt/libreoffice/ure/bin/uno
/opt/libreoffice/ure/bin/uno.bin
/opt/libreoffice/ure/bin/versionrc
/opt/libreoffice/ure/lib
/opt/libreoffice/ure/lib/JREProperties.class
/opt/libreoffice/ure/lib/acceptor.uno.so
/opt/libreoffice/ure/lib/bootstrap.uno.so
/opt/libreoffice/ure/lib/bridgefac.uno.so
/opt/libreoffice/ure/lib/connector.uno.so
/opt/libreoffice/ure/lib/introspection.uno.so
/opt/libreoffice/ure/lib/invocadapt.uno.so
/opt/libreoffice/ure/lib/invocation.uno.so
/opt/libreoffice/ure/lib/javaloader.uno.so
/opt/libreoffice/ure/lib/javavm.uno.so
/opt/libreoffice/ure/lib/jvmfwk3rc
/opt/libreoffice/ure/lib/libaffine_uno_uno.so
/opt/libreoffice/ure/lib/libgcc3_uno.so
/opt/libreoffice/ure/lib/libgcc_s.so.1
/opt/libreoffice/ure/lib/libjava_uno.so
/opt/libreoffice/ure/lib/libjpipe.so
/opt/libreoffice/ure/lib/libjuh.so
/opt/libreoffice/ure/lib/libjuhx.so
/opt/libreoffice/ure/lib/libjvmaccessgcc3.so.3
/opt/libreoffice/ure/lib/libjvmfwk.so.3
/opt/libreoffice/ure/lib/liblog_uno_uno.so
/opt/libreoffice/ure/lib/libreg.so.3
/opt/libreoffice/ure/lib/librmcxt.so.3
/opt/libreoffice/ure/lib/libstdc++.so.6
/opt/libreoffice/ure/lib/libstlport_gcc.so
/opt/libreoffice/ure/lib/libstore.so.3
/opt/libreoffice/ure/lib/libuno_cppu.so.3
/opt/libreoffice/ure/lib/libuno_cppuhelpergcc3.so.3
/opt/libreoffice/ure/lib/libuno_purpenvhelpergcc3.so.3
/opt/libreoffice/ure/lib/libuno_sal.so.3



必要なのは libstdc++.so.6 ですから、 libreoffice3-ure-1.7.0-202.i586.rpm を rpm2cpio コマンドで展開します。


rpm2cpio libreoffice3-ure-1.7.0-202.i586.rpm | cpio -id


展開されたディレクトリを追っていくと、/opt/libreoffice/ure/lib 以下にlibstdc++.so.6 があるのがわかりましたので、 確認のため、このライブラリを strings コマンドで調べてみます。


strings libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_FORCE_NEW

ちゃんと 3.4.9 が含まれていました。あとは このライブラリを /usr/lib/ 配下に配置してやればよさそうです。
もともと /usr/lib にはシンボリックリンクの libstdc++.so.6 が存在していますから、それと差し替えて完了です。





※ こうして無理やりインストールした Firefox4.0 。 前のバージョンの今まで使っていた Firefox3.6 のスタイルも Firefox4.0 と同じようになってしまったのでした。
もともと入っている " /usr/lib/libstdc++.so.6 " を参照としているものは他にもありますので、 これを入れ替えることでどこでどんな不具合が出てくるか保障の限りではありません。 ここでは、あくまでも検証用テストとして行なっていることをご承知おきください。