Slide 1

Slide 1 text

静的ライブラリと 共有ライブラリの違いを 実験で確認 Dec. 28th, 2024 Satoru Takeuchi X: satoru_takeuchi 1

Slide 2

Slide 2 text

はじめに ● 静的ライブラリと共有ライブラリの違いを実験によって確認 ● 事前知識が得られる動画 ○ 📝 コード再利用のしくみ ライブラリ ● ソースコード ○ https://github.com/satoru-takeuchi/youtube-sample/tree/master/0083-library ● やること ○ ある関数を定義したコードから静的ライブラリ、共有ライブラリを作る ○ プログラムから2つのライブラリをリンクした場合の違いを確認する 2

Slide 3

Slide 3 text

登場人物 ● main-static: 静的ライブラリlibtest.aからmultiplyという関数を呼び出す ● main-dynamic: 動的ライブラリlibtest.soからmultiplyを呼び出す ● libtest.{a,so}: 2つの引数を掛けた値を返す関数multiplyを定義する 3 main()のコード main-static (実行ファイル) multiply()のコー ド multiply()のコード libtest.a 共有ライブラリ multiply()のコード libtest.so main()のコード main-dynamic (実行ファイル) libtest.soを動的リ ンクしているという 情報 静的ライブラリ 他のライブラリ のコード リンク時に必要な メタデータ

Slide 4

Slide 4 text

確認事項 1. 動的リンク状況 a. ldd main-static b. ldd main-dynamic 2. ライブラリファイルのサイズ a. ls -l libtest* 3. 実行ファイルのサイズ a. ls -l main-* 4

Slide 5

Slide 5 text

ライブラリファイルを削除するとどうなる? 1. rm libtest.a libtest.so 2. ./main-static 3. ./main-dynamic 5 main()のコード main-static (実行ファイル) multiply()のコー ド multiply()のコード libtest.a 共有ライブラリ multiply()のコード libtest.so main()のコード main-dynamic (実行ファイル) libtest.soを動的リ ンクしているという 情報 静的ライブラリ 他のライブラリ のコード リンク時に必要な メタデータ

Slide 6

Slide 6 text

ライブラリファイルを更新するとどうなる? 1. libtest.cを編集してmultiply()の定義を変更 2. ライブラリ再作成(make libtest.a libtest.so)後にプログラム実行 3. 実行ファイル再作成(make main-static, main-dynamic)後にプログラム実行 6 main()のコード main-static (実行ファイル) multiply()のコー ド multiply()の 新しいコード libtest.a 共有ライブラリ multiply()の 新しいコード libtest.so main()のコード main-dynamic (実行ファイル) libtestfoo.soを動的 リンクしているという 情報 静的ライブラリ 他のライブラリ のコード リンク時に必要な メタデータ

Slide 7

Slide 7 text

まとめ 7 静的ライブラリ 共有ライブラリ ライブラリのサイズ 小さい 大きい ライブラリをリンクした プログラムのサイズ 大きい 小さい ライブラリファイルを 削除した後にプログラムは 動作するか 動作する 動作しない ライブラリファイルを 変更した後にプログラムの 動作は変化するか しない する