C/C++

Linux C ライブラリについて

投稿日:2018年6月6日 更新日:

実行時のライブラリ探索

 

ライブラリについて

静的ライブラリ,共有ライブラリ,動的リンク,静的リンク
静的ライブラリとは
  • 静的ライブラリ (static library) は ar コマンドで .o をまとめて作った .a ファイル.
  • libhoge.a が有る時,gcc に -lhoge オプションを与えるとリンクされる.
  • データが全て含まれるので .a ファイルはコンパイル時のみ必要
  • .a ファイルの中身は .o ファイルの連結のようなものであり,連結時に与えた順番通りに読み込まれる
共有ライブラリとは
  • 共有ライブラリ (shared library) は gcc に -shared オプションを与えて得られる .so ファイル.
  • libhoge.so が有る時,gcc に -lhoge オプションを与えるとリンクされる.
共有ライブラリの動的リンクとは
  • 共有ライブラリは通常は動的リンクされる.
  • .so ファイルの内容は実行ファイルに含まれず,.so ファイルが必要であるということが記録される.
  • 実行時に,動的リンカローダがメモリマップを弄って同じプロセスから使えるようにする.
  • ldd コマンドで動的リンクされ依存している .so ファイルが見れる.
共有ライブラリの静的リンクとは
  • 共有ライブラリも静的リンクできる.gcc に -static オプションを与えると共有ライブラリが静的リンクされる.この場合,.so フィアルに依存しない.
  • 他にも 例えば -static-libstdc++ と与えると libstdc++.so への依存が消える.
  • 吐かれるバイナリは大きくなる.
動的リンクの利点
  • ファイルサイズが小さくなる.
  • 複数のプロセスから共有することにより使用メモリも少なくなる (Position Independent Code (PIC)).
  • ABI を壊さなければ,共有ライブラリを入れ替えるだけで処理を変えられる.
静的リンクの利点
  • .so ファイルが設置されていない環境でも動く.
Position Independent Code (PIC) とは
  • 実行時の再配置が不要なオブジェクトファイル.
  • gcc に -fPIC オプションを与えると生成される.
  • PIC でない共有ライブラリを作ることも可能だが,再配置のぶんプログラムの起動が遅くなる上,書き換えによってメモリ上の共有が行われなくなる.
  • しかし,PIC でない共有ライブラリの方が読み込み後の実行速度は早い(と思う).

 

 

参考にさせて頂いたページ

静的ライブラリ,共有ライブラリ,動的リンク,静的リンク

 

 

 

 

スポンサーリンク

スポンサーリンク

-C/C++

執筆者:

関連記事

C++のクラス

メンバ変数   メンバ変数がクラスの場合の初期化 クラスのメンバ変数が引数付きのコンストラクタの場合、メンバイニシャライザを使ってコンストラクタを呼び出す。 クラスのメンバ変数の引数付きのコ ...

C++の参照

参照変数 参照の宣言 : 「 参照先の型&  参照変数名 = 参照先の変数; 」 参照変数は宣言と同時に代入する必要がある。初期化で必ず参照先の変数を指定する必要がある。参照とは「他の変数を指 ...

C++のvector

vector push_backで登録する変数はヒープ領域に確保される。vector変数の解放で、登録された変数もヒープ領域から解放される。 vectorは、デストラクタが呼び出されると、メモリの解放 ...

C++言語

  C++言語 概要 C++入門 C++で開発 C++で作成したDLLを他の言語で利用できるようにする | 二流プログラマの三流な日常 非情報系学生のための C/C++ 入門 C/C++のG ...

ポインタ

  ポインタ int* a 変数 a の中身はアドレスを示す。 ポインタ変数 *a はアドレス(aの値)のメモリの値をポインタ変数(*a)として扱う事ができる。 *a=1; はaの値(アドレ ...