weak_alias函数做了什么以及它定义在何处

Pro*_*123 11 c linux compiler-construction gcc gnu

所以我正在查看gcc编译器的来源,我在fork.c中看到了这个:

int
__fork ()
{
  __set_errno (ENOSYS);
  return -1;
}
libc_hidden_def (__fork)
stub_warning (fork)

weak_alias (__fork, fork)
#include <stub-tag.h>
Run Code Online (Sandbox Code Playgroud)

我想弄清楚weak_alias的作用.我在glibc源文件中使用了grep命令来查找所有出现的#define weak_alias:

grep -r "#define weak_alias"
Run Code Online (Sandbox Code Playgroud)

我发现很多次出现的宏:

#define weak_alias(n, a)
Run Code Online (Sandbox Code Playgroud)

但宏并没有真正解释任何事情.他们只是定义了这个陈述,但没有说明它是如何被替换的.例如,一个出现在profil.c中:

/* Turn off the attempt to generate ld aliasing records. */
#undef weak_alias
#define weak_alias(a,b)
Run Code Online (Sandbox Code Playgroud)

那么有什么想法,weak_alias做什么以及它在哪里定义?

提前致谢

Sam*_*iao 15

来自https://github.com/lattera/glibc/blob/master/include/libc-symbols.h

/* Define ALIASNAME as a weak alias for NAME.
   If weak aliases are not available, 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)));
Run Code Online (Sandbox Code Playgroud)

关于弱势符号:

https://en.wikipedia.org/wiki/Weak_symbol


Ant*_*yev 14

它是一个执行以下操作的宏:

它声明了一个弱函数,如果您没有为该函数提供强符号名称,它将调用您放置的函数。例如

int _foo(){ return 1;}

//And weak alias
int __attribute__((weak, alias("_foo"))) foo();
Run Code Online (Sandbox Code Playgroud)

因此,如果您没有提供 foo 的实际实现,它将基本上使用 _foo 并返回 1。