今日の一言
2009/12/06(Sun) 研究本格始動(予定) [長年日記]
_ [FC][Ubuntu][Linux][プロジェクト実習][研究関係]gccを使う上でのメモその1(staticライブラリ,nm,strip,file,dynamicライブラリ)
静的(static)ライブラリの作成
こんな感じで使う。
gcc -c my_lib.c gcc -c other_lib.c ar rcs libmy_lib.a my_lib.o other_lib.o gcc -o static_call call_lib.c -L. -lmy_lib ./static_call
nmコマンド
指定されたライブラリ内に存在するシンボルのリストを表示するコマンド。
定義されているシンボルの名前、それぞれのシンボルの値、シンボルのタイプを表示できる。
また、ライブラリ内に情報が存在するならば(-lオプションを参照)、シンボルがソースコード内のどこで (ファイル名と行番号) 定義されているかも特定できる。
目的のライブラリ関数がどのライブラリに入っているかもnmで調べられる。
例えば sin 関数を探す場合、
$ nm -o /usr/lib/*.a /usr/X11R6/lib/*.a | grep sin
とすればよい。参照のみのシンボル (実体がない) であれば
U _sin
と表示されるので、
$ nm -o /usr/lib/*.a /usr/X11R6/lib/*.a | grep sin | grep -v ' U '
とすると、参照のみのシンボルを除外できる。
stripコマンド
シンボル情報を削る事が出来、容量を減らしたい場合等に用いることができる。
こちら(http://d.hatena.ne.jp/komugi_com/20071128/11962590)から詳細を引用
シンボル情報は関数などの名前を記述してあり、hogehogeのアドレスはどこか?といった情報が読み取れる。gdbやld がこれらの情報を使用する。
strip -g デバッグ情報を削除
strip -X ローカルシンボル (たいてい"L","."ではじまる)を削除
strip -x グローバルでないシンボルを削除(-Xより削除範囲が広い)
strip -s すべてのシンボルを削除(既定値)
ライブラリ(.aや.o)は -g以外を指定するとリンクできないことがある。
実行形式が strip されているかどうか (=シンボルテーブルが付属しているかどうか) は、file コマンドで調べることができる。
fileコマンドを使うことで、ファイルの中身を表示でき、オブジェクト形式なども調べられる。
(strip されていない場合はnot strippedというメッセージが出るので、シンボルテーブルが付属していることがわかる)
共有(dynamic)ライブラリの作成
こんな感じで使う。
gcc -c -fPIC my_lib.c gcc -c -fPIC other_lib.c gcc -shared -o libmy_lib.so my_lib.o other_lib.o gcc -o dynamic_call call_lib.c -L. -lmy_lib
このままだとライブラリの場所が分からない可能性があるので、そこまでのパスを通してから実行。
$ export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
$ ./dynamic_call
*ldd (共有ライブラリへの依存関係を表示するコマンド)を使うことである程度の状態が分かる。(当然staticの方は表示されない)