我最近在proggit上看到了它的引用,(到目前为止)它没有解释。
我怀疑可能就是这个原因,但我也不确定。
我最近在proggit上看到了它的引用,(到目前为止)它没有解释。
我怀疑可能就是这个原因,但我也不确定。
当前回答
如果将LD_PRELOAD设置为共享对象的路径,则该文件将在任何其他库(包括C运行时libc.so)之前加载。所以要用你特殊的malloc()实现运行ls,这样做:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
其他回答
使用LD_PRELOAD,可以给库优先级。
例如,你可以编写一个实现malloc和free的库。通过LD_PRELOAD加载这些,你的malloc和free将被执行,而不是标准的。
如果将LD_PRELOAD设置为共享对象的路径,则该文件将在任何其他库(包括C运行时libc.so)之前加载。所以要用你特殊的malloc()实现运行ls,这样做:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
当使用LD_PRELOAD时,该文件将先于其他文件加载。使用 $export LD_PRELOAD=/path/lib用于预加载lib。这甚至也可以用在程序中。
LD_PRELOAD列出了包含覆盖标准集的函数的共享库,就像/etc/ld.so.一样预加载。它们是由加载器/lib/ld-linux.so实现的。如果你想覆盖一些选定的函数,你可以通过创建一个覆盖对象文件并设置LD_PRELOAD;该对象文件中的函数将只覆盖那些函数,而其他函数则保持原样。
有关共享库的更多信息,请访问 http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
正如许多人提到的,使用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)
...