我试图使用LD_PRELOAD在系统中包装一些函数,我首先导出环境变量LD_PRELOAD以指向我的.so文件,然后运行系统,我总是得到,ERROR: ld.so: object '/full/path/to/wrap.so' from LD_PRELOAD cannot be preloaded: ignored.所以我尝试在手册页上了解LD_PRELOAD:
首先要加载的其他用户指定的ELF共享库的列表。列表中的项目可以用空格或冒号分隔。这可用于有选择地覆盖其他共享库中的函数。使用DESCRIPTION下给出的规则搜索库。对于set-user-ID / set-group-ID ELF二进制文件,仅当在库文件中启用了set-user-ID许可权位时,才会忽略包含斜杠的预加载路径名,并且仅加载标准搜索目录中的库。
首先,我不是100%理解上述文字
对于set-user-ID / set-group-ID ELF二进制文件,包含斜杠的预加载路径名将被忽略
如果我不能使用斜杠,如何设置LA_PRELOAD的完整路径?
其次,它说
并且仅在以下情况下加载标准搜索目录中的库:
什么是标准搜索目录?
我的最后一个问题是了解何时会忽略LD_PRELOAD?谢谢您的帮助。
编辑:
当我将LD_PRELOAD导出到共享库中时,/usr/lib/像这样:export LD_PRELOAD=shared-lib.so,我摆脱了上面的错误,但是我没有root特权,所以我不能在下面放置任何文件/usr/lib/,对此有什么建议吗?我认为,如果我可以设法导出LD_PRELOAD而没有任何斜杠,那应该可以,但是除非共享库文件位于中/usr/lib/,否则LD_PRELOAD需要完整路径。
您可能希望导出LD_DEBUG=files,以便对所发生的事情有一些了解,尽管输出将非常冗长,并且可能需要一段时间才能找到相关的行。
编辑:由于那没有帮助,您可能想要尝试其他LD_DEBUG选择:
libs display library search paths
reloc display relocation processing
files display progress for input file
symbols display symbol table processing
bindings display information about symbol binding
versions display version dependencies
all all previous options combined
statistics display relocation statistics
unused determined unused DSOs
help display this help message and exit
Run Code Online (Sandbox Code Playgroud)
all看起来像是一种矫kill过正,但也许libs或symbols会显示出一些有用的东西。