ノード:Dlpreopening, 次:, 前:Building modules, 上:Dlopened modules



dlopen

libtoolは,dlopenするlibtoolオブジェクトとlibtoolライブラリファイルに 対し,たとえdlopendlsym関数が無いプラットフォー ムでも,そのシンボルが解決できるように,特別のサポートを提供します.

"laziness"の増加順にプログラムにコードをロードする,以下の別の方法を 考慮します.

  1. 参照するしないに関わらない,実行形式の一部となるオブジェクトファイルへ のリンクです.オブジェクトファイルが見つからない場合,リンカは実行形式 の作成を停止します.
  2. 上記のオブジェクトファイルでの未定義の参照を満足させるように,リンク時 に検索されるようにするための,リンカに対するスタティックライブラリの宣 言です.スタティックライブラリが見つからない場合,リンカは実行形式の作 成を停止します.
  3. 上記のファイルでの未定義の参照を満足させるために,実行時に検索されるよ うにするための,実行時リンクの共有ライブラリの宣言です.共有ライブラリ が見つからない場合,ダイナミックリンカは実行形式の作成を停止します.
  4. アプリケーション自身が解決することができるように,参照をダイナミックに 解決するdlopenモジュールです.モジュールを開くときエラーが発生したり, モジュールが見つからない場合,アプリケーションは壊れることなく回復しま す.

libtoolは,コンパイル時にオブジェクトファイルをプログラムにリンクし, プログラムのシンボルテーブルを表現するデータ構造を作成することで,スタ ティックなプラットフォームで-dlopenオプションをエミュレートしま す.

この特徴を使用するため,プログラムのリンク時(see Link mode)に -dlopen-dlpreopenフラグを使用することで,アプリケーショ ンでdlopenしたいオブジェクトを宣言する必要があります.

struct lt_dlsymlist { const char *name; lt_ptr address; } Structure
name属性は,"fprintf"のような,シンボル名のNULL終端されて いる文字列です.address属性は,&fprintfのような対応するオ ブジェクトへの一般的なポインタです.

const lt_dlsymlist * lt_preloaded_symbols 変数
lt_symbol構造体の配列で,プログラムにリンクされる,プリロードさ れているすべてのシンボルを表現します.それぞれの-dlpreloadedファ イルに対し,ファイルのnameを用いた要素と,0addressがあり,このファイルからエクスポートされるすべてのシンボ ルが続きます.実行形式自身に対し,特別の名前@PROGRAM@が使用されます. 最後の要素は,name0addressを持ちます.

ドル記号のような,ANSI Cでは有効ではない識別子を許可するコンパイラもあ ります.libtoolはANSI Cで有効なシンボル(最初がASCII文字またはアンダー スコアで,ゼロ個以上のASCII文字,数字,そしてアンダースコアが続くもの) のみ認識するので,非ASCIIシンボルはlt_preloaded_symbolsに出現し ません.