假设我有
liba.so
和 libb.so
并且都定义了一个符号 foo
。为了更好地理解,我们假设这两个库都是从单个文件编译的,并且 foo
是一个如下所示的 C 函数:
int foo(void); // returns 1 for liba.so and 2 for libb.so
如果我现在引入一个链接到这两个库的可执行文件,则链接顺序将决定采用这两个实现中的哪一个(通常是宽度优先)。
如果
liba
和 libb
是目标文件,我会收到有关多个定义的链接器错误。
有没有办法对共享对象强制执行这种行为(检测多个定义并发出警告/错误)?我希望能够在链接时检测重复项,并且不会对运行时的错误行为感到惊讶。
如果不可能,你能解释一下原因吗?
如果不可能
这是不可能的——UNIX 共享库是被“设计”成以这种方式工作的。此外,符号重新定义非常常见。如果有链接器警告来表示此类重新定义,您将得到很多故意的“误报”。 你能解释一下为什么吗?
UNIX 共享库被设计为与归档库“以相同的方式”工作。如果您有和
liba.a
libb.a
,每个都定义
foo()
,您不会期望出现警告或错误,并且您实际获得的 foo()
版本将取决于库顺序。使用 liba.so
和 libb.so
时,行为
完全相同。