web-dev-qa-db-ja.com

LD_PRELOADのトラックは何ですか?

私は最近 proggit でそれについての言及に出会いました、そして(今のところ)それは説明されていません。

this だと思いますが、よくわかりません。

305
Hank Gay

LD_PRELOADを共有オブジェクトのパスに設定した場合、そのファイルはbefore他のライブラリ(Cランタイム、libc.soを含む)に読み込まれます。それで、あなたの特別なmalloc()実装でlsを実行するために、これをしてください:

$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
366
JesperE

同じシンボルを持つライブラリを作成してLD_PRELOADでライブラリを指定することで、ストックライブラリのシンボルをオーバーライドできます。

標準的でない場所でライブラリを指定するためにそれを使う人もいますが、LD_LIBRARY_PATHはその目的にはより適しています。

41
Joshua

LD_PRELOADを使うと、ライブラリを優先することができます。

例えばmallocfreeを実装するライブラリを書くことができます。そしてこれらをLD_PRELOADでロードすることで、標準のものではなくあなたのmallocfreeが実行されます。

31
Ronny Brendel

多くの人が言ったように、ライブラリをプリロードするためにLD_PRELOADを使います。ところで、設定がlddコマンドで利用可能な場合は、CHECKが可能です。

例:あなた自身の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)
    ...
23
Patric

LD_PRELOADは、/etc/ld.so.preloadと同様に、標準セットをオーバーライドする関数を使用して共有ライブラリを一覧表示します。これらはローダー/lib/ld-linux.soによって実装されています。ほんの少数の選択された関数をオーバーライドしたい場合は、オーバーライドするオブジェクトファイルを作成してLD_PRELOADを設定することによってこれを行うことができます。このオブジェクトファイルの関数はそれらの関数だけを上書きして他の関数をそのままにします。

共有ライブラリの詳細については、 http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html を参照してください。

9
Rajesh

mylib.soをenvにエクスポートするのは簡単です。

$ export LD_PRELOAD=/path/mylib.so
$ ./mybin

無効にするには

$ export LD_PRELOAD=
3
JulienGenoud

これがプリロードに関する詳細なブログ投稿です。

https://blog.cryptomilk.org/2014/07/21/what-is-preloading/

2
asn

LD_PRELOADパスを使用すると、提供されたデフォルトの代わりに、提供された共有オブジェクトをアプリケーションローダーにロードさせることができます。

開発者はこれを使用して、異なるバージョンの共有オブジェクトを提供することによってアプリケーションをデバッグします。

私たちは、用意された共有オブジェクトを使って既存の関数を上書きすることによって、特定のアプリケーションをハッキングするためにそれを使いました。

1

lD_PRELOADが使用されている場合、そのファイルは他のどの$export LD_PRELOAD=/path/libライブラリよりも先にロードされます。これはプログラムでも使用できます。

0