誰にも見えないブログ

雑なメモ。まとまってない文章等

共有ライブラリ・静的ライブラリ・動的リンク・静的リンク検証

cmakeのBUILD_SHARED_LIBSでもやもやしてた

cmake.org

ので以下記事の検証

blog.amedama.jp

静的ライブラリ

  • 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
$ 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*
  • 共有ライブラリを利用したビルド
  • 実行時は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*
  • 共有ライブラリの静的リンク
$ 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で出てくる関係ないファイル、コンパイル警告などは除いてある