UNIXでは、次のコマンドラインを使用できます。
cc -o executable *.o -zlazyload -lsomelib
右側にリストされているライブラリは、-zlazyload
バイナリのLAZYLOAD ELFタグで表示されます。これは呼び出しによって確認でき、dump -Lv executable
結果には次のものが含まれます。
**** DYNAMIC SECTION INFORMATION ****
.dynamic:
[INDEX] Tag Value
[1] POSFLAG_1 LAZYLOAD
[2] NEEDED libsecdb.so.1
この場合、実行可能ファイルの開始時にロードされず、最初の関数が呼び出されるlibsecdb
まで遅延されます。libsecdb
このトリックは、すべての機能を使用しない場合は、実行可能ファイルのインコア表現をより小さく保つために使用できます。
Linuxで同じ結果を得る方法はありますか? GNUリンカーにフラグがあるようですが、-zlazy
私の経験ではうまくいきません。
この質問の背景は、Solarisで遅延接続を使用して現在のBourne Shell(bosh)を接続するのが簡単で、シェルスクリプトを実行するのと同じくらい小さいですが、dash
まだdash
。インタラクティブな履歴エディタの共有ライブラリは、シェルがインタラクティブモードで使用されている場合にのみリンクされます。
答え1
私は間違っているかもしれませんが、私は2つのことがあると思います。
- ロード(つまり、共有ライブラリをメモリにmmapする)と
- バインディング(つまり、シンボルの解釈)
Linuxでは-zlazy
遅延バインディングをオンにします(デフォルトなので、追加しても何も変わりません)。 Linuxでは、遅延ロードは発生しません。