假设我有liba.so
和libb.so
,它们都定义了一个符号foo
。为了更好地理解,让我们假设这两个库都是从一个文件编译的,foo
是一个C函数,如下所示:
int foo(void); // returns 1 for liba.so and 2 for libb.so
如果我现在引入一个链接到这两个库的可执行文件,链接顺序将决定采用这两个实现中的哪一个(通常是breadth-first)。
如果liba
和libb
是目标文件,我会得到一个关于多个定义的链接器错误。
有没有一种方法也可以对共享对象强制执行这种行为(检测多个定义并发出警告/错误)?我希望能够在链接时已经检测到重复,而不是在运行时的错误行为感到惊讶。
如果不可能,你能解释一下原因吗?
1条答案
按热度按时间rqqzpn5f1#
如果不可能
这是不可能的-- UNIX共享库是 * 设计 * 为这样工作的。此外,符号重新定义非常常见。如果有一个链接器警告来发出这样的重定义信号,你会得到很多故意的“假阳性”。
你能解释一下为什么吗?
UNIX共享库的工作方式与归档库的工作方式“相同”。如果你有
liba.a
和libb.a
,每个都定义了foo()
,你就不会期望得到警告或错误,你实际得到的foo()
的版本将取决于库的顺序。当使用
liba.so
和libb.so
时,行为是完全相同的。更新:
我仍然不明白为什么我不能强制链接器发出警告。
可以。您所要做的就是修改链接器以实现所需的警告,然后使用修改后的链接器。
上面的答案解释了为什么现有的UNIX链接器都没有实现这个警告(它对大多数开发人员来说是无用的,并且会产生“误报”)。