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

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段的输出分区,将复位中断服务函数分配在镜像的起始地址

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【python】requests 库 源码解读、参数解读
  • 使用 Python 模拟光的折射,反射,和全反射
  • 【技术解析】wx.request 封装:优化小程序网络请求的最佳实践
  • 人工智能面试题(Artificial Intelligence Algorithm Interview Questions)
  • 【深度学习】03-神经网络3-1梯度下降网络优化方法
  • 在Java中 String能存储多少个字符?
  • 前端——表单标签样式
  • 使用Python实现图形学曲线和曲面的B样条曲线算法
  • 通过 Xshell 无法连接到 Ubuntu
  • 计算机二级C语言练习题
  • 【AI写代码】使用 ChatGPT 写 ila
  • 【Oauth2整合gateway网关实现微服务单点登录】
  • pycharm恢复两边侧边栏常驻显示
  • 【QML 基础】QML ——描述性脚本语言,用于用户界面的编写
  • [深度学习]Pytorch框架
  • $translatePartialLoader加载失败及解决方式
  • ES学习笔记(12)--Symbol
  • HashMap ConcurrentHashMap
  • Java Agent 学习笔记
  • js 实现textarea输入字数提示
  • Markdown 语法简单说明
  • nodejs实现webservice问题总结
  • PHP的Ev教程三(Periodic watcher)
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Webpack 4 学习01(基础配置)
  • 初识 webpack
  • 近期前端发展计划
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 力扣(LeetCode)21
  • 容器服务kubernetes弹性伸缩高级用法
  • 入门级的git使用指北
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 用jQuery怎么做到前后端分离
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 阿里云服务器如何修改远程端口?
  • #include
  • #控制台大学课堂点名问题_课堂随机点名
  • $().each和$.each的区别
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (PADS学习)第二章:原理图绘制 第一部分
  • (pytorch进阶之路)扩散概率模型
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (三)docker:Dockerfile构建容器运行jar包
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (自适应手机端)行业协会机构网站模板
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .Net 4.0并行库实用性演练
  • .Net FrameWork总结