当前位置: 首页 > news >正文

【ARM 嵌入式 编译系列 10.5 -- .linkonce 段详细介绍】


请阅读【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】

文章目录

    • .linkonce 段详细介绍
      • GOT 全局偏移表

.linkonce 段详细介绍

.gnu.linkonce.t是一个链接器区段,用于存放那些只需要链接一次的函数或者符号。区段名称后面通常跟着函数或者符号的名字。

关于linkonce的概念,GCC文档给出的解释是:“某些情况下,编译器为了优化而生成的代码项,不必在每一个包含了相同代码的编译单元中都出现。编译器将这些代码项放在.linkonce区段中,链接器在链接时只保留一份。”

linkonce区段有几种类型:

  • .gnu.linkonce.b.*(用于未初始化的全局变量);
  • .gnu.linkonce.d.*(用于已初始化的全局变量);
  • .gnu.linkonce.r.*(用于常量数据);
  • .gnu.linkonce.t.*(用于文本,也就是可执行代码)等。

例如,如果你有一个函数 foo,GCC可能将其编译到.gnu.linkonce.t.foo区段中,如果链接时发现其它对象文件也有.gnu.linkonce.t.foo,那么链接器只会保留其中一份。

这主要用于C++中的inline函数或模板函数,通常情况下,每一个使用到这些函数的源文件都会生成一份函数的实例,但是链接时只需要保留一份即可。这样可以减少目标文件的大小,提高链接效率。

GOT 全局偏移表

GOT,全称为全局偏移表(Global Offset Table),是用于实现动态链接的一种数据结构。它主要用于存储运行时的全局数据地址。

在ARM架构下,由于PC相对寻址的范围有限(一般只有4MB),所以对于大部分的全局变量或者函数,尤其是在大型程序中,其地址往往超出了这个范围,无法直接进行寻址。

这时候就需要GOT来解决这个问题。编译器和链接器会把这些全局数据的地址存储在一个特殊的表结构——GOT中,然后通过PC寄存器相对GOT的偏移来访问这些全局数据,从而突破了PC寻址的范围限制。

总的来说,在ARM GCC中,GOT的主要作用就是帮助实现程序的动态链接,使得程序可以在运行时正确地找到全局数据的地址。

相关文章:

  • OpenHarmony教程指南—事件的订阅和发布
  • ospf虚链路实验简述
  • vue2 elementui 封装一个动态表单复杂组件
  • Neo4J
  • 数据库_关系代数的运算
  • Oracle存储过程干货(一):存储过程基础
  • 双体系Java学习之算术运算符,赋值运算符,关系运算符
  • 20个Python函数程序实例
  • mysql的语法学习总结3(一些常见的问题)
  • C语言:判断闰年(简单)
  • 14:00面试,15:00就出来了,问的问题过于变态了。。。
  • matlab 提取分割位于多边形区域边缘内部或边缘上的点
  • PHP伪协议是什么?
  • Java引用传递及基本应用
  • 构建MySQL数据库的高可用与高容错系统:关键策略与最佳实践
  • 《深入 React 技术栈》
  • Bytom交易说明(账户管理模式)
  • gf框架之分页模块(五) - 自定义分页
  • JavaScript DOM 10 - 滚动
  • php中curl和soap方式请求服务超时问题
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Vue.js-Day01
  • Vue.js源码(2):初探List Rendering
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 构建工具 - 收藏集 - 掘金
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 悄悄地说一个bug
  • 项目管理碎碎念系列之一:干系人管理
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • # .NET Framework中使用命名管道进行进程间通信
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (pojstep1.1.2)2654(直叙式模拟)
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (solr系列:一)使用tomcat部署solr服务
  • (第二周)效能测试
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (强烈推荐)移动端音视频从零到上手(下)
  • (转)ORM
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转)项目管理杂谈-我所期望的新人
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NetCore部署微服务(二)
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .NET中使用Redis (二)
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @SpringBootApplication 包含的三个注解及其含义
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [C#] 如何调用Python脚本程序
  • [C#]C# winform实现imagecaption图像生成描述图文描述生成
  • [C++]AVL树怎么转
  • [CISCN2019 华东南赛区]Web11
  • [E链表] lc83. 删除排序链表中的重复元素(单链表+模拟)
  • [FC][常见Mapper IRQ研究]