【发布时间】:2011-02-28 19:30:25
【问题描述】:
两个共享库 liba.so 和 libb.so。 liba.so 使用 libb.so。所有 c 文件都使用 -fPIC 编译。链接使用-shared。当我们在 liba.so 上调用 dlopen 时,它无法在 libb.so 中找到符号……我们得到“未定义符号”错误。我们可以 dlopen libb.so 没有错误。我们知道 liba 正在查找 libb,因为我们没有收到文件未找到错误。删除 libb.so 时出现文件未找到错误。我们尝试了 -lutil,但没有成功。
有什么想法吗????
哦,是的。 gcc 4.1.2
更新:我们在链接 liba 时使用 rpath,以便它可以找到 libb。
ldd liba.so 返回:
linux-gate.so.1 => (0xffffe000)
libb.so => ./libb.so (0xf6ef9000) <-------- LIBB
libutil.so.1 => /lib/libutil.so.1 (0xf6ef5000)
libdl.so.2 => /lib/libdl.so.2 (0xf6ef1000)
libm.so.6 => /lib/libm.so.6 (0xf6ec9000)
libpthread.so.0 => /lib/libpthread.so.0 (0xf6eb1000)
librt.so.1 => /lib/librt.so.1 (0xf6ea8000)
libc.so.6 => /lib/libc.so.6 (0xf6d62000)
/lib/ld-linux.so.2 (0x007d0000)
libb末尾没有.#是不是很重要???
【问题讨论】:
-
您是说:您创建了两个库(-fPIC -shared),liba.so 和 libb.so。 liba.so 与 libb.so 动态链接(或者应该...)并使用它。在程序 X 中,您在 libb.so 上尝试 dlopen,一切正常;另一个测试程序 Y 尝试 dlopen liba.so 但它失败了,但是您知道 liba.so 正确找到 libb.so,因为您尝试删除 libb.so 并引发了另一个问题...您用于 dlopen 的选项?
-
你没问题。现在我们没有使用任何选项,因为 dlopen 是从我们无法控制的某个程序中调用的。
-
命令
ldd liba.so说什么? -
ldd 说 libb.so => ./libb.so (0xf6ef9000) 等等。所有其他行在 so 名称之后都有一个额外的 .#,例如“libutil.so.1 => /lib/libutil.so.1 (0xf6ef5000)”。 libb.so之后没有.#是不是很重要???
-
在这种情况下,您应该检查符号的定义 - 是否已定义或刚刚声明