链接脚本的编写( 起始地址、text、data、__bss_start、__bss_end、dis反汇编验证)

目录

    • 链接脚本的简介以及简单编写
    • 编写本试验的链接脚本

链接脚本的简介以及简单编写

链接脚本描述了要链接的文件,以及链接顺序、链接首地址

在博文ARM(IMX6U)裸机C语言版本LED驱动实验中,我们在编译过程中使用Makefile 来链接代码,其中使用了如下语句:

arm-linux-gnueabihf-ld  -Ttext 0X87800000  -o  ledc.elf   $^

上面语句中我们是通过“-Ttext”来指定链接地址是 0X87800000 的,这样的话所有的文件都会链接到以 0X87800000 为起始地址的区域。

有时候我们很多文件需要链接到指定的区域,或者叫做段里面,比如在 Linux 里面初始化函数就会放到 init 段里面。因此我们需要能够自定义一些段,这些段的起始地址我们可以自由指定,同样的我们也可以指定一个文件或者函数应该存放到哪个段里面去

要完成这个功能我们就需要使用到链接脚本,看名字就知道链接脚本主要用于链接的,用于描述文件应该如何被链接在一起形成最终的可执行文件。其主要目的是描述输入文件中的段如何被映射到输出文件中,并且控制输出文件中的内存排布。比如我们编译生成的文件一般都包含 text 段、 data 段等等。

链接脚本的语法很简单,就是编写一系列的命令,这些命令组成了链接脚本,每个命令是一个带有参数的关键字或者一个对符号的赋值,可以使用分号分隔命令。像文件名之类的字符串可以直接键入,也可以使用通配符“*”。最简单的链接脚本可以只包含一个命令“SECTIONS”,我们可以在这一个“SECTIONS”里面来描述输出文件的内存布局。我们一般编译出来的代码都包含在 text、 data、 bss 和 rodata 这四个段内,假设现在的代码要被链接到 0X10000000 这个地址,数据要被链接到 0X30000000 这个地方,下面就是完成此功能的最简单的链接脚本:

创建后缀名为.lds的文件

SECTIONS{. = 0X10000000;.text : {*(.text)}. = 0X30000000;.data ALIGN(4) : { *(.data) }.bss ALIGN(4) : { *(.bss) }}

第 1 行我们先写了一个关键字“SECTIONS”,后面跟了一个大括号,这个大括号和第 7 行的大括号是一对,这是必须的。看起来就跟 C 语言里面的函数一样。

第 2 行对一个特殊符号“.”进行赋值,“.”在链接脚本里面叫做定位计数器,默认的定位计数器为 0。我们要求代码链接到以 0X10000000 为起始地址的地方,因此这一行给“.”赋值0X10000000,表示以 0X10000000 开始,后面的文件或者段都会以 0X10000000 为起始地址开始链接。

第 3 行的“.text”是段名(代码段),后面的冒号是语法要求,冒号后面的大括号里面可以填上要链接到“.text”这个段里面的所有文件,“(.text)”中的“”是通配符,表示所有输入文件的.text段都放到“.text”中。

第 4 行,我们的要求是数据放到 0X30000000 开始的地方,所以我们需要重新设置定位计数器“.”,将其改为 0X30000000。如果不重新设置的话会怎么样?假设“.text”段大小为 0X10000,那么接下来的.data 段开始地址就是 0X10000000+0X10000=0X10010000,这明显不符合我们的要求。所以我们必须调整定位计数器为 0X30000000。

第 5 行跟第 3 行一样,定义了一个名为“.data”的段(数据段),然后所有文件的“.data”段都放到这里面。但是这一行多了一个“ALIGN(4)”,这是什么意思呢?这是用来对“.data”这个段的起始地址做字节对齐的, ALIGN(4)表示 4 字节对齐。也就是说段“.data”的起始地址要能被 4 整除,一般常见的都是 ALIGN(4)或者 ALIGN(8),也就是 4 字节或者 8 字节对齐。

第 6 行定义了一个“.bss”段(bss数据段x,表示定义了但是还没有初始化的数据段),所有文件中的“.bss”数据都会被放到这个里面,“.bss”数据就是那些定义了但是没有被初始化的变量。

编写本试验的链接脚本

上面就是链接脚本最基本的语法格式,我们接下来就按照这个基本的语法格式来编写我们本试验的链接脚本,我们本试验的链接脚本要求如下

①、链接起始地址为0X87800000。
②、start.o 要被链接到最开始的地方,因为start.o 里面包含这第一个要执行的命令。
根据要求,在Makefile 同目录下新建一个名为“imx6ul.lds”的文件,然后在此文件里面输入如下所示代码:

