我试图用LD_PRELOAD来包装系统中的一些function,我首先导出环境variablesLD_PRELOAD
指向我的.so
文件,然后我运行系统,我总是得到ERROR: ld.so: object '/full/path/to/wrap.so' from LD_PRELOAD cannot be preloaded: ignored.
所以我试图理解手册页上的LD_PRELOAD:
在所有其他用户之前加载的其他用户指定的ELF共享库列表。 列表中的项目可以用空格或冒号分隔。 这可以用来select性地覆盖其他共享库中的函数。 使用描述中给出的规则search库。 对于set-user-ID / set-group-ID ELF二进制文件,忽略包含斜杠的预加载path名,并且只有在库文件上启用了set-user-ID权限位时才加载标准search目录中的库。
我不是100%的理解上面的文字,首先它说
对于set-user-ID / set-group-ID ELF二进制文件,将忽略包含斜线的预加载path名
如果我不能使用斜杠,我怎样才能设置LA_PRELOAD的完整path?
其次,它说
和标准search目录中的库仅在以下情况下加载…
什么是标准search目录?
我的最后一个问题是理解LD_PRELOAD何时会被忽略? 感谢您的帮助。
编辑:
当我将LD_PRELOAD导出到/usr/lib/
的共享库时,像这样: export LD_PRELOAD=shared-lib.so
,我摆脱了上述错误,但是我没有root权限,所以我不能把/usr/lib/
下的任何文件,对此有何build议? 我想如果我能pipe理导出LD_PRELOAD没有斜线,它应该工作,但除非共享库文件在/usr/lib/
,LD_PRELOAD需要完整的path。
您可能需要导出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
将显示一些有用的东西。
这意味着两件事情:
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'
除了malat说的外,至少还有两个原因:
noexec
标志。 要检查第一种情况,请以您尝试运行程序的用户身份登录,然后运行nm /path/to/preload/library.so
– 必须将某些符号打印到控制台。
在第二种情况下, mmap
的手册页中提到了可能的错误:
EPERM prot参数要求PROT_EXEC,但映射区域属于挂载no-exec的文件系统上的文件。
要检查这一点,您可以将/bin/ls
复制到与预加载库相同的目录中,然后尝试运行它。 如果ls -l ./ls
显示x标记,但是试图执行./ls
表示Permission denied
,那么你可能没有设置./ls
。 当然,您可以检查mount
命令的输出是否存在noexec
,但是您可能需要考虑在某些Ubuntu安装上嵌套安装伪文件系统(如〜/ Private)。