Linuxで遅延動的接続を使用できますか?

Linuxで遅延動的接続を使用できますか?

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つのことがあると思います。

  1. ロード(つまり、共有ライブラリをメモリにmmapする)と
  2. バインディング(つまり、シンボルの解釈)

Linuxでは-zlazy遅延バインディングをオンにします(デフォルトなので、追加しても何も変わりません)。 Linuxでは、遅延ロードは発生しません。

関連情報