私は最近proggitでそれへの参照に出くわしました、そして(今のところ)それは説明されていません。
これかもしれないと思いますが、よくわかりません。
共有オブジェクトのパスを設定LD_PRELOAD
すると、そのファイルは他のライブラリ (C ランタイムを含む) の前libc.so
にロードされます。したがってls
、特別なmalloc()
実装で実行するには、次のようにします。
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
ストック ライブラリのシンボルを上書きするには、同じシンボルを使用してライブラリを作成し、そのライブラリを で指定しますLD_PRELOAD
。
非標準の場所にあるライブラリを指定するために使用する人もいますがLD_LIBRARY_PATH
、その目的には適しています。
多くの人が言及したように、LD_PRELOAD
ライブラリをプリロードするために使用します。ちなみに、設定可能かどうかはコマンドldd
で確認できます。
例: 独自の をプリロードする必要があるとしますlibselinux.so.1
。
> ldd /bin/ls
...
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f3927b1d000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f3927914000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f392754f000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f3927311000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f392710c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3927d65000)
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f3926f07000)
したがって、プリロード環境を設定します。
export LD_PRELOAD=/home/patric/libselinux.so.1
ライブラリをもう一度確認してください。
>ldd /bin/ls
...
libselinux.so.1 =>
/home/patric/libselinux.so.1 (0x00007fb9245d8000)
...
LD_PRELOAD
ライブラリを優先することができます。
たとえば、 と を実装するライブラリを作成できmalloc
ますfree
。LD_PRELOAD
そして、これらをあなたのmalloc
andでロードするfree
ことにより、標準のものではなく実行されます。
LD_PRELOAD
は、標準セットをオーバーライドする関数を備えた共有ライブラリを一覧表示します/etc/ld.so.preload
。これらはローダーによって実装され/lib/ld-linux.so
ます。選択したいくつかの関数だけをオーバーライドする場合は、オーバーライドするオブジェクトファイルを作成して設定することでこれを行うことができますLD_PRELOAD
。このオブジェクトファイル内の関数は、それらの関数だけをオーバーライドし、他の関数はそのままにします。
共有ライブラリの詳細については、 http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.htmlをご覧ください。
mylib.so
envにエクスポートするには:
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
無効にするには:
$ unset LD_PRELOAD
pathを使用LD_PRELOAD
すると、提供された共有オブジェクトを、デフォルトで提供されているものよりも、アプリケーション ローダーに強制的にロードさせることができます。
開発者はこれを使用して、さまざまなバージョンの共有オブジェクトを提供することでアプリケーションをデバッグします。
準備された共有オブジェクトを使用して既存の関数をオーバーライドすることにより、特定のアプリケーションをハッキングするために使用しました。