【发布时间】:2011-11-30 17:56:48
【问题描述】:
我的问题有点类似于this,但它是关于 TCL 扩展的。
我在 Linux (gcc) 上使用 C,并且我有一个包含三个模块 A、B 和 C 的包。模块 A 包含函数并定义(不仅是声明)全局变量。我将模块 A 编译并链接到动态库 (libA.so) 中。
现在,我希望 B 和 C 是 TCL 扩展。两者都使用来自 A 的函数和全局变量,而 C 也使用来自 B 的函数。我制作了 B 和 C 共享库(B.so 和 C.so),但没有使用“-Wl -soname”。我使 B.so 依赖于 A.so,而 C.so 没有用户依赖项。虽然这很奇怪,但机器人扩展已加载并正常工作。这是我所拥有的(A=libbiddy.so,B=bddscout.so,C=bddscoutIFIP.so):
meolic@meolic:/usr/lib/bddscout$ ldd *.so
bddscout.so:
linux-gate.so.1 => (0x00177000)
libbiddy.so.1 => /usr/lib/libbiddy.so.1 (0x00eca000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00342000)
/lib/ld-linux.so.2 (0x0061f000)
bddscoutIFIP.so:
linux-gate.so.1 => (0x00fc2000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00c75000)
meolic@meolic:/usr/lib/bddscout$ wish
% puts $tcl_patchLevel
8.5.8
% load ./bddscout.so
% load ./bddscoutIFIP.so
% info loaded
{./bddscoutIFIP.so Bddscoutifip} {./bddscout.so Bddscout} {{} Tk}
问题是,完全相同的包并非在所有地方都可以使用。在新的计算机上,扩展 C.so 无法加载。
meolic@altair:/usr/lib/bddscout$ ldd *.so
bddscout.so:
linux-gate.so.1 => (0xb76ef000)
libbiddy.so.1 => /usr/lib/libbiddy.so.1 (0xb76c9000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb754d000)
/lib/ld-linux.so.2 (0xb76f0000)
bddscoutIFIP.so:
linux-gate.so.1 => (0xb7780000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75e8000)
/lib/ld-linux.so.2 (0xb7781000)
meolic@altair:/usr/lib/bddscout$ wish
% puts $tcl_patchLevel
8.5.10
% load ./bddscout.so
% load ./bddscoutIFIP.so
couldn't load file "./bddscoutIFIP.so": ./bddscoutIFIP.so: undefined symbol: biddy_termFalse
报告的未定义符号是 A 中的全局变量之一。问题 1:我的方法是否正确,因为它适用于某些系统?问题2:为什么它在新系统上不起作用?
【问题讨论】:
-
+1:关于复杂主题的好问题。
标签: c linux linker dependencies tcl