GNU链接器(LD):设置入口点(ENTRY命令)的用法及实例解析

news2024/9/24 12:28:05

0 参考资料

GNU-LD-v2.30-中文手册.pdf
GNU linker.pdf

1 前言

一个完整的编译工具链应该包含以下4个部分:
(1)编译器
(2)汇编器
(3)链接器
(4)lib库
在GNU工具链中,对应的是:
(1)编译器:GCC(GNU Compiler Collection,GNU编译器套件)
(2)汇编器:GAS(GNU Assembler,GNU汇编器)
(3)链接器:LD(GNU Linker,GNU链接器)
(4)lib库:glibc(GNU C Library,GNU C 库)
本文介绍GNU链接器脚本中设置入口点(ENTRY命令)的用法及实例解析。

2 GNU linker(链接器,LD):设置入口点(ENTRY命令)的用法及实例解析

2.1 设置入口点官方释义及ENTRY命令的用法

CPU需要执行的第一条指令被称为入口点(Entry Point)。可以使用链接器脚本命令ENTRY设置入口点,不过ENTRY命令设置的入口点是elf loader加载程序的入口点,而不是CPU需要执行的第一条指令。使用ENTRY命令会影响elf文件的entry_address 字段。ENTRY命令格式如下:

ENTRY(symbol)
symbol:符号名称,可以是函数名、地址

LD支持几种方法设置入口点,链接器将按照以下顺序设置入口点,直到找到成功的入口点为止:
(1)添加entry命令行选项:‘-e’
(2)在链接器脚本使用ENTRY(symbol)命令
(3)目标指定符号的值(如果已经定义):大部分情况下如果定义了start符号则使用start符号,但基于PE和BeOS的系统会检查其它可行的入口符号,直到找到第一个符合的
(4)代码段(.text段)首地址
(5)地址0

2.2 ENTRY命令实例解析

很多链接脚本将复位中断服务函数作为入口点,配置SECTION内.text段的输出分区存储区域就可以将复位中断服务函数放置到代码段首地址。如下是stm32MP135的链接器脚本ENTRY的定义:

/* Entry Point */
ENTRY(Reset_Handler)

text段定义如下:

.RESET . : {
        __TEXT_START__ = .;
        *(.text.Reset_Handler)
        * (RESET)
        *(.text*)

        /* .init is used by libc_nano */
        KEEP (*(.init))
        KEEP (*(.fini))

        __TEXT_END_UNALIGNED__ = .;

        /*
         * Memory page(s) mapped to this section will be marked as
         * read-only, executable.  No non-executable data from the next section must
         * creep in.  Ensure the rest of the current memory page is unused.
         */
        __TEXT_END__ = .;

        . = NEXT(4096);

        __RO_START__ = .;
        *(.rodata*)

        __RO_END_UNALIGNED__ = .;
        /*
         * Memory page(s) mapped to this section will be marked as
         * read-only, non-executable.  No RW data from the next section must
         * creep in.  Ensure the rest of the current memory page is unused.
         */
        . = NEXT(4096);
        __RO_END__ = .;
    } >RAM :text

这样操作之后代码段首地址就是Reset_Handler函数,查看编译生成的.map文件如下:
在这里插入图片描述
可以看到Reset_Handler函数被定义在代码段首地址。
stm32MP135的SYSRAM起始地址定义如下:
在这里插入图片描述

2 总结

(1)ENTRY命令不能指定CPU执行的第一条指令,只会影响到elf文件的entry_address 字段
(2)ENTRY命令通常使用复位中断服务函数作为符号,通过修改.text段的输出分区,将复位中断服务函数分配在镜像的起始地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2160345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

#嵌入式笔面经分享#科大讯飞公司嵌入式硬件面经(第1面)

DNS是什么 DNS(Domain Name System)是一种用于将域名转换为IP地址的分布式命名系统。它充当 7.12 440 一个组产出最 7.12 440 一个组产出最多的是组长,是管理,这个组不正常。​出一个小学数学应用题:在 OSI七层模型?…

基于二自由度汽车模型的汽车质心侧偏角估计

一、质心侧偏角介绍 在车辆坐标系中,质心侧偏角通常定义为质心速度方向与车辆前进方向的夹角。如下图所示,u为车辆前进方向,v为质心速度方向,u和v之间的夹角便是质心侧偏角。 质心侧偏角的作用有如下三点: 1、稳定性…

什么是反射,反射用途,spring哪些地方用到了反射,我们项目中哪些地方用到了反射

3分钟搞懂Java反射 一、反射是什么 在Java中,反射(Reflection)是一种强大的工具,它允许程序在运行时获取和操作类、接口、构造器、方法和字段等。反射是Java语言的一个重要特性,它为开发人员提供了许多灵活性&#xf…

PHP探索校园新生态校园帮小程序系统小程序源码

探索校园新生态 —— 校园帮小程序系统,让生活更精彩! 🌱【开篇:走进未来校园,遇见新生态】🌱 你是否厌倦了传统校园的繁琐与单调?是否渴望在校园里也能享受到便捷、智能的生活体验&#xff1…

APS软件:生产计划排程的秩序守护者

生产计划制定 (1)APS排程是一种高度精细化的生产计划制定方法,它精准地计算出不同产品不同工序生产任务的起始、结束时间、每段工序加工时间内的生产数量以及产品的整个生产周期,同时全面考量设备性能、人员配置、物料供应等关键…

