【问题标题】:Merge multiple .so shared libraries合并多个 .so 共享库
【发布时间】:2010-10-29 05:52:41
【问题描述】:

假设我有 a.so 和 b.so。 我可以将 c.so 生成为单个共享库,其中包含 a 和 b 导出的所有函数,当然可以解决所有内部依赖关系(即 a.so 调用的 b.so 的所有函数,反之亦然)?

我试过了

gcc -shared -Wl,soname,c.so -o c.so a.so b.so

但它不起作用。

如果我将 a.o 和 b.o 归档在 a.a 和 b.a 中(不应该修改 a.o 和 b.o),也一样

gcc -shared -Wl,soname,c.so -o c.so a.a b.a

谢谢

【问题讨论】:

  • 最后我使用了一个带有 GROUP 的库脚本,它允许我将所有的小库显示为一个单独的库,但是一个软件可以链接到正确的“子”库。

标签: c linux unix gcc shared-libraries


【解决方案1】:

实际上这是不可能的。

从链接器的角度来看,SO 库是不包含链接所需的重定位信息的最终产品。

如果您可以访问这两个库的源文件或目标文件,则可以直接从它们编译/链接组合的 SO。

【讨论】:

  • “如果您可以访问这两个库的源文件或目标文件,则可以直接从它们编译/链接组合的 SO。” - - 我该怎么做呢 ?具体来说,在 Android 平台上。
【解决方案2】:

在所有 UNIXen 上,实际上不可能将多个共享库合并为一个,除了 AIX:链接器将 .so 视为“最终”产品。

但是将档案合并到 .so 中应该不是问题:

gcc -shared -o c.so -Wl,--whole-archive a.a b.a -Wl,--no-whole-archive

【讨论】:

  • 感谢您提供有用的标志:whole-archive!
  • 档案的顺序在这里重要吗?如果我有一堆 .a 文件,我可以使用 *.a 吗?
  • @Raj 不,顺序无关紧要——它们都将全部包含在内。如果您的 *.a 中没有任何符号重新定义,那么 *.a 将正常工作 (TM)。
  • @EmployedRussian:我已经用 g++ 尝试了上述命令,即 g++ -shared -o c.so -Wl,--whole-archive aa ba -Wl,--no-whole-存档我收到以下错误:/usr/bin/ld:无法识别的选项 '-plugin' /usr/bin/ld:使用 --help 选项获取使用信息 collect2:错误:ld 返回 1 退出状态 我需要什么更改做什么?
猜你喜欢
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
相关资源
最近更新 更多