我们使用 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并没有将函数标记为“弱”,而是将其标记为未定义?
为什么会有这种行为变化?
根据GCC 文档:
弱
弱属性导致声明作为弱符号而不是全局符号发出。这主要用于定义可以在用户代码中覆盖的库函数,尽管它也可以与非函数声明一起使用。ELF 目标支持弱符号,使用 GNU 汇编器和链接器时也支持 a.out 目标。
在您的情况下lstat64
,可能在 GCC 4.1.2 中被标记为弱,因为它不会与第三方库函数冲突。GCC 可能希望这些外部函数具有优先权。
但在以后的版本中,GCC 会希望自己的版本lstat64
具有优先权。