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

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.xdnf.cn/news/147847.html

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

相关文章

3.5.2 __ipipe_init()之完成中断处理程序设置

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力! 3.5.2 __ipipe_init()之完成中断处理程序设置 __ipipe_init()最核心的就是__ipipe_enable_pipeline()&am…

Mybatis自定义TypeHandler,直接存储枚举类对象

在这篇文章中,我们已经知道如何使用枚举类直接接受前端的数字类型参数,省去了麻烦的转换。如果数据库需要保存枚举类的code,一般做法也是代码中手动转换,那么能不能通过某种机制,省去转换,达到代码中直接保…

PowerMill 2025简体中文版百度云资源分享下载

如大家所了解的,PowerMill是一款专业的CAM(计算机辅助制造)软件。主要用于加工行业,可以帮助用户进行高效、精准的加工工艺设计和数控编程,以达到生产部件的高精度和高质量。 对于初次接触的小伙伴来说,目…

k均值vs高斯混合模型

K均值(K-means)和高斯混合模型(Gaussian Mixture Model, GMM)是常用的聚类算法。 K均值是非概率模型,根据(欧氏)距离判断,类比最小距离分类器(分类)。高斯混…

240922-chromadb的基本使用

A. 基本使用 ChromaDB 是一个专门为向量数据库和嵌入查询优化的数据库。它可以与嵌入模型结合使用,存储和查询高维向量数据,通常用于大规模语义搜索、推荐系统等领域。 以下是使用 ChromaDB 的步骤: 1. 安装 ChromaDB 你可以通过 pip 安装…

96. UE5 GAS RPG 实现闪电链技能(一)

闪电链有一个施法的过程,就是在按键按下的过程,会在按下的过程一直持续造成伤害,一直等到条件不满足(技能键位抬起,蓝量不足,被眩晕)时,将结束技能,并退出技能状态。 所以…

【WSL迁移】将WSL2迁移到D盘

首先查看WSL状态:wsl -l -v 以压缩包的形式导出到其他盘。 wsl --export Ubuntu D:\Ubuntu_WSL\ubuntu.tar 注销原有的linux系统 wsl --unregister Ubuntu 导入系统到D盘 wsl --import Ubuntu D:\Ubuntu_WSL D:\Ubuntu_WSL\Ubuntu.tar 恢复默认用户 Ubuntu co…

如何保护您的机器学习模型

在计算机技术领域,很少有领域像人工智能(AI)和机器学习(ML)一样受到如此多的关注。这门学科位于计算机科学和数据分析的交叉点,已成为移动应用程序、语音助手、欺诈交易检测、图像识别、自动驾驶甚至医疗诊断不可或缺的一部分。 背景介绍由于机器学习模型…

数据结构与算法——Java实现 9.习题——删除链表倒数节点

目录 19. 删除链表的倒数第 N 个结点 方法1 通过链表长度直接删除 方法2 递归加入哨兵节点 ListNode 方法3 快慢指针法 苦难,区区挫折罢了,而我必定站在幸福的塔尖 —— 24.9.22 19. 删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第…

预付费计量系统整体概念

1.预付费计量系统整体概念 A Payment Metering System is a collective infrastructure that supports the contractual relationship between a supplier of goods or services and a customer. It includes processes, functions, data elements, system entities (devices a…

鸿蒙 OS 开发零基础快速入门教程

视频课程: 东西比较多, 这里主要分享一些代码和案例. 开关灯效果案例: 开灯 开关灯效果案例: 关灯 Column 和 Row 的基本用法 Entry Component struct Index {State message: string 张三;build() {// 一行内容Row() {// 一列内容Column() {// 文本内容Text(this.mess…

IDEA创建Web项目(详细版)

目录 1 新建Web项目 步骤如下 1 打开idea,选择新建项目 2 点击创建 3 点击项目结构,选择添加模块 ---web 2 配置Tomcat 步骤如下 1 点击Edit Configurations(编辑配置) 1.1 右上角当前文件下 选择编辑配置 1.2 点击菜单栏中run 选…

宝塔linux 安装code-server指定对应的端口无法访问

这个一般就是nginx搞的鬼,如果服务正常启动,就是访问不了;大概就是宝塔安装的nginx配置没有代理code-server服务对应的端口,一般就是nginx配置文件的问题 安装默认的nginx会有一个配置文件 直接拉到最后会有一行这个&#xff0c…

Linux 文件系统(下)

目录 一.文件系统 1.文件在磁盘上的存储方式 a.盘面、磁道和扇区 b.分区和分组 2.有关Block group相关字段详解 a.inode编号 b.inode Table(节点表) c.Data blocks(数据区) d.小结 二.软硬链接 1.软链接 a.软链接的创建…

springboot启动流程之总体流程梳理

springboot的启动流程相当复杂,我们需要先把控整体流程,后面会有若干文章一一讲解springboot启动流程中的重要的细节,springboot的启动经过了一些一系列的处理,我们先看看整体过程的流程图 篇幅有限,我们这里先聊聊实…

N叉树的前序与后续遍历(含两道leetcode题)

文章目录 589. N 叉树的前序遍历递归法迭代法 590. N 叉树的后序遍历递归法迭代法 589. N 叉树的前序遍历 589. N 叉树的前序遍历 给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由…

CSP-S 2024 提高组初赛第一轮初赛试题及答案解析

完整试题,CSP-S-2024 CSP-S 2024 提高组初赛第一轮初赛试题及答案解析 一、 单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项) 1 在 Linux 系统中,如果你想显示当前工作目录的…

哔哩哔哩自动批量删除抽奖动态解析篇(一)

本文的分析过程可能需要读者了解一点前后端数据交互和逆向分析的思路和基础,由于本人是新手,自己也处于摸索学习阶段,说的不对或者不好的地方敬请谅解。 一、删除动态流程分析 B站每条动态无论是转发他人的动态还是自己原创发布的动态都有一…

蓝桥杯1.小蓝的漆房

样例输入 2 5 2 1 1 2 2 1 6 2 1 2 2 3 3 3样例输出 1 2 import math import os import sys tint(input())#执行的次数 for j in range(t):n,kmap(int,input().split())#n为房间数 k为一次能涂的个数alist(map(int,input().split()))#以列表的形式存放房间的颜色maxvaluemath…

MySQL数据库的增删改查以及基本操作分享

1、登录MySQL数据库 首先找到你安装MySQL数据库的目录,然后在终端打开该目录,输入以下命令 mysql -u root -p然后输入密码就可以登录数据库了,看到如下页面就是登陆成功了 ***注意在终端操纵数据库时所有语句写完之后一定要加 &#xff1…