• 1.摘要
  • 2.基本信息
  • 3.语法
  • 4.支持平台
  • 5.实例
  • 5.1.静态实例
  • 5.2.共享实例
  • 6.应用
  • 7.相关方法

弱符号

弱符号表示在链接可执行文件和可链接格式(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:

构建命令:

输出