【发布时间】:2015-03-26 07:46:06
【问题描述】:
我正在尝试使用 LD_PRELOAD 在系统中包装一些函数,我首先导出环境变量LD_PRELOAD 指向我的.so 文件,然后我运行系统,我总是得到ERROR: ld.so: object '/full/path/to/wrap.so' from LD_PRELOAD cannot be preloaded: ignored. 所以我试图了解手册页上的 LD_PRELOAD:
附加的、用户指定的 ELF 共享库列表,在所有其他共享库之前加载。列表中的项目可以用空格或冒号分隔。这可用于选择性地覆盖其他共享库中的函数。使用描述下给出的规则搜索库。对于 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_PRELOAD遵循标准库搜索路径。即您可以指定相对路径,例如/usr/lib,但不是绝对路径。不过,这只适用于 setuid/setgid 二进制文件。请注意,此行为高度依赖于系统,后者仅适用于 Linux。在其他系统上,LD_PRELOAD未设置为 setuid/setgid。 -
您是否正在运行具有 set-user-ID 或 set-group-ID 标志的程序?
-
@immibis 这也是另一个问题,如何识别二进制文件是否为
set-user-ID? -
@user4016367 令人惊讶的是,有人刚刚在unix.stackexchange.com/questions/192588/… 上发布了这个消息(是你吗?)
-
此外,大多数二进制文件不是 set-user-ID,这意味着您可以使用斜杠。