代码之家  ›  专栏  ›  技术社区  ›  Programmer123

weakalias函数做什么,在哪里定义

  •  23
  • Programmer123  · 技术社区  · 8 年前

    所以我正在查看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>
    

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

    grep -r "#define weak_alias"
    

    我发现了许多宏:

    #define weak_alias(n, a)
    

    但宏实际上并没有解释任何东西。他们只是定义了这句话,并没有显示它是如何被替换的。例如,profil.c中出现了一次:

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

    那么,你知道weak_alias是做什么的吗?它的定义在哪里?

    提前谢谢

    2 回复  |  直到 8 年前
        1
  •  24
  •   Sam Liao    8 年前

    从…起 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)));
    

    关于弱符号:

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

        2
  •  9
  •   Anton Stafeyev    4 年前

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

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

    int _foo(){ return 1;}
    
    //And weak alias
    int __attribute__((weak, alias("_foo"))) foo();
    

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