Skip to content

Weak Symbol

在C语言的库函数中,有时候会看到weak_alias函数,那么这是用来干什么的呢?先看其定义:

  • include/libc-symbols.h
/* Define ALIASNAME as a weak alias for NAME.
   If weak aliases are not availbale, this defines a strong alias. */
#  define weak_alias(name, aliasname) _weak_alias (name, aliasname)
#  define _weak_alias(name, aliasname) \
  extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));

weakalias别名 , 加一起就是 弱别名, 与之对应的有 强别名,强别名就是函数名本身,而弱别名相当于某个函数的别名。

举例说明,在库函数system() 对应的文件 libc/stdlib.c/system.c 中,其最后几行为:

#ifdef IS_IN_libc
weak_alias(__libc_system,system)
#endif

这里定义了__libc_system的一个别名system, 那这个别名的意义何在呢?通常我们在写C代码时,如果要调用system函数,会先包含头文件stdlib.h, 然后直接调用system, 这时候编译器在库函数找不到以system命名的函数,但是找到这个弱别名的声明,知道了system函数对应的原函数是__libc_system, 那么最终就会调用__libc_system 函数。

简言之,就是一种简单的符号映射,把用户调用的函数名映射到库函数中实际实现功能的函数名。

reference