__attribute__ 之weak,alias属性

2023-11-01

原文地址:http://blog.sina.com.cn/s/blog_a9303fd90101d5su.html

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

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

In GNU C, you declare certain things about functions called inyour program which help the compiler optimize function calls andcheck 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 这个符号在目标文件中作为 weaksymbol 而不是 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 的 weakalias 别名 socket。实际完成工作的代码通过汇编来实现,在另外的汇编文件里面会有设置系统调用号,执行sysenter 或者 int 等动作去请求系统调用。以前看 glibc里面系统调用的实现的时候郁闷过很久,就是那个时候才知道了 weak alias 这个东西。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

__attribute__ 之weak,alias属性 的相关文章

  • Qt编译工程报错:No rule to make target

    第一种情况 Qt编译工程时候 所有用到的源文件包括头文件和库文件的 总路径长度不能超过190个左右字符 一旦超过 就会提示找不到那个文件 这个可能是Qt的makefile的机制问题 解决方法 工程文件夹名字命名尽量比较短 而且工程目录文件夹
  • Linux:CentOS7下配置 iptables

    iptables也叫netfilter 是Linux下自带的一款免费且优秀的基于包过滤的防火墙工具 他的功能十分强大 使用也非常灵活 可以对流入 流出 流经服务器的数据包进行精细的控制 但是iptables在CentOS7的版本上已经被阉割
  • kubernetes(K8s)集群(一)——简介及部署

    kubernetes K8s 集群 一 简介及部署 1 kubernetes简介 1 1 Kubernetes概述 1 2 kubernetes设计架构 1 3 kubernetes设计理念 2 kubernetes部署 2 1 准备工作
  • Python3读取txt文本并利用matplotlib绘制折线图(txt按行读取、字符串分割、matplotlib绘图)

    需要安装matplotlib库 可以用如下命令安装 pip install matplotlib txt文本数据如下所示 示例中的每一行内部用空格分开 100 0 6692215 200 0 57682794 300 0 45037615
  • Windows10安装torch

    w10中使用conda安装并且是3 6的环境输入命令 conda install pytorch cpu c pytorch pip3 install torchvision
  • vue-cli3.0的项目上,配置多个环境

    vue cli3 0的项目上 配置多个环境 一般情况下 我们会需要三个环境 开发环境 测试环境 生产环境 而3 0默认只支持两个环境 即测试环境 生产环境 创建测试环境 1 在根目录下创建一个evn test文件 NODE ENV test
  • 重磅福利

    声明 我已加入 维权骑士 http rightknights com 的版权保护计划 如需转载请先私信申请授权 版权所有 违者必究 知乎上的问题林林总总 每个主题下的问题都也不少 打开知乎 总是容易沉浸在茫茫的问题海洋中 如何找到好的问题和
  • Qt之自定义搜索框

    简述 关于搜索框 大家都经常接触 例如 浏览器搜索 Windows资源管理器搜索等 当然 这些对于Qt实现来说毫无压力 只要思路清晰 分分钟搞定 方案一 调用QLineEdit现有接口 void addAction QAction acti

随机推荐