为什么gcc可以自动将符号标记为弱符号

为什么gcc可以自动将符号标记为弱符号,c,linux,gcc,weak-linking,C,Linux,Gcc,Weak Linking,我们使用gcc4.1.2构建了代码,并使用了在“sys/stat.h”系统头文件中定义的函数“lstat64”,以及我们使用的第三方库中定义的函数 当我们“nm”我们的可执行文件时,我们发现: W lstat64 我的问题是:为什么gcc将其标记为弱函数 另外,我们已经将代码移植到gcc4.4.4,我们发现新的gcc没有将函数标记为“弱”,而是将其标记为未定义 为什么会发生这种行为变化?根据: 弱 弱属性导致声明作为弱符号而不是全局符号发出这主要用于定义可在用户代码中重写的库函数,但也可用于

我们使用gcc4.1.2构建了代码,并使用了在“sys/stat.h”系统头文件中定义的函数“lstat64”,以及我们使用的第三方库中定义的函数

当我们“nm”我们的可执行文件时,我们发现:

W  lstat64
我的问题是:为什么gcc将其标记为弱函数

另外,我们已经将代码移植到gcc4.4.4,我们发现新的gcc没有将函数标记为“弱”,而是将其标记为未定义

为什么会发生这种行为变化?

根据:


弱属性导致声明作为弱符号而不是全局符号发出这主要用于定义可在用户代码中重写的库函数,但也可用于非函数声明。使用GNU汇编程序和链接器时,ELF目标和a.out目标都支持弱符号

在您的例子中,
lstat64
可能在GCC 4.1.2中被标记为弱,因为它不会与第三方库函数冲突。GCC可能希望这些外部函数具有优先权


但在以后的版本中,GCC希望自己的
lstat64
版本具有优先权

其思想是,gcc4.1.2将第三方库的“lstat64”标记为弱,但是,在运行时,应用程序使用glibc中的一个。另一方面,当我们将代码移植到gcc4.4.4时,我们发现第三方库中标记为“lstat64”的编译器未解析,并且在运行时,它尝试使用第三方库中的一个而不是glibc中的一个。因此,我试图理解这种新行为的根本原因?我不确定GCC如何将第三方功能标记为弱功能。可能,第三方图书馆的作者将他们的功能标记为弱。不,第三方图书馆没有将其标记为弱
nm
命令将
lstat64
显示为弱。你怎么知道这是为GCC函数还是第三方函数标记的?这是一个很好的问题。gcc的lstat64实际上是“stat.h”文件中定义的_lxstat64的包装器。当我在我们的应用程序上发布“nm”时,它为__lxstat64@glibcLSTAT64的参考没有更多细节,这里给出的任何答案都是猜测。我们对“第三方库”一无所知——你用新的编译器重建了它吗?从4.1版到4.4版,您是否更改了其他内容?即,它是否构建在不同的计算机上?您是否将体系结构从32位更改为64位(可能是在不支持多库的情况下编译gcc的副作用),是否更改了编译标志?