回答:
LD_PRELOAD
共有オブジェクトのパスを設定すると、そのファイルは他のライブラリ(Cランタイムを含む)の前にロードされますlibc.so
。ls
特別なmalloc()
実装で実行するには、次のようにします。
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
LD_PRELOAD
です。その理由は、それが環境変数であり、子プロセスによって継承されているためです。子プロセスには、親プロセスとは異なる作業ディレクトリがある可能性があります。したがって、どの相対パスでも、プリロードするライブラリを見つけることができません。
同じシンボルでライブラリを作成し、ライブラリをで指定することにより、ストックライブラリのシンボルをオーバーライドできますLD_PRELOAD
。
一部の人々は、非標準の場所にあるライブラリを指定するためにそれを使用しますがLD_LIBRARY_PATH
、その目的には適しています。
ではLD_PRELOAD
、あなたのライブラリに優先度を与えることができます。
たとえばmalloc
、およびを実装するライブラリを作成できますfree
。そしてこれらをLD_PRELOAD
あなたmalloc
と一緒にロードfree
することにより、標準のものではなく実行されます。
calloc
か?それはすべてを台無しにしませんか?
malloc
とfreeはglibcで特別に設計されており、これにより、在庫calloc
はインポートされたを呼び出すことができますmalloc
。他の関数でこれを試さないでください。それはあまりうまくいきません。
多くの人々が言及したように、LD_PRELOAD
ライブラリのプリロードに使用します。ところで、あなたはできるCHECK設定はで利用可能な場合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
と同様に、標準セットをオーバーライドする関数を持つ共有ライブラリをリストします/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
無効にする:
$ export LD_PRELOAD=
unset LD_PRELOAD
LD_PRELOAD
path を使用すると、アプリケーションローダーに、提供されたデフォルトではなく、提供された共有オブジェクトを強制的にロードさせることができます。
開発者はこれを使用して、異なるバージョンの共有オブジェクトを提供することにより、アプリケーションをデバッグします。
準備された共有オブジェクトを使用して既存の関数をオーバーライドすることにより、特定のアプリケーションをハッキングするために使用しました。