当存在多个符号定义时,我可以强制执行链接器警告/错误吗?

问题描述 投票:0回答:1

假设我有

liba.so
libb.so
并且都定义了一个符号
foo
。为了更好地理解,我们假设这两个库都是从单个文件编译的,并且
foo
是一个如下所示的 C 函数:

int foo(void); // returns 1 for liba.so and 2 for libb.so

如果我现在引入一个链接到这两个库的可执行文件,则链接顺序将决定采用这两个实现中的哪一个(通常是宽度优先)。

如果

liba
libb
是目标文件,我会收到有关多个定义的链接器错误。

有没有办法对共享对象强制执行这种行为(检测多个定义并发出警告/错误)?我希望能够在链接时检测重复项,并且不会对运行时的错误行为感到惊讶。

如果不可能,你能解释一下原因吗?

c linker shared-libraries ld elf
1个回答
0
投票

如果不可能

这是不可能的——UNIX 共享库是被“设计”成以这种方式工作的。此外,符号重新定义非常常见。如果有链接器警告来表示此类重新定义,您将得到很多故意的“误报”。 你能解释一下为什么吗?

UNIX 共享库被设计为与归档库“以相同的方式”工作。如果您有

liba.a

libb.a

,每个都定义

foo()
,您不会期望出现警告或错误,并且您实际获得的
foo()
版本将取决于库顺序。
使用 
liba.so

libb.so

时,行为

完全
相同。
    
© www.soinside.com 2019 - 2024. All rights reserved.