什么是LD_PRELOAD技巧?

时间:2009-01-08 22:14:11

标签: c linux environment-variables

我最近在proggit上看到了它的引用,并且(截至目前)没有解释。

我怀疑this可能是它,但我不确定。

9 个答案:

答案 0 :(得分:360)

如果将LD_PRELOAD设置为共享对象的路径,则该文件将在 之前加载任何其他库(包括C运行时,libc.so)。因此,要使用特殊ls实施方式运行malloc(),请执行以下操作:

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

答案 1 :(得分:41)

您可以通过创建具有相同符号的库并在LD_PRELOAD中指定库来覆盖库存库中的符号。

有些人使用它来指定非标准位置的库,但LD_LIBRARY_PATH更适合此目的。

答案 2 :(得分:31)

使用LD_PRELOAD,您可以为库提供优先权。

例如,您可以编写一个实现mallocfree的库。通过使用LD_PRELOAD加载malloc,您的free和{{1}}将被执行而不是标准的。

答案 3 :(得分:23)

正如很多人提到的那样,使用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)
    ...

答案 4 :(得分:9)

LD_PRELOAD列出了包含覆盖标准集的函数的共享库,就像/etc/ld.so.preload一样。这些是由加载器/lib/ld-linux.so实现的。如果要覆盖几个选定的函数,可以通过创建覆盖目标文件并设置LD_PRELOAD来完成此操作;此对象文件中的函数将仅覆盖那些将其他函数保留原样的函数。

有关共享库的更多信息,请访问  http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

答案 5 :(得分:3)

mylib.so导出到env:

很容易
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin

禁用:

$ export LD_PRELOAD=

答案 6 :(得分:2)

这是一篇关于预加载的详细博文:

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

答案 7 :(得分:1)

使用LD_PRELOAD路径,您可以强制应用程序加载程序通过默认提供的方式加载提供的共享对象。

开发人员通过提供不同版本的共享对象来使用它来调试他们的应用程序。

我们使用它来破解某些应用程序,通过使用准备好的共享对象覆盖现有函数。

答案 8 :(得分:0)

使用LD_PRELOAD时,将先加载该文件 $export LD_PRELOAD=/path/lib lib会被预加载,即使它也可以在程序中使用