教学网站建设计划,电子商务网站与建设实践报告,app开发哪家强,百度品牌专区目录
一、什么是链接脚本#xff1f;
二、链接脚本的基本语法格式
1、常用命令
2、内置变量
三、链接脚本的简单案例 一、什么是链接脚本#xff1f;
一段程序的编译需要经历四个阶段#xff08;预处理—编译—汇编—链接#xff09;#xff0c;而链接脚本管理的就是…目录
一、什么是链接脚本
二、链接脚本的基本语法格式
1、常用命令
2、内置变量
三、链接脚本的简单案例 一、什么是链接脚本
一段程序的编译需要经历四个阶段预处理—编译—汇编—链接而链接脚本管理的就是其中的“链接”阶段。一段程序往往包含了变量、常量、数据代码逻辑他们属于不同的段
.bss段一个全局变量没有被初始化 或者 被初始化为0。.data段一个全局变量非const类型已被初始化初始值必须是非0值.rodata段read only data如字符串常量、const修饰的变量都会被保存到该段.text段程序代码段更进一步讲是存放处理器的机器指令。函数代码逻辑都会保存到该段 链接脚本决定了一个可执行程序的各个段的存储位置相当于要给程序中的数据和变量进行分类并确定每一类的存放位置。
注意实际涉及的段远不止这四个这里只是列举了我们所熟知的段 二、链接脚本的基本语法格式
1、常用命令
命令说明举例ENTRY(symbol) 这里的symbol指的是符号表中的符号。汇编阶段会生成符号表符号表中的符号包括静态变量、全局变量、函数名等。 这是将某一个符号symbol的值设为入口地址进程执行的第一条用户空间指令就会从此处开始执行 ENTRY_startOUTPUT_ARCH设置输出文件的目标平台架构OUTPUT_ARCH(arm)SECTIONS告诉链接器如何把输入文件映射到内存指定位置即设置各个段的位置 SECTIONS { ... }
更多命令参考lds文件命令 2、内置变量
.bss表示bss段
.data表示data段
.rodata表示rodata段
.text表示text段
. 定位器暂不解释下面示例说明的时候会更有体会 三、链接脚本的简单案例
以下面这个链接脚本为例 1、第 2 行
. 表示定位器你可以理解为一个指针此时指针指向的是 0x87800000的位置。 2、第 3 - 5 行
.text 开头说明这里要设置的是 text 段相关的内容了。每一个文件都可能存在 .text段、.data 段 相关的内容* 是通配符表示所有文件*(.text) 表示每个文件与 .text 段相关的内容。
这里想表达的意思是把 obj 下的 start.o 和 其他所有输入文件与 .text 段相关的内容统一保存到DDR的 .text 段。 3、第 8 行
如果这里没有 ALIGN(4)根据.text 的理解就是所有输入文件和 .rodata 段相关的内容都保存到DDR的 .rodata 段。
ALIGN(4) 的作用是地址对齐即DDR 的 .rodata 段的起始地址必须是 4 的整数倍。如果没有ALIGN(4)rodata段是紧跟在 .text 的后面的。假设 .text 段的大小是 0x1001
.rodata :
{*(.rodata)
} 如果加了 ALIGN(4)此时 .rodata 的起始地址必须是 4 的整数倍。这么做的目的是提升内存访问效率内存在访问该段的时候没必要每个地址都去查只要查 4 的整数倍的地址即可。
// 也可以是 ALIGN(8)
.rodata ALIGN(4) :
{*(.rodata)
} 4、第 9 行
参考第 8 行的解析 5、第 10 - 12 行
__bss_start 和 __bss_end 并非内置变量而是自定义符号以便用于保存 bss 段的起始位置和结束地址。前面提到 . 表示定位器即便我们中间没有去手动管理它也会自动跟随我们的操作进行移动。第 11 行可以参考第 8 行的解析。 问为什么需要保存 .bss 段的起始位置和结束位置 答 .bss 段是保存了被定义但是没有被初始化的变量我们需要手动对 .bss 段的变量清零为此我们就需要知道 .bss 段的起始位置和结束地址以便于之后在 C文件或者汇编文件中直接引用。