使用gcc / ld,我要使用libfoo.a,其中包含一个符号symbol_foo(这是一个函数-如果重要的话,请参阅ISR)。其他libfoo功能显然在使用该功能。我想做的是使用编译我自己的二进制文件libfoo.a,而是链接自己的版本symbol_foo。
这可能吗?当前,由于符号的多个定义,我得到ld错误。也就是说,在原始静态库中未将其声明为“软链接”或类似内容。
理想情况下,我希望那里存在类似的__attribute__((ld_override))东西,但是我猜那里不存在。有任何想法吗?
这取决于库的设计。对于您而言,答案是“否”,因为该函数未在库中隔离。有关库构建的一个很好的论述,请参阅PJ Plauger 1992年的Standard C Library。是的,它相当老,因此Standard C的版本为C90,但它所支持的思想仍然有效。
链接器在构建程序时,将处理一系列目标文件和库,查找不满意的引用(符号名)并跟踪定义。在大多数情况下,它main以未定义符号开头。
现在,如果目标文件symbol_foo仅包含define symbol_foo,则如果您symbol_foo在读取库之前就已链接了该文件,则链接器将忽略symbol_foo库中的;否则,链接器将忽略该库。它已经有一个定义,不需要另一个。然而,很可能包含对象文件symbol_foo在libfoo.a库中还定义了一些其他的符号,和由连接器需要这些其它符号,所以它有链接包含对象文件symbol_foo,并且抱怨因为该符号被双重定义的,即使尽管同一文件中的其他文件却没有。
Plauger提倡(静态)库中的每个目标文件应定义一个外部符号。这样可以最大程度地替代库中的功能。我相信可以公平地假设的设计师libfoo.a没有做出决定,至少是wrt symbol_foo。
您可以从libfoo.a(使用临时目录)提取目标文件,并使用来检查其内容nm;您也许可以直接在库本身上执行此操作。与正确的选项一起使用,它将向您显示哪些文件定义和引用了哪些其他符号。
请注意,与共享库链接的规则有些不同。还有“弱”符号会改变行为。您通常还可以从多个目标文件中创建“可重定位”或“可重新链接”的目标文件(ld -r通常);这样可以为您提供一个更大的目标文件并更改方程式。最后,现在,链接描述文件可以控制哪些符号在库外部可见。因此,这不过是整个主题的一个掩饰。