Weak Alias 跟 Weak Reference 完全没有任何关系,不过是我在看到 Weak Reference 的时候想到的而已。

Weak Alias 是 gcc 扩展里的东西,实际上是函数的属性。这个东西在库的实现里面可能会经常用到,比如 glibc 里面就用了不少。抄录一段 gcc 手册里面的话解释下函数属性是干啥的,

In GNU C, you declare certain things about functions called in your program which help the compiler optimize function calls and check your code more carefully.

先上代码,看看 weak alias 怎么写。第一个文件 dummy.c 内容,

#include int __foo() { puts(”I do no thing.”); } int foo() __attribute__ ((weak,alias(”__foo”)));

weak 和 alias 分别是两个属性。weak 使得 foo 这个符号在目标文件中作为 weak symbol 而不是 global symbol。用 nm 命令查看编译 dummy.c 生成的目标文件可用看到 foo 是一个 weak symbol,它前面的标记是 W。给函数加上weak属性时,即使函数没定义,函数被调用也可以编译成功。

00000000 T __foo 00000000 W foo U puts

而 alias 则使 foo 是 __foo 的一个别名,__foo 和 foo 必须在同一个编译单元中定义,否则会编译出错。

那么这个东西的用处是?

看第二个文件,func.c,

#include int foo() { puts(”I do something.”); }

这里有一个函数名字是 foo。如果我们编译 func.c 和 dummy.c 得到两个目标文件,当我们同时使用 func.o 和 dummy.o 和其他目标文件进行链接时,如果其他目标文件里面引用符号 foo,最终使用到的是 func.c 中定义的函数,而不是 __foo,虽然它有一个别名 foo。也就是说,我们最终使用到的函数会是“实际做事”的那个函数。当然,单独使用 dummy.o 链接的话使用的是那个“不做事”的函数。如果 dummy.o 中的 foo 不是 weak symbol 的话,在链接时会产生冲突,这就是我们要使用 weak 的原因

glibc 的实现里面经常用 weak alias。比如它的 socket 函数,在 C 文件里面你会看到一个 __socket 函数,它几乎什么都没有做,只是设置了一些错误代码,返回些东西而已。在同一个 C 文件里面会再声明一个__socket 的 weak alias 别名 socket。实际完成工作的代码通过汇编来实现,在另外的汇编文件里面会有设置系统调用号,执行 sysenter 或者 int 等动作去请求系统调用。以前看 glibc 里面系统调用的实现的时候郁闷过很久,就是那个时候才知道了 weak alias 这个东西。

__attribute__ 之weak,alias属性相关推荐

  1. C++项目:高并发内存池

    文章目录 项目介绍 什么是内存池 池化技术 内存池 malloc 页 定长的内存池 对比测试 高并发内存池整体框架设计 thread cache 整体设计 哈希桶映射对齐规则 TLS无锁访问 Cent ...

  2. 关于GCC属性中的弱符号(weak symbol)

    关于弱符号的解释: 若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak symbol(弱符号),则这些全局符号不会引发重定义错误.链接器会忽略弱符号,去使用普通的全局符号来解析 ...

  3. __attribute__((weak))是什么意思

    最近在阅读tcmalloc代码时发现使用了很多__attribute__((weak)),上网搜了以下有所了解. 弱符号: 若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak ...

  4. ARM 之十一__weak 和 __attribute__((weak)) 关键字的使用

      今天在使用 Keil (主要是 armcc 编译器)编译代码(华大的 MCU 驱动库hc32f46x_interrupts.h / c)的时候遇到了有 __weak 关键字的函数不起作用的问题,甚 ...

  5. __weak 和 __attribute__((weak)) 关键字的使用

    今天在使用 Keil (主要是 armcc 编译器)编译代码(华大的 MCU 驱动库hc32f46x_interrupts.h / c)的时候遇到了有 __weak 关键字的函数不起作用的问题,甚是奇 ...

  6. __attribute__编绎属性、关于__init、__initdata、__exit、__exitdata及类似的宏、关于initcall的一些宏定义、__setup宏的来源及使用...

    1. gcc的__attribute__编绎属性 要了解Linux Kernel代码的分段信息,需要了解一下gcc的__attribute__的编绎属性,__attribute__主要用于改变所声明或 ...

  7. GNU C之__attribute__

    __attribute__可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型属性(Type Attribute) __attribute_ ...

  8. [zz]GNU C __attribute__ 机制简介

    GNU C的一大特色(却不被初学者所知)就是__attribute__机制.__attribute__可以设置函数属性(Function Attribute).变量属性(Variable Attrib ...

  9. GNU C __attribute__ 机制简介

    原文链接:http://afreez.blog.51cto.com/59057/7351 摘要: 在学习linux内核代码及一些开源软件的源码(如:DirectFB),经常可以看到有关__attrib ...

最新文章

  1. Python 之父为什么嫌弃 lambda 匿名函数?
  2. c语言单词复数,C语言关于复数
  3. Java Spring IOC用法
  4. 华为云ROMA,联接企业应用的现在与未来
  5. android vitamio 教程,使用vitamio开发步骤
  6. 网站中使用中文个性字库字体--@font-face解决方案探索 l(转)
  7. Three.js中的矩阵
  8. 小程序源码:首席省钱赚钱专家微信小程序源码下载,淘宝客 外卖侠 外卖cps -多玩法安装简单
  9. 偏微分方程中常用的不等式
  10. css网站常用字体,网站常用字体那些事
  11. java多核_java多线程中与多核cpu有什么关系?
  12. android快速充电,快到令人发指 外媒评14款安卓机充电速度
  13. linux 中qq的安装程序,linux下的QQ安装、使用方法
  14. 简单了解一下LCD屏工作原理
  15. Unity功能记录(十四) ------ 启动画面
  16. 天津市网络安全等级保护和关键信息基础设施安全保护工作宣贯会成功举办
  17. 2022-4-28 BUUCTF Crypto区部分题目分享
  18. 16种面试常见问题技巧回答
  19. 基于ssm的考勤设备和考勤记录管理系统------(二)
  20. 寻找字符串的最长不重复子串,计算复杂度O(n),两种实现

热门文章

  1. jquery.easyui常用示例
  2. SQL中及Access的空值
  3. android 三星 白色,时尚实用都拥有 白色Android手机盘点
  4. 2017年计算机组成原理1254,2018年7月试卷号1254计算机组成原理A.pdf
  5. 广西2021普通高考成绩查询,2021广西高考成绩什么时候出
  6. ADO.NET,浅显
  7. c#打印,输出一句话
  8. (二)Cypher语言常用方法举例
  9. mysql5.6定时备份_Mysql自动备份
  10. 【OS学习笔记】三十七 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----主引导扇区代码