395

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

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

4

9 回答 9

473

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

$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
于 2009-01-08T22:20:50.060 回答
58

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

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

于 2009-01-08T22:18:26.027 回答
44

正如许多人提到的,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)
    ...
于 2015-12-09T06:20:54.120 回答
43

有了LD_PRELOAD你,你可以给图书馆优先权。

例如,您可以编写一个实现mallocfree. LD_PRELOAD并且通过将这些与您一起加载malloc并且free将被执行而不是标准的。

于 2009-01-08T22:19:38.410 回答
11

LD_PRELOAD列出具有覆盖标准集的函数的共享库,就像这样/etc/ld.so.preload做一样。这些是由 loader 实现的/lib/ld-linux.so。如果您只想覆盖几个选定的函数,您可以通过创建一个覆盖目标文件并设置来做到这一点LD_PRELOAD;此目标文件中的函数将仅覆盖那些函数,而其他函数则保持原样。

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

于 2012-07-24T09:41:45.377 回答
5

要导出mylib.so到 env:

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

要禁用它:

$ unset LD_PRELOAD
于 2014-02-04T10:03:22.323 回答
3

这是有关预加载的详细博客文章:

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

于 2014-08-11T10:11:33.740 回答
2

使用LD_PRELOAD路径,您可以强制应用程序加载器加载提供的共享对象,而不是提供的默认值。

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

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

于 2015-05-31T03:16:17.157 回答
2

当使用 LD_PRELOAD 时,该文件将在任何其他文件之前加载。用于 $export LD_PRELOAD=/path/lib预加载 lib。这甚至可以在程序中使用。

于 2019-01-30T16:29:39.960 回答