Linux 防止从静态库导入函数

Linux 防止从静态库导入函数,linux,gcc,linker,static-libraries,ld,Linux,Gcc,Linker,Static Libraries,Ld,假设我有两个不是我自己构建的静态库,我无法控制它们的内容 图书馆1具有以下功能: A() B() C() A() D() E() 图书馆2具有以下功能: A() B() C() A() D() E() 两者都需要链接到调用应用程序,但是a()的命名冲突会引发错误 在linux中使用gcc和ld是否可以说“链接时忽略库1中的a()”。我知道有几种方法: 您可以制作隐藏了相关符号的库的副本,并针对副本进行链接。您不需要访问库代码的任何源代码即可执行此操作:objcopy可以使用--local

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

图书馆1具有以下功能:

A()
B()
C()
A()
D()
E()
图书馆2具有以下功能:

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


在linux中使用gcc和ld是否可以说“链接时忽略库1中的a()”。

我知道有几种方法:

  • 您可以制作隐藏了相关符号的库的副本,并针对副本进行链接。您不需要访问库代码的任何源代码即可执行此操作:
    objcopy
    可以使用
    --localize symbol
    选项执行此操作。我在一个类似的问题中描述了如何使用
    .o
    文件执行此操作,但同样的方法也适用于
    .a

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


  • 也许值得一提的是你的工具链。通常,GNU gcc和ld?添加了它,它在gcc和ld中。