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

本文主要是介绍一个简单的链接脚本,用来将两个以上的.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了。

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

这篇关于一个简单的链接脚本,用来将两个以上的.o文件合并在一起,以及如何看机器码的含义的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/714987

相关文章

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

Python中合并列表(list)的六种方法小结

《Python中合并列表(list)的六种方法小结》本文主要介绍了Python中合并列表(list)的六种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录一、直接用 + 合并列表二、用 extend() js方法三、用 zip() 函数交叉合并四、用

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

利用Python实现Excel文件智能合并工具

《利用Python实现Excel文件智能合并工具》有时候,我们需要将多个Excel文件按照特定顺序合并成一个文件,这样可以更方便地进行后续的数据处理和分析,下面我们看看如何使用Python实现Exce... 目录运行结果为什么需要这个工具技术实现工具的核心功能代码解析使用示例工具优化与扩展有时候,我们需要将