防止从静态库导入函数

时间:2012-01-26 19:55:21

标签: linux gcc linker static-libraries ld

假设我有两个不是由我构建的静态库,我无法控制它们的内容。

图书馆1有功能:

A()
B()
C()

图书馆2有功能:

A()
D()
E()

两者都需要链接到调用应用程序,但A()的命名冲突会引发错误。

当使用gcc和ld在linux中链接时,有没有办法说“忽略库1中的A()”。

1 个答案:

答案 0 :(得分:7)

我知道有几种方法:

  1. 您可以制作隐藏相关符号的库的副本,并链接到副本。您不需要访问库代码的任何源代码来执行此操作:objcopy可以使用--localize-symbol选项执行此操作。我在this answer中使用.o文件描述了如何对类似的问题执行此操作,但同样的方法与.a库的工作方式相同。

  2. 可以使用--allow-multiple-definition option。 (如果您通过gcc命令而不是直接与ld进行链接,则需要将选项指定为-Wl,--allow-multiple-definition。)这将导致链接器停止关心多重定义,只需使用它遇到的第一个 - 所以你必须要小心库在命令行中出现的顺序。它的缺点是它是一个全局选项,所以如果你有其他意想不到的符号冲突,它可能会做错事而不是告诉你它。