imx6u.lds

SECTIONS{. = 0X87800000;.text :{start.omain.o*(.text)}.rodata ALIGN(4) : {*(.rodata*)}.data ALIGN(4) : { *(.data) }__bss_start = .;.bss ALIGN(4) : { *(.bss) *(COMMON) }__bss_end = .;}

上述代码“text :”中的冒号要和text段名空格隔开。

上面的链接脚本文件和示例代码基本一致的。

第2 行设置定位计数器为0X87800000,因为我们的链接地址就是0X87800000。

第5 行设置链接到开始位置的文件为start.o,因为start.o 里面包含着第一个要执行的指令,所以一定要链接到最开始的地方。

第6行是main.o这个文件,其实可以不用写出来,因为main.o 的位置就无所谓了,可以由编译器自行决定链接位置。

第9行rodata 表示read only只读数据段。

在第11、13 行有“__bss_start”和“__bss_end”这两个东西?这个是什么呢?“__bss_start”和“__bss_end”是符号,第11、13 这两行其实就是对这两个符号进行赋值,其值为定位符“.”,这两个符号用来保存.bss 段的起始地址和结束地址
前面说了.bss 段是定义了但是没有被初始化的变量,我们需要手动对.bss 段的变量清零的,因此我们需要知道.bss 段的起始和结束地址,这样我们直接对这段内存赋0 即可完成清零。通过第11、13 行代码,.bss 段的起始地址和结束地址就保存在了“__bss_start”和“__bss_end”中,我们就可以直接在汇编或者C 文件里面使用这两个符号。

编写完这个链接脚本,怎么去使用这个链接脚本呢?

在Makefile文件里面添加进来就OK了,如图:
在这里插入图片描述

最后查看反汇编文件,发现start已经链接到指定的位置当中了。
在这里插入图片描述

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

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

相关文章

java 无法加载资源,JavaScript:无法加载资源:服务器响应状态为404(未找到)

我处理 JavaScript 应用程序,该应用程序在 https://localhost:63342/WalletClient/index.html_ijtk4ock08pqsve8hb7b2b34ou3h5 的localhost地址中打开 . 看起来像这样,单击余额按钮时,它应执行以下 Ajax GET 请求并尝试打开新页面 balance.ht…

ARM(IMX6U)裸机模仿STM32驱动开发实验(定义外设结构体)

参考:Linux之ARM(IMX6U)裸机模仿STM32驱动开发格式 作者:一只青木呀 发布时间: 2020-08-15 12:11:56 网址:https://blog.csdn.net/weixin_45309916/article/details/108019447 目录0.外设结构体抽象思路1.模…

ARM(IMX6U)裸机官方SDK包使用

参考:Linux之ARM(IMX6U)裸机C语言LED驱动实验–驱动编写,编译 作者:一只青木呀 发布时间: 2020-08-11 11:20:17 网址:https://blog.csdn.net/weixin_45309916/article/details/107930284 目录1、I.MX6ULL 官…

Leaflet中添加的不同图层样式图标

