一个简单的链接脚本,用来将两个以上的.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

相关文章

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... 目录运行结果为什么需要这个工具技术实现工具的核心功能代码解析使用示例工具优化与扩展有时候,我们需要将

Python实现获取带合并单元格的表格数据

《Python实现获取带合并单元格的表格数据》由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,所以本文我们就来聊聊如何使用Python实现获取带合并单元格的表格数据吧... 由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,现将将封装成类,并通过调用list_exc

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片