我最近在proggit上看到了它的引用,(到目前为止)它没有解释。

我怀疑可能就是这个原因,但我也不确定。


当前回答

导出mylib。env:

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

禁用:

$ unset LD_PRELOAD

其他回答

可以通过创建具有相同符号的库并在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时,该文件将先于其他文件加载。使用 $export LD_PRELOAD=/path/lib用于预加载lib。这甚至也可以用在程序中。

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

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

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

使用LD_PRELOAD,可以给库优先级。

例如,你可以编写一个实现malloc和free的库。通过LD_PRELOAD加载这些,你的malloc和free将被执行,而不是标准的。