全球地图——为论文增色

✨全球地图是全球研究常用的结果表现形式,随着学科交叉,很多非地学(环境、化学、生物等)的顶刊也会运用到全球地图,为结果增色不少 ✨我总结了一些顶刊 (NSP,NG,NC)最新发布的相关图表✨ 这些图…

st7735调试记录

由于该模块陪我已经超过十年,最近想起来学习下lvgl,于是乎将其拿出来,尝试使能该模块从而学会lvgl 第一步肯定是找到资料确定下该模块是否好用。于是到网络上找到如下资料进行验证: https://pan.baidu.com/s/1CEunLuGUqLABR6I0UZ…

结构设计模式 -装饰器设计模式 - JAVA

装饰器设计模式 一. 介绍二. 代码示例2.1 抽象构件(Component)角色2.2 具体构件(Concrete Component)角色2.3 装饰(Decorator)角色2.4 具体装饰(Concrete Decorator)角色2.5 测试 结…

mysql 报 ERROR 1273: Unknown collation: ‘utf8mb4_0900_ai_ci‘ 的处理

1、数据库sql是mysql8的导出的,本机上安装的还是5.7的版本,然后导入sql,直接就报错。 2、mysql的下载地址: MySQL :: Download MySQL Community Server 3、报错截图: 4、重新选择一个collation就可以了,…

MoNA:复用跨模态预训练模型,少样本模态的福音 | ICML‘24

跨模态转移旨在利用大型预训练模型来完成可能不属于预训练数据模态的任务。现有的研究在将经典微调扩展到跨模态场景方面取得了一定的成功,但仍然缺乏对模态差距对转移的影响的理解。在这项工作中,进行了一系列关于转移过程中源表示质量的实验&#xff0…

最新视频号名字使用规范你了解了吗!

文章来源:视频号官方平台 视频号名字使用需遵循以下规范: 账号名字应当与简介的内容相符,且不得与已注册成功的账号名字重复。 账号超过180天未以视频号身份进行发表、评论等操作,将不再受到名字唯一保护,有其他用户申…

FPGA实现频率、幅度、相位可调的DDS以及DDS Compiler IP核的使用验证

文章目录 一、DDS介绍二、DDS原理2.1 频率计算2.2 相位改变2.3 波形切换 三、Matlab生成波形文件四、FPGA实现DDS4.1 Verilog代码4.2 仿真验证4.2.1 改变频率4.2.2 切换波形4.2.3 相位调节4.2.4 幅度调节 五、Xilinx DDS Compiler的使用5.1 功能框图5.1.1 相位累加器5.1.2 SIN/…

通俗讲解javascript的实例对象、原型对象和构造函数以及它们之间的关系

今天通俗讲解一下js的对象,因为要通俗,所以可能描述不甚准确。 在js中,想要创建一个对象,首先要写出构造函数(跟其它的语言不太一样哦,其它语言一般都会先写一个class 类名)。 构造函数写法如…

【PGCCC】 复合索引和部分索引,竟然能让查询速度提升 275 倍!

索引对于加速数据库查询和提高 PostgreSQL 应用程序的性能至关重要。但是,并非所有索引都以相同的方式发挥作用。复合索引和部分索引是两种常见类型,每种类型都有不同的用途和对性能的影响。本文我们将深入探讨复合索引和部分索引是什么、它们如何运作以…

关于在vue2中给el-input等输入框的placeholder加样式

::v-deep {.el-input--medium,.el-input__inner {height: 100%;background: #163670;border: 1px solid #4cc0f6;border-radius: 6px 6px 6px 6px;&::placeholder {color: #13EFFF;}} } 效果如下: .el-date-editor .el-range-input{&::placeholder {color:…

SAP MIGO M7146不支持移动原因

移动类型 Z91 查看配置:Z91 匹配的原因没有921 倒是Z92的原因里面有921 那解决方案有2种,但是要根据具体业务要求来 1、审视一下是否移动原因用错了 ?换一个移动原因 2、确实是这个移动类型 要用到这个移动原因 ,那就在上图 移…

Python编码系列—Python观察者模式:实现事件驱动架构的利器

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

【数字ic自整资料】SV约束constraint

参考链接: SV--随机约束(一)_sv constraint-CSDN博客 SV--随机约束(二)_sv constraint f循环-CSDN博客 [SV]Constraint 遇到的问题_父类和子类 constraint-CSDN博客 目录 1、随机化的概念理解 2、约束(constrain…

基于报位时间判断船舶设备是否在线,基于心跳时间判断基站网络是否在线

文章目录 引言I 在线船舶查询在线或者离线船舶显示在线状态统计在线船舶II 树状显示船舶设备数据结构统计船舶设备在线数和总数III 基站网络是否在线IV 知识扩展统计某个key的数据,例如统计船舶分类下的在线船舶MyBatis引言 本文采用的数据库是SQL Server,开发语言为Java。 …

无线协议wlan在华为模拟器中的实现

无线技术 wifi6:标准为802.11; wifi发展趋势: vlan基本概念: wlan组网架构: 1)fat胖AP;能够独立工作,可以单独配置;小型网络使用,功能少; 2)fit瘦APAC:适用大型网络…