如上图,具体问题请查看对应html页引用的basemaps的css样式。 如下图是本项目引用的css样式: .basemap img { width: 48px; border: 2px solid #FFF; margin: 0 2px; /*border-radius: 40px;*/ box-shadow: 0 1px 5px rgba(0,0,0,0.65)} 当css样式中的bor…

ARM(IMX6U)BSP工程文件管理(分文件编程)

参考:Linux之ARM(IMX6U)BSP工程管理实验 作者:一只青木呀 发布时间: 2020-08-15 23:41:37 网址:https://blog.csdn.net/weixin_45309916/article/details/108028093 目录1、工程管理简介1.1、创建bsp、imx6…

php图片视频,PHP中使用php5-ffmpeg撷取视频图片实例

前几天在玩 FFmpeg 的时后,突然发现 Ubuntu 上多了 php5-ffmpeg 这个扩充套件,就想来玩玩看,看好不好用,有两个结论:读取影片取决于 FFmpeg 的支援性,如果想要什么格式都支援的话,建议自己重新编…

ARM(IMX6U)裸机C语言蜂鸣器驱动实验(BSP+SDK)

参考:Linux之ARM(IMX6U)裸机C语言蜂鸣器驱动实验–驱动编写,编译 作者:一只青木呀 发布时间: 2020-08-16 14:47:23 网址:https://blog.csdn.net/weixin_45309916/article/details/108032168 目录1、有源蜂鸣…

java金字塔的流程图,R中的金字塔图

Plotrix可能更容易,但可以反汇编ggplot图表,并将它们排列为金字塔图 . 使用 eipi10的数据(谢谢),并调整drawing-pyramid-plot-using-r-and-ggplot2中的代码,我为"males","females"和"country…

ARM(IMX6U)裸机按键输入实验(BSP+SDK、GPIO输入与输出、按键消抖)

参考:Linux之ARM(IMX6U)裸机按键输入实验(GPIO的输出与输入) 作者:一只青木呀 发布时间: 2020-08-17 21:43:37 网址:https://blog.csdn.net/weixin_45309916/article/details/108057…

php 提取正文算法,PHP生成文章摘要算法_栈

之前网上复制了一个摘要算法,一直使用正常。最近写的一篇前500字里含有超链接,就导致摘要生成有误,从而影响了前端样式。所以后面打算自己写,想起大学编译原理匹配表达式的大致思想,就决定采用栈的思想试试。实现目标&…

设计模式 之 《组合模式》

GOOD&#xff1a;整体和部分可以被一致对待&#xff08;如WORD中复制一个文字、一段文字、一篇文章都是一样的操作&#xff09; #ifndef __COMPOSITE_MODEL__ #define __COMPOSITE_MODEL__ #include <iostream> #include <string> #include <vector> using n…

ARM(IMX6U)裸机主频和时钟

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;裸机主频和时钟配置 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-28 10:39:17 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/108237599 目录1、I.MX6U 时钟系统详解系统时钟…

关联矩阵古林法的matlab代码,[转载][原创]灰色关联分析及Matlab程序实现

灰色系统理论由我国著名学者邓聚龙教授于1982提出。灰色关联分析是灰色系统理论的一个分支&#xff0c;应用灰色关联分析方法对受多种因素影响的事物和现象从整体观念出发进行综合评价是一个被广为接受的方法。一、灰色关联分析法的建模过程灰色关联分析法的基本思想是根据各比…

C语言排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)

参考&#xff1a;C语言五大排序&#xff08;桶排序&#xff0c;冒泡排序&#xff0c;选择排序&#xff0c;插入排序&#xff0c;快速排序&#xff09;动态演示 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-09-09 20:18:43 网址&#xff1a;https://blog.csdn.net/we…

FIFO分枝_限界算法

问题&#xff1a; 检索4-皇后问题的状态空间树如下图的基本过程。&#xff08;4-皇后问题解空间的树结构&#xff0c;结点按深度优先检索编号&#xff09; 如果按序扩展这些结点&#xff0c;则下一个E-结点就是结点2。扩展结点2后生成结点3&#xff0c;8和13。利用限界函数(同行…

智能家居APP使用指南

参考&#xff1a;智能家居APP使用指南 作者&#xff1a;图触靓 发布时间&#xff1a; 2021-04-14 14:11:40 网址&#xff1a;https://blog.csdn.net/bhbhhyg/article/details/115694774 目录一、如何修改IP&#xff0c;端口号&#xff0c;以及发送的指令二、如何增加或者删除一…

python zlib字符串压缩

2019独角兽企业重金招聘Python工程师标准>>> 在做网络程序时,可以对字符串进行压缩来节省带宽 项目中用到 {"compress": <压缩标记>, "result":[[设备类型.设备ID, 设备名称, 单位ID, 设备功能], ...]} 只做了简单的压缩解压缩,也没crc3…

linux做一个客户端与WemosD1作为服务器的无线通信(局域网通信)

参考&#xff1a;linux做一个客户端与WemosD1作为服务器的无线通信&#xff08;局域网通信&#xff09; 作者&#xff1a;枕上 发布时间&#xff1a;2021-07-19 23:33:44 网址&#xff1a;https://blog.csdn.net/jinchi_boke/article/details/118916896?utm_sourceapp&app…

C语言学习书籍推荐《C语言程序设计 现代方法(第2版)》下载

下载地址&#xff1a;点我 C语言仍然是计算机领域的通用语言之一&#xff0c;但现在的C语言已经和当初的时候大不相同了。本书主要的一个目的就是通过一种“现代方法”来介绍C语言&#xff0c;书中强调标准C&#xff0c;强调软件工程&#xff0c;不再强调“手工优化”。这一版中…

wemosD1_WIFI模块 与 arduino

参考&#xff1a;wemosD1_WIFI模块 与 arduino 作者&#xff1a;枕上 发布时间&#xff1a;2021-07-19 21:49:55 网址&#xff1a;https://blog.csdn.net/jinchi_boke/article/details/118915142 目录作为设备接入wifi&#xff08;STA模式&#xff09;架设Wemos为ftp服务器ardu…