ダイナミックリンク - oraccha/omicron GitHub Wiki

IBM用語だと,late binding.

ダイナミックリンクを実現するためには,次の2種類の方式が考えられる.

  • コンパイル時にジャンプテーブルを介した間接参照を行なうための スタブルーチンをリンクし,実行時にランタイムライブラリによって アドレス情報をパッチする.
  • トラップ命令を介し,OSで処理する.

==Unixの場合== 共有ライブラリ位置独立コードである必要がある.

ダイナミックリンカ/ローダはld.so(a.outの場合),ld-linux.so(ELFの場合)などと呼ばれる.

  • ELF には interp セクションがあって,ここでダイナミックリンカ/ローダ(インタプリタ)が指定されている.インタプリタはプロセスのアドレス空間に共有ライブラリをマップし,未解決シンボルを解決する.
  • 通常の Unix ではここで ld.so を指定するわけだが,やろうと思えば実行可能ファイルごとに異なるインタプリタを指定することもできる.
    • やる価値があるかは置いておいて,ELF ファイル内に ruby スクリプトを入れておいて,interp セクションで ruby インタプリタを指定するってことも可能なんだろうか?
    • それは(すくなくともLinuxでは)できませんね。インタープリタというよりも、実際はリンケージエディタであることが仮定されていますし。リンケージエディタとして呼ばれたときはメモリにマップされたELFのイメージの特定のセクションをスクリプトとして解釈するようにrubyを改造すればできるかもしれませんが。ちなみにこういう感じのことですよね? - kazuya {{{ $ cat interp.S .section .interp .ascii "/usr/bin/ruby" .section .text .ascii "print "Ruby rulez!\n"" $ objdump -s interp

interp: file format elf32-i386

Contents of section .interp: 8048074 2f757372 2f62696e 2f727562 79 /usr/bin/ruby Contents of section .text: 8048084 7072696e 74202252 75627920 72756c65 print "Ruby rule 8048094 7a215c6e 228d7600 z!\n".v. Contents of section .data: Contents of section .sbss: }}}

  * /lib/ld-linux.soの実体は/lib/ld-x.y.z.soでx.y.zはlibcのバージョン番号。

この辺は怪しいので,間違っていたら指摘して下さい.

  • [http://www.spa.is.uec.ac.jp/~nfukuda/memo/sharedlib.html FreeBSDにおける共有ライブラリについてのメモ]

  • [http://www-6.ibm.com/jp/developerworks/linux/010622/j_l-shobj.html オブジェクト不指向の共用オブジェクト] (IBM developerWorks 2001-06-22) . 動的にロード可能なライブラリーを作成する方法

  • デスクトップのためのC++にむけて . C++ で書かれたプログラムを実行する際の ld.so のボトルネックに関する調査. どこが C++ プログラムのボトルネックになっているのか.vtable が臭いみたい.

  • [http://devrsrc1.external.hp.com/STKLI/man/11iv1.5/fastbind_1.html fastbind] is a tool that can improve the start-up time of programs that use shared libraries (incomplete executables) by storing information about needed shared library symbols in the executable file. . ( fastbind は、必要な共有ライブラリのシンボルに関する情報を実行可能ファ イルに保存することにより、共有ライブラリを使用するプログラム(不完全な 実行可能プログラム)の起動時間を改善することができるツールです。) . HP-UX


==Windowsの場合== Windowsのダイナミックリンクは明示的/暗黙的の2種類の方式が存在する. 明示的な場合は,ユーザがDLLのファイル名をプログラム中に記述することでロード&リンクを指定し,暗黙的な場合は,Unixの共有ライブラリと同様な感じで,インポートライブラリをスタティックリンクする. インポートライブラリにはコードは含まれておらず,リンカによってリロケーションテーブルが作成される.

Unixでも dlopen(3) とか使えば,明示的なダイナミックリンクが可能ですね.


==QNXの場合==

  • [http://www.qnx.com/literature/nto_sysarch/dll.html Dynamic_Linking_in_Neutrino] (Neutrino System Architecture Guide)

Tiki:Kylixに書いたとおり、 Linuxが「動的ライブラリの相互依存性を正しく認識しない」問題って奴に出くわして、 ちょっと苦笑してしまったでした(^^;


関連書籍