一个简单的链接脚本,用来将两个以上的.o文件合并在一起,以及如何看机器码的含义

下面是一个简单的lds链接脚本,用来将两个以上的.o文件合并在一起,并且用来指定链接后的代码加载到内存中的起始地址。

SECTIONS					@说明这是段的描述脚本
{. = 0xD0020010;		@加载代码到内存中的起始地址为0xD0020010.text : {			@代码段mystart.o	@mystart.o中的代码段放在最前面,因为mystart.o最前面是中断向量* (.text)	@其它.o文件代码段位置可以任意放置}.data : {			@数据段* (.data)	@*号说明各个.o文件的数据段位置无关}.bss_start = .;		@定义一个bss_start标号,可以给其它程序使用.bss : {			@未初始化数据段* (.bss)	@*号说明各个.o文件的数据段位置无关}.bss_end = .;		@定义一个bss_end标号,可以给其它程序使用
}

1.机器码如何看含义

首先我们使用arm-linux-objdump -S mystart.o查看一下mystart.o的机器码和汇编码:
ea000006是机器码,也就是最后会被添加到.bin文件中的代码; b 20 reset是汇编代码,这部分不会被添加最后的.bin文件中。
在这里插入图片描述
那么机器码如何看呢?
我们把ea000006展开为二进制,如下:
在这里插入图片描述
查看ARM手册:
在这里插入图片描述
可以知道cond=1110 op1=101,说明ea000006是一个Branch指令(意思就是PC相对跳转指令),我们跳转到手册的A5-212去看下。
在这里插入图片描述
在这里插入图片描述
对应的op是100000,我们跳转到ARM手册A8-332去看一下
在这里插入图片描述
以为我们用的是arm指令集,所以看Encoding A1.
imm32 = SignExtend(imm24:’00’, 32);这句说明要讲imm24后面添加两个00.也就是imm24 * 4.

ea000006的imm24是0x6, 也就是pc指针会在当前位置往前跳转0x6 * 4行。
Armv7是三级流水线,在执行ea000006这条指令是,pc指针中指向的是后面第三行指令ea000004,当执行完ea000006指令后pc加0x6*4行,指向eb000006. 同b 20 reset指令一样。这也就b 20 reset汇编指令的来源。
在这里插入图片描述
ea000006后面几条也都是这样解释的。
特别要说的是eaffffff这条。imm24: ffffff是-1的补码,执行完eafffffff后pc指针要从ffffffe调回到ea000006。

2.汇编后的代码

然讲下ebfffffe为何汇编为 bl 0 led2_on,跳转到0呢?那时因为led2_on没有在mystart.o中,编译器暂时用0代替。当包含led2_on函数的.o文件被链接后,这条指令会被重新编译。
在这里插入图片描述
led2_on函数在mylowlevel_init.o中,我们使用objdump查看一下:
在这里插入图片描述
然后使用我们最开始写的链接脚本将两个文件链接在一起,连接后的文件是 myboot.
从中我们可以看到bl 0 led2_on 已经被修改为bl d00200a0 led2_on. 同时也可以看到myboot的程序入库已经被修改为了0xD0020010了。

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java图形化界面编程——五子棋游戏 笔记

2.8.5 五子棋 接下来,我们使用之前学习的绘图技术,做一个五子棋的游戏。 注意,这个代码只实现了五子棋的落子、删除棋子和动画等逻辑实现,并没有把五子棋的游戏逻辑编写完整,比较简单易上手。 图片素材 package…

[嵌入式系统-14]:常见实时嵌入式操作系统比较:RT-Thread、uC/OS-II和FreeRTOS、Linux

目录 一、实时嵌入式操作系统 1.1 概述 1.2 什么“实时” 1.3 什么是硬实时和软实时 1.4 什么是嵌入式 1.5 什么操作系统 二、常见重量级操作系统 三、常见轻量级嵌入式操作系统 3.1 概述 3.2 FreeRTOS 3.3 uC/OS-II 3.4 RT-Thread 3.5 RT-Thread、uC/OS-II、Free…

智能汽车行业产业研究报告:毫米波雷达优势明显,核心壁垒是芯片、天线阵列、波形设计

今天分享的是智能汽车系列深度研究报告:《智能汽车行业产业研究报告:毫米波雷达优势明显,核心壁垒是芯片、天线阵列、波形设计》。 (报告出品方:国泰君安证券) 报告共计:67页 毫米波雷达被广泛…

浅谈业务场景中缓存的使用

浅谈缓存 一、背景二、缓存分类1.本地缓存2.分布式缓存 三、缓存读写模式1.读请求2.写请求 四、缓存穿透1.缓存空对象2.请求校验3.请求来源限制4.布隆过滤器 五、缓存击穿1.改变过期时间2.串行访问数据库 六、缓存雪崩1.避免集中过期2.提前更新缓存 七、缓存与数据库一致性1.设…

超详细的介绍Python语句

一、 常用命令 在介绍Python语句之前,先介绍一下几个有用的Python命令。 dir(模块名或类名或变量名或表达式名):获得当前模块、变量对应类型、表达式计算值对应类的属性列表 type(变量名或表达式名):获取变量或表达式计算值的对…

ChatGPT绘图指南:DALL.E3玩法大全(一)

一、 DALLE.3 模型介绍 1、什么是 DALLE.3 模型? DALLE-3模型,是一种由OpenAI研发的技术,它是一种先进的生成模型,可以将文字描述转化为清晰的图片。这种模型的名称"DALLE"实际上是"Deep Auto-regressive Latent …

optee imx8mm

总仓库 git clone https://github.com/Xsyin/imx8mqevk.git -b container_region 替换imx8mqevk中的optee-client git clone https://github.com/nxp-imx/imx-optee-client.git -b lf-5.15.32_2.0.0 用 5.15.32 kernel 会有如下报错,需要将optee os升级到分支 lf-…

单片机学习笔记---LCD1602

LCD1602介绍 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符(比如日文的片假名),还可以有8个自定义字符 显示容量:…

智能汽车专题:华为赋能下的车企,具备下一阶段Winner的潜质

今天分享的是智能汽车系列深度研究报告:《智能汽车专题:华为赋能下的车企,具备下一阶段Winner的潜质》。 (报告出品方:广发证券) 报告共计:27页 华为汽车业务历史沿革 基于ICT领域的深厚积累…

家里台式机需要把一个网站发布到外网可用,怎么搞?--DDNS配置(动态域名解析配置)

前言 Dynamic DNS是一个DNS服务。当您的设备IP地址被互联网服务提供商动态变更时,它提供选项来自动变更一个或多个DNS记录的IP地址。 此服务在技术术语上也被称作DDNS或是Dyn DNS 如果您没有一个静态IP,那么每次您重新连接到互联网是IP都会改变。为了避免每次IP变化时手动更…

重磅!谷歌宣布发布Gemini 1.5 Pro,距离Gemini发布仅仅一个半月!最高支持1000万上下文长度,GSM8K评测全球第一

本文原文来自DataLearnerAI官方网站: 重磅!谷歌宣布发布Gemini 1.5 Pro,距离Gemini发布仅仅一个半月!最高支持1000万上下文长度,GSM8K评测全球第一 | 数据学习者官方网站(Datalearner)https://www.datalearner.com/bl…

Atcoder ABC339 D - Synchronized Players

Synchronized Players(同步的球员) 时间限制:4s 内存限制:1024MB 【原题地址】 所有图片源自Atcoder,题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 【输出格式】 【样例1】 【…