何时忽略LD_PRELOAD

时间:2015-03-26 07:46:07

标签: c linux

我正在尝试使用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需要完整路径。

3 个答案:

答案 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看起来有点矫枉过正,但也许libssymbols会显示有用的内容。

答案 1 :(得分:3)

这意味着两件事:

  1. '/full/path/to/wrap.so'不是共享库(请与file '/full/path/to/wrap.so'联系),
  2. 或'/full/path/to/wrap.so'缺少(本身)共享库(请与ldd '/full/path/to/wrap.so'一起检查)
  3. 如果上述内容无效,请尝试使用非常低级别的工具:

    $ 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)

除了马拉特所说的,可能还有至少两个原因:

  1. 无法访问您的预加载库。如果您只能访问系统上的一个非root用户,则可能不是这种情况。
  2. 您在放置预装入库的文件系统上设置了noexec标记。
  3. 要检查第一种情况,请以尝试运行程序的用户身份登录并运行nm /path/to/preload/library.so - 您必须在控制台上打印一些符号。

    在第二种情况下,mmap的手册页说明了可能的错误:

      

    EPERM prot参数请求PROT_EXEC,但映射区域属于安装了no-exec的文件系统上的文件。

    要检查这一点,您可以将/bin/ls复制到预载库所在的目录并尝试运行它。如果ls -l ./ls显示x标志,但尝试执行./lsPermission denied,那么您可能已设置noexec。当然,您可以检查mount命令的输出是否存在noexec,但您可能需要考虑嵌套的伪文件系统,例如某些Ubuntu安装上的〜/ Private。