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

p8ekf7hl  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(83)

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

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

如果我现在引入一个链接到这两个库的可执行文件,链接顺序将决定采用这两个实现中的哪一个(通常是breadth-first)。
如果libalibb是目标文件,我会得到一个关于多个定义的链接器错误。
有没有一种方法也可以对共享对象强制执行这种行为(检测多个定义并发出警告/错误)?我希望能够在链接时已经检测到重复,而不是在运行时的错误行为感到惊讶。
如果不可能,你能解释一下原因吗?

rqqzpn5f

rqqzpn5f1#

如果不可能
这是不可能的-- UNIX共享库是 * 设计 * 为这样工作的。此外,符号重新定义非常常见。如果有一个链接器警告来发出这样的重定义信号,你会得到很多故意的“假阳性”。
你能解释一下为什么吗?
UNIX共享库的工作方式与归档库的工作方式“相同”。如果你有liba.alibb.a,每个都定义了foo(),你就不会期望得到警告或错误,你实际得到的foo()的版本将取决于库的顺序。
当使用liba.solibb.so时,行为是完全相同的。

更新:

我仍然不明白为什么我不能强制链接器发出警告。
可以。您所要做的就是修改链接器以实现所需的警告,然后使用修改后的链接器。
上面的答案解释了为什么现有的UNIX链接器都没有实现这个警告(它对大多数开发人员来说是无用的,并且会产生“误报”)。

相关问题