本文主要说明weak和alias是什么和如何使用它

__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;
}


本文章仅供学习交流用禁止用作商业用途,文中内容来水枂编辑,如需转载请告知,谢谢合作

微信公众号:zhjj0729

gcc: weak_alias如何使用相关推荐

  1. strong_alias、weak_alias

    strong_alias.weak_alias 在阅读glibc源码的时候,遇见了几个没见过的宏 因为我比较好奇,所以特地去找了一下有关这些宏的定义(主要也是想多学一点) 在include/libc- ...

  2. C语言 : weak_alias描述

    weak-alias 是一个宏,其目的是为函数添加一个"弱"别名,与"强"符号函数名区分. 说明, 如果调用函数无对应的函数无"强"符号对应 ...

  3. GCC 链接 xxx:No such file or directory 及运行可执行文件 error while loading shared libraries: xxx.so 解决方案

    关于 GCC 提示找不到指定库文件的这个问题,通常出现在以下 2 个场景中: 利用静态库或者动态库文件实现链接操作(生成可执行文件)时,·GCC 可能会提示 xxx:No such file or d ...

  4. GCC 同时编译多个 C/C++ 文件

    以下这些操作都可以共用一条 gcc 指令: 将多个 C/C++ 源文件加工为汇编文件或者目标文件: 将多个 C/C++ 源文件或者预处理文件加工为汇编文件或者目标文件: 将多个 C/C++ 源文件.预 ...

  5. GCC 连接器、链接标准库 gcc -l、链接手动创建库(指定目录的库 gcc -L)

    1. 链接器 链接器把多个二进制的目标文件(object file)链接成一个单独的可执行文件. 在链接过程中,它必须把符号(变量名.函数名等一些列标识符)用对应的数据的内存地址(变量地址.函数地址等 ...

  6. GCC 编译 C++ 程序分步骤流程(预处理 gcc -E、编译 gcc -S、汇编 gcc -c 和链接 gcc 以及 gcc -o 选项)

    C 或者 C++ 程序从源代码生成可执行程序的过程,需经历 4 个过程,分别是预处理.编译.汇编和链接. 同样,使用 GCC 编译器编译 C 或者 C++ 程序,也必须要经历这 4 个过程.但考虑在实 ...

  7. gcc 自动识别的文件扩展名,gcc/g++ -x 选项指定语言,不同 gcc 版本 -std 编译选项支持列表

    对于执行 C 或者 C++ 程序,需要借助 gcc(g++)指令来调用 GCC 编译器. 对于以 .c 为扩展名的文件,GCC 会自动将其视为 C 源代码文件 对于以 .cpp 为扩展名的文件,GCC ...

  8. gcc 和 g++ 的联系和区别,使用 gcc 编译 c++

    GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器. 实际使用中我们更习惯使用 gcc 指令编译 C 语言程序 ...

  9. GCC 在 Linux、Windows 系统安装

    1. GCC 简介 谈到 GCC,就不得不提 GNU 计划.GNU 全称 GNU's Not UNIX,又被称为"革奴计划",由理查德·斯托曼于 1983 年发起.GNU 计划的最 ...

最新文章

  1. What???你的GitHub爆款项目,面试官可能问都不问
  2. 意料之外,情理之中,Spring.NET 3.0 版本发布-
  3. MyBatis-学习笔记11【11.Mybatis的缓存】
  4. window下eclipse +cdt+cygwin做C,C++开发环境搭建 (转自:http://blog.csdn.net/thinkandchange/article/details/7935)
  5. linux添加硬盘永久挂载,linux新增硬盘如何挂载
  6. OpenCV初探 —— 将OpenCV窗口链接在MFC的PictureControl控件中
  7. python面试100讲
  8. 每一个写博客的程序猿,都应该被温柔对待
  9. 如何用PS缩小图片而清晰度不变?
  10. FaceBook 开发者应用申请
  11. 华为云对象存储OBS,助力企业降本增效
  12. 用Python编写代码来理解赢得《英雄联盟》游戏的胜利的最重要因素
  13. kubernetes 【调度和驱逐】【1】污点和容忍度
  14. 嵌入式是做什么的可就业方向是怎样的?
  15. 无线充电 Qi认证流程详解
  16. hive:函数:日期函数:to_date(),year(),month(),day(),hour(),minute(),second(),weekofyear()日期转周
  17. 测试iphone硬件好坏的软件,如何检测苹果手机硬件有没有故障,这几招收好不谢!...
  18. 【论文】SCI写作指南
  19. 用浏览器读取图片上的文字信息,这个方法很实用
  20. 辅助驾驶功能开发-功能规范篇(26)-3-紧急转向辅助ESA

热门文章

  1. 第4篇:Flowable-Modeler详述之流程概述
  2. SpringBoot入门到精通_第5篇 _SpringBoot Actuator监控
  3. mybatis resultMap type属性问题 ( xx.xx.PO cannot be cast to xx.xx.BO)
  4. python工作目录_Python目录的基本操作
  5. UDP丢包问题及解决方案
  6. java 项目 人力资源项目,基于jsp的人力资源系统-JavaEE实现人力资源系统 - java项目源码...
  7. js java 反射机制_java 类加载机制和反射机制
  8. 侍魂服务器维修,侍魂胧月传说合服活动开启 4月15日更新内容预告
  9. 内存条上面参数详解_为什么买内存条要看时序?别以为内存频率高性能就好
  10. java中strictfp么意思_什么时候应该在java中使用“strictfp”关键字?