什么是LD_PRELOAD技巧?

我最近在proggit上遇到了一个引用,并且(现在)没有解释。

我怀疑这可能是,但我不知道。

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

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

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

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

LD_PRELOAD你可以给库优先。

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

许多人提到,使用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使用覆盖标准集的函数列出共享库,就像/etc/ld.so.preload一样。 这些通过loader /lib/ld-linux.so来实现。 如果只想重写一些选定的函数,可以通过创build一个覆盖目标文件并设置LD_PRELOAD ; 这个对象文件中的函数将会覆盖那些让别人保持原样的函数。

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

很容易导出mylib.so到env:

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

禁用:

 $ export LD_PRELOAD= 

这是一个关于预加载的详细博客文章:

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

使用LD_PRELOADpath,可以强制应用程序加载器加载提供的共享对象,超过默认提供。

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

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