libtool:dlopen() 失败,但仅当作为子进程运行时

问题描述 投票:0回答:1

我对使用

libtool
在运行时加载插件的应用程序有一个奇怪的问题。当直接从 shell 运行时,它可以正确运行。但是,当作为任何类型的子进程运行时(例如 Python
subprocess
/bin/sh -c <appname>
),它无法加载插件并显示错误消息
lt_dlopen(<plugin.so>) returned NULL, lt_dlerror() = file not found

这些文件确实存在,并且它们是通过绝对路径引用的,所以我不认为这是 RPATH 类型的问题。我在调试器中进行了跟踪,无论出现什么问题,都会在点击汇编后发生(在

dlopen()
内)。这也是在 Mac 上,所以我无法访问像
LD_DEBUG
这样的东西。主应用程序和插件的构建过程是一大堆我不能声称理解的自动工具。

所以我不确定如何调试这个。专注于(至少对我来说)最不寻常的因素,我的问题是:什么可能导致

dlopen()
仅在从子进程执行时失败?

macos shared-libraries dlopen libtool
1个回答
0
投票

什么可能导致 dlopen() 仅在从子进程执行时失败?

父进程和子进程之间只有几处可能有所不同(这会影响

dlopen
)。我想到的是:

  • 环境变量
  • 当前工作目录
  • uid
    gid
  • 当前根(可以通过
    chroot(3)
    更改)。

但是,我希望

/bin/sh -c <appname>
能够保持一切完好无损,所以不清楚为什么会失败。

我建议更改

appname
以在启动时打印上述所有信息,并比较运行
/bin/sh -c <appname>
<appname>
打印的内容 - 也许差异会变得明显。

© www.soinside.com 2019 - 2024. All rights reserved.