弱符号
弱符号表示在链接可执行文件和可链接格式(ELF)对象文件期间特别注释的符号。默认情况下,没有任何注释,目标文件中的符号很强。 在链接期间,强符号可以覆盖同名的弱符号。相反,共享名称的两个强符号在链接时产生链接错误。 链接二进制可执行文件时,弱声明的符号不需要定义。相比之下,(默认情况下)没有定义的声明的强符号会触发未定义的符号链接错误。
C或C ++语言标准没有提到弱符号;因此,将它们插入代码并不是非常便携。 即使两个平台支持用于将符号标记为弱的相同或类似语法,语义也可能在细微点上不同,例如, 动态链接期间弱符号是否会失去语义。
基本信息
- 中文名
弱符号
- 外文名
Weak symbol
语法
GNU编译器集合和Solaris Studio C编译器共享相同的语法,用于将符号注释为弱,即特殊的#pragma,#pragma weak,以及函数和变量属性__attribute __((weak))。
支持平台
nm命令标识目标文件,库和可执行文件中的弱符号。 在Linux上,如果弱默认定义可用,则弱函数符号标记为“W”,如果不可用,则标记为“w”。 弱定义的变量符号标有“V”和“v”。 在Solaris上,“nm”为弱符号打印“WEAK”而不是“GLOB”。
实例
静态实例
main.c:
power_slow.h:
power_slow.c:
power.c:
Build commands:
输出
删除weak属性并重新执行build命令时,最后一个失败并显示以下错误消息(在Linux上):
倒数第二个仍然成功,而./slow具有相同的输出。
共享实例
从前面的例子中取main.c并添加:
用以下内容替换power_slow.c:
构建命令:
输出