Search code examples
clinuxgcccompiler-constructiongnu

what does the weak_alias function do and where is it defined


So I'm looking through the source of gcc compiler and I've come along this in fork.c:

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

weak_alias (__fork, fork)
#include <stub-tag.h>

I'm trying to figure out what weak_alias does. I've used the grep command inside the glibc source files to find all occurrences of #define weak_alias:

grep -r "#define weak_alias"

I've found many occurrences of the macro:

#define weak_alias(n, a)

but the macros don't actually explain anything. They just define that statement they don't show how its being replaced. For example one occurrence is in profil.c:

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

So any ideas what weak_alias does and where it is being defined?

Thanks in advance


Solution

  • from 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)));
    

    About weak symbol:

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