我最近在proggit上遇到了对它的引用,(到目前为止)它没有解释。
我怀疑这可能是它,但我不确定。
可以通过创建具有相同符号的库并在LD_PRELOAD中指定库来覆盖库存库中的符号。
LD_PRELOAD
LD_LIBRARY_PATH
使用LD_PRELOAD你可以给库优先级。
例如,你可以编写一个实现malloc和free的库。通过用LD_PRELOAD加载它们,你的malloc和free将被执行,而不是标准的。
malloc
free
如果你将LD_PRELOAD设置为共享对象的路径,该文件将被加载到之前任何其他库(包括C运行时,libc.so)。因此,要使用特殊的malloc()实现运行ls,请执行以下操作:
libc.so
malloc()
ls
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
LD_PRELOAD列出了包含覆盖标准集的函数的共享库,就像/etc/ld.so.preload一样。它们是由加载器/lib/ld-linux.so实现的。如果你只想覆盖一些选定的函数,你可以通过创建一个覆盖对象文件并设置LD_PRELOAD;该对象文件中的函数将只覆盖那些函数,而其他函数则保持原样。
/etc/ld.so.preload
/lib/ld-linux.so
有关共享库的更多信息,请访问 http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html < / p >
将mylib.so导出到env:
mylib.so
$ export LD_PRELOAD=/path/mylib.so $ ./mybin
禁用:
$ unset LD_PRELOAD
下面是一篇关于预加载的详细博文:
https://blog.cryptomilk.org/2014/07/21/what-is-preloading/
使用LD_PRELOAD路径,您可以强制应用程序加载器加载所提供的共享对象,而不是默认提供的共享对象。
开发人员通过提供共享对象的不同版本来调试应用程序。
我们已经使用它来破解某些应用程序,通过使用准备好的共享对象覆盖现有函数。
正如许多人提到的,使用LD_PRELOAD预加载库。顺便说一下,如果该设置可以通过ldd命令获得,您可以检查。
ldd
示例:假设你需要预加载你自己的libselinux.so.1。
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) ...
$export LD_PRELOAD=/path/lib