什么是LD_PRELOAD技巧?

送分小仙女□ 提交于 2020-03-18 13:09:50

某厂面试归来,发现自己落伍了!>>>

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

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


#1楼

LD_PRELOAD列出了包含覆盖标准集的函数的共享库,就像/etc/ld.so.preload那样。 这些是由loader /lib/ld-linux.so实现的。 如果要仅覆盖几个选定的函数,可以通过创建重写对象文件并设置LD_PRELOAD来完成此操作; 此对象文件中的函数将仅覆盖那些将其他函数保留原样的函数。

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


#2楼

mylib.so导出到env很容易:

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

禁用:

$ export LD_PRELOAD=

#3楼

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

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


#4楼

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

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

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


#5楼

正如很多人提到的,使用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)
    ...
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!