what does the weak_alias function do and where is it defined

12,217

Solution 1

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

Solution 2

It is a macro that does the following:

It declares a weak function, if you didnt provide a strong symbol name for that function it will call the function you have laised it to. for example

int _foo(){ return 1;}

//And weak alias
int __attribute__((weak, alias("_foo"))) foo();

So if you haven't provided actual implementation for foo it will basically use _foo and return 1.

Share:
12,217
Programmer123
Author by

Programmer123

Updated on June 22, 2022

Comments

  • Programmer123
    Programmer123 about 2 years

    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