共有ライブラリ・静的ライブラリ・動的リンク・静的リンク検証
cmakeのBUILD_SHARED_LIBSでもやもやしてた
ので以下記事の検証
静的ライブラリ
- greet.cをコンパイル
- greet.c,main.cのソースは上記サイトのものを流用
$ gcc -c greet.c $ ls greet.c greet.o main.c
- 静的ライブラリlibgreet.aをつくる
$ ar rusv libgreet.a greet.o ar: `u' modifier ignored since `D' is the default (see `U') ar: creating libgreet.a a - greet.o $ ls greet.o
- libgreet.aの確認
- lddでdynamic linkの有無
- アーカイブ(実行バイナリの登録)
- サイズ
$ ldd libgreet.a not a dynamic executable $ ar tv libgreet.a rw-r--r-- 0/0 1552 Jan 1 09:00 1970 greet.o $ ls -alt total 24 -rw-r--r-- 1 yabu yabu 1694 11月 21 14:46 libgreet.a -rw-r--r-- 1 yabu yabu 1552 11月 21 14:46 greet.o -rw-r--r-- 1 yabu yabu 141 11月 21 14:43 greet.c
- 静的リンクでビルド
$ gcc -o main-static main.c -L. -lgreet $ ls greet.c greet.o libgreet.a main-static main.c $ ./main-static Hello, World!
- 静的リンクでビルドしたバイナリの検証
- 動的リンクの有無
- サイズ
$ ldd main-static linux-vdso.so.1 (0x00007ffe41b90000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7e4a03e000) /lib64/ld-linux-x86-64.so.2 (0x00007f7e4a631000) $ ll -rw-r--r-- 1 yabu yabu 1552 11月 21 14:46 greet.o -rw-r--r-- 1 yabu yabu 1694 11月 21 14:46 libgreet.a -rwxr-xr-x 1 yabu yabu 8360 11月 21 14:48 main-static*
共有ライブラリ
- 共有ライブラリ
libgreet.so
のビルド
$ gcc -shared -fPIC -o libgreet.so greet.c $ ls greet.c greet.o libgreet.a libgreet.so main-static main.c
- 確認
- サイズが結構でかい(静的ライブラリの5倍程度)
$ ll -rw-r--r-- 1 yabu yabu 1552 11月 21 14:46 greet.o -rw-r--r-- 1 yabu yabu 1694 11月 21 14:46 libgreet.a -rwxr-xr-x 1 yabu yabu 7896 11月 21 14:50 libgreet.so* -rwxr-xr-x 1 yabu yabu 8360 11月 21 14:48 main-static*
dynamic link
- 共有ライブラリを利用したビルド
- 実行時は
LD_LIBRARY_PATH
で共有ライブラリのパスを指定
$ gcc -o main-shared main.c -L. -lgreet $ ls main-shared $ ./main-shared ./main-shared: error while loading shared libraries: libgreet.so: cannot open shared object file: No such file or directory $ LD_LIBRARY_PATH=. ./main-shared Hello, World!
- ビルド結果の確認
- lddでlibgreet.soがダイナミックリンクされていることがわかる
- ライブラリパスが通った場所に利用ライブラリを配置していないので共有ライブラリのパスを指定してlddを実行する必要がある(
LD_LIBRARY_PATH=.
) - サイズはstaticライブラリを使った実行バイナリとほとんと変わらない。
- ライブラリのサイズが小さすぎるからかもしれない。
$ ldd main-shared linux-vdso.so.1 (0x00007ffef34f3000) libgreet.so => not found libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1a2590a000) /lib64/ld-linux-x86-64.so.2 (0x00007f1a25efd000) $ LD_LIBRARY_PATH=. ldd main-shared linux-vdso.so.1 (0x00007ffc2f5ba000) libgreet.so => ./libgreet.so (0x00007f044b1b4000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f044adc3000) /lib64/ld-linux-x86-64.so.2 (0x00007f044b5b8000) $ ll -rw-r--r-- 1 yabu yabu 1552 11月 21 14:46 greet.o -rw-r--r-- 1 yabu yabu 1694 11月 21 14:46 libgreet.a -rwxr-xr-x 1 yabu yabu 7896 11月 21 14:50 libgreet.so* -rwxr-xr-x 1 yabu yabu 8288 11月 21 14:51 main-shared* -rwxr-xr-x 1 yabu yabu 8360 11月 21 14:48 main-static*
static link
- 共有ライブラリの静的リンク
$ gcc --static -o main-shared-static main.c -L. -lgreet $ ./main-shared-static Hello, World!
- 共有ライブラリの確認
- 実行バイナリのサイズは今回検証した3つの中で一番大きくなった
- lddでライブラリの情報が表示されなくなった
$ ll -rwxr-xr-x 1 yabu yabu 8288 11月 21 14:51 main-shared* -rwxr-xr-x 1 yabu yabu 844760 11月 21 14:54 main-shared-static* -rwxr-xr-x 1 yabu yabu 8360 11月 21 14:48 main-static* $ ldd main-shared-static not a dynamic executable
まとめ
- 共有ライブラリを静的リンクすると
- ダイナミックリンク時よりもバイナリサイズが大きくなる
- lddでライブラリが表示されなくなる
※補足:lsで出てくる関係ないファイル、コンパイル警告などは除いてある