【问题标题】:LD_PRELOAD fails on specific folderLD_PRELOAD 在特定文件夹上失败
【发布时间】:2016-11-20 21:18:39
【问题描述】:

在 Ubuntu 16.04 系统上,尝试使用 ld_preload 和自定义编译的 libpcap.so 并运行 tcpdump。

编译 libpcap (1.8.0)

./configure --prefix=`pwd`/inst
make install

那么当使用这个命令时,tcpdump 会使用自定义的 libpcap

LD_PRELOAD=/home/user/tcpdump/inst/libpcap.so.1.8.0 /usr/sbin/tcpdump --version

输出是:

tcpdump version 4.7.4
libpcap version 1.8.0
OpenSSL 1.0.2g  1 Mar 2016

但是,当我将 libpcap 移动到不同的文件夹时,例如 /usr/local/lib 它不再起作用了。

我收到以下错误:

ERROR: ld.so: object '/usr/local/lib/libpcap.so.1.8.0' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored

据我所知,这是某种权限问题。但是我对我能想到的一切都进行了chown'ed和chmod'ed。 我错过了什么?

这应该让您知道可能出了什么问题。

编辑: 该问题似乎特定于某些目录和 tcpdump 本身。 LD_PRELOAD`ing on /bin/true 时的 strace 输出

LD_PRELOAD=/usr/local/lib/libpcap.so.1.8.0 strace -fF  /bin/true 2>&1 | grep libp
open("/usr/local/lib/libpcap.so.1.8.0", O_RDONLY|O_CLOEXEC) = 3

这是 tcpdump 上的 strace 输出

LD_PRELOAD=/usr/local/lib/libpcap.so.1.8.0 strace -fF  /usr/sbin/tcpdump 2>&1 | grep libp
open("/usr/local/lib/libpcap.so.1.8.0", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
writev(2, [{"ERROR: ld.so: object '", 22}, {"/usr/local/lib/libpcap.so.1.8.0", 31}, {"' from ", 7}, {"LD_PRELOAD", 10}, {" cannot be preloaded (", 22}, {"cannot open shared object file", 30}, {"): ignored.\n", 12}], 7ERROR: ld.so: object '/usr/local/lib/libpcap.so.1.8.0' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
open("/usr/lib/x86_64-linux-gnu/libpcap.so.0.8", O_RDONLY|O_CLOEXEC) = 3

两个命令都以 sudo 运行

【问题讨论】:

  • 是错字吗? /usr/local/libpcap.so.1.8.0/usr/local/lib/libpcap.so.1.8.0?注意/lib/ 部分?
  • 是的,但是帖子中有错字。修复它

标签: linux ld-preload


【解决方案1】:

查找文件似乎确实存在问题(权限或路径不正确)。我看到您提到您已将文件移动到 /usr/local/lib,但我看到错误消息为 /usr/local/libpcap.so.1.8.0。也许是错字?

如果没有,请运行

LD_PRELOAD=/usr/local/lib/libpcap.so.1.8.0 strace -fF -e open /bin/true 2>&1 | grep libp

要确认的另一件事是 /usr/local/lib 位于链接器的标准路径中(如果您不想使用 LD_PRELOAD):

ldconfig -v 2>/dev/null | grep -v ^$'\t'

【讨论】:

  • 是的,这是一个错字,但在帖子本身:) ,无论如何,文件位于正确的位置,即。 /usr/local/lib/libpcap.so.1.8.0。使用 strace 我得到一个“拒绝访问”错误,这是由于“打开”调用打开 .so 文件的结果。该文件具有正确的所有者(即root),并且我已经使用了所有可能的权限。奇怪的是我仍然不明白为什么它可以在不同的文件夹上工作,但不在 /usr/local/lib 下。
  • 你启用了 selinux 吗?你能粘贴 strace 的输出吗?
  • selinux 未启用。为问题添加了 strace 输出。
  • tcpdump 可能会将权限放弃给其他用户。每个人都可以阅读文件吗? chmod a+r 路径
  • 是的。我已经设置了权限,没有任何变化。此外,如果使用 -Z 选项,tcpdump 只会放弃特权。
猜你喜欢
  • 2018-07-17
  • 1970-01-01
  • 2022-12-26
  • 2012-02-22
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多