我正在尝试使用LD_PRELOAD来包装系统中的一些函数,我首先导出环境变量LD_PRELOAD
以指向我的.so
文件,然后我运行系统,我总是得到{ {1}}所以我试着在手册页上理解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导出到ERROR: ld.so: object '/full/path/to/wrap.so' from LD_PRELOAD cannot be preloaded: ignored.
中的共享库时,如下所示:/usr/lib/
,我摆脱了上述错误,但我没有root权限,所以我不是能够将任何文件放在export LD_PRELOAD=shared-lib.so
下,有关于此的任何建议吗?我想如果我可以设法导出LD_PRELOAD而没有任何斜杠,它应该可以工作,但除非共享库文件在/usr/lib/
中,否则LD_PRELOAD需要完整路径。
答案 0 :(得分:4)
你可能想要导出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
all
看起来有点矫枉过正,但也许libs
或symbols
会显示有用的内容。
答案 1 :(得分:3)
这意味着两件事:
file '/full/path/to/wrap.so'
联系),ldd '/full/path/to/wrap.so'
一起检查)如果上述内容无效,请尝试使用非常低级别的工具:
$ strace /path/to/your/exe/which/load/wrap.so 2>&1 | grep '/full/path/to/wrap.so'
如果您想获得一些上下文,请尝试在grep中使用-3
(或任何更大的数字):
$ strace /path/to/your/exe/which/load/wrap.so 2>&1 | grep -3 '/full/path/to/wrap.so'
答案 2 :(得分:0)
除了马拉特所说的,可能还有至少两个原因:
noexec
标记。要检查第一种情况,请以尝试运行程序的用户身份登录并运行nm /path/to/preload/library.so
- 您必须在控制台上打印一些符号。
在第二种情况下,mmap
的手册页说明了可能的错误:
EPERM prot参数请求PROT_EXEC,但映射区域属于安装了no-exec的文件系统上的文件。
要检查这一点,您可以将/bin/ls
复制到预载库所在的目录并尝试运行它。如果ls -l ./ls
显示x标志,但尝试执行./ls
说Permission denied
,那么您可能已设置noexec
。当然,您可以检查mount
命令的输出是否存在noexec
,但您可能需要考虑嵌套的伪文件系统,例如某些Ubuntu安装上的〜/ Private。