【发布时间】:2016-02-04 22:03:16
【问题描述】:
我想创建动态链接到共享对象 A 的共享对象 B。我正在使用以下命令编译共享对象 B:
g++ -fPIC -shared -L/path/to/directory -lA -o libB.so B.cpp
据我了解,-lA 告诉链接器 libB.so 应该动态链接到 /path/to/directory/libA.so。但是,当我在最终产品上执行 ldd 时,未列出依赖项(并且由于缺少这些依赖项,加载 libB.so 失败)。
ldd libB.so
linux-vdso.so.1 => (0x00007ffd4233e000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f35072fe000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f35070e7000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f3506de1000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3506a1c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3507807000)
我对 -l 应该做什么有误吗?我假设以上是来自 C++ 的最小动态依赖集。
有什么需要寻找的吗?例如,链接器在找不到文件或其他内容时是否会简单地忽略-l 请求(并且我必须调试我的路径而不是我已经拥有的)?
我是否必须在我的 C++ 代码中添加一些东西来表明依赖关系(例如“外部”函数或其他东西)?
更新:
我已确定 ld 报告的动态依赖项集确实依赖于我的 C++ 代码,似乎依赖于任何 -L 或 @ 987654332@ 我提供的标志。链接器会自动猜测我的libB.so 应该依赖哪些共享对象,但它的假设还不够。
例如,我知道我需要 B 来加载 A,因为我调用了一些最终调用 libA.so 中的代码的代码。如何将这些信息提供给链接器?
说明:
我所说的“共享对象 A”是一个复杂的东西,它可能会动态加载一些代码。我想包含足够的依赖项,以便在尝试动态加载此代码时不会因“缺少符号”而失败。这就是为什么我想在 B 中强制依赖,因为链接器可能不会静态地在依赖树中找到它们。
另外,我使用的是 g++ 4.8.4 (Ubuntu 14.04)。这是相关的,因为 g++ 从 4.6 版开始隐式应用 -Wl,--as-needed。
【问题讨论】: