现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

gcc: weak_alias如何使用

2019-12-12 12:35 工业·编程 ⁄ 共 1230字 ⁄ 字号 暂无评论

__attribute__是用来说明函数的属性,weak和alias分别是两个属性。

(一)强符号和弱符号:

   强符号:已经初始化的全局变量和未被weak修饰的函数

   弱符号:未初始化的全局变量和被weak修饰的函数

符号链接原理:链接器发现同时存在弱符号和强符号,优先选择强符号,如果发现不存在强符号,只存在弱符号,则选择弱符号

那么它们有什么用呢?比如我们想使用某个函数必须用到的函数,但是不知道该函数在其他地方有没有被定义,那么我们可以把该函数声明为弱符号。

eg:

void led_init()  __attribute__((weak))

(二)alias

alias其实就是给函数起个别名,而不用定义

#include <stdio.h>

int test1()

{

  printf("%s\n",__FUNCTION__);

  return 0;

}

 

int test() __attribute__((alias("test1")));

 

int main()

{

  test();

  return 0;

}

上面对test的调用就是对test1的调用,简单吧

(三)weak_alias的用法

例一

//strong.c

#include <stdio.h>

void fun(char * s)

{

        printf("_strong:%s\n",s);

}

#include <stdio.h>

void fun(char * s) __attribute__((weak,alias("_weak")));

void fun1(char* s) __attribute__((weak,alias("_weak")));

void _weak(char * s)

{

        printf("_weak:%s\n",s);

}

//weak.c

//main.c

#include <stdio.h>

int main(int argc ,char * argv[])

{

       fun("test");

       fun1("test");

       return 0;

}

~/test# ./a.out

_strong:test

_weak:test

从上面执行结果也能看出来:编译器先寻找强符号,没有强符号的函数再去找弱符号定义的函数。

例二:

#include <stdio.h>

#define weak_alias(name, aliasname) _weak_alias (name, aliasname)

#define _weak_alias(name,aliasname) extern __typeof (name) aliasname __attribute__ ((weak,alias(#name)));

void __fun(void)

{

        printf("this is ___fun\n");

}

weak_alias(__fun,fun1);

int main(int argc,char * argv[])

{

   __fun();

   fun1();

   return 0;

}

给我留言

留言无头像?