我对使用
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()
仅在从子进程执行时失败?
什么可能导致 dlopen() 仅在从子进程执行时失败?
父进程和子进程之间只有几处可能有所不同(这会影响
dlopen
)。我想到的是:
uid
和 gid
chroot(3)
更改)。但是,我希望
/bin/sh -c <appname>
能够保持一切完好无损,所以不清楚为什么会失败。
我建议更改
appname
以在启动时打印上述所有信息,并比较运行 /bin/sh -c <appname>
和 <appname>
打印的内容 - 也许差异会变得明显。