链接脚本详解:Rockchip RK3399Pro datasheet V1.1

需积分: 45 50 下载量 120 浏览量 更新于2024-08-06 收藏 534KB PDF 举报
本文档详细介绍了在Linux系统中使用GCC链接器进行链接操作时的一些关键命令和概念,特别是关于链接脚本(linkerscript)的使用。这些脚本用于控制输入文件如何组合成输出文件,并定义输出文件在程序地址空间内的布局。链接脚本涉及到的命令包括设置入口点(ENTRY)、包含其他链接脚本(INCLUDE)、指定输入文件(INPUT)、处理库文件(GROUP)、定义输出文件名(OUTPUT)、设置搜索路径(SEARCH_DIR)、定义文件格式(OUTPUT_FORMAT和TARGET)以及处理符号定义(EXTERN和FORCE_COMMON_ALLOCATION)等。 一、链接脚本基础 链接脚本是链接器工作的蓝图,定义了输入文件如何映射到输出文件,以及输出文件的结构。默认的内置链接脚本可以通过`ld --verbose`查看,而`-T`选项允许用户自定义链接脚本。链接脚本可以包含各种命令,如增加自定义行为。 二、链接脚本命令详解 1. **ENTRY(SYMBOL)**: 用于设置进程执行的入口地址,即第一条用户空间指令的地址。如果未明确指定,ld会按顺序尝试从命令行选项`-e`、链接脚本的`ENTRY`命令、`start`符号、`.text`段的起始位置或默认值0来确定入口点。 2. **INCLUDE**: 类似于C语言的`#include`,用于包含其他链接脚本。搜索路径由`-L`选项指定,最大深度为10。 3. **INPUT(files)**: 指定链接过程的输入文件,可以是目标文件或库文件,ld会按照指定的顺序查找和处理这些文件。 4. **GROUP(files)**: 用于处理需要重复搜索符号定义的多个输入文件,尤其适用于库文件,确保所有未定义的引用都被解析。 5. **OUTPUT(FILENAME)**: 定义输出文件的名称,可以覆盖`-o`选项,但`-o`优先级更高。 6. **SEARCH_DIR(PATH)**: 添加额外的搜索路径供ld查找输入文件,`-L`指定的路径优先级更高。 7. **STARTUP(filename)**: 设置第一个处理的输入文件。 8. **OUTPUT_FORMAT** 和 **TARGET**: 分别用于设置输出和输入文件的BFD格式,支持不同的字节序和格式。 9. **ASSERT(EXPR, MESSAGE)**: 如果表达式`EXPR`不成立,链接过程将终止。 10. **EXTERN(SYMBOL)**: 在输出文件中添加未定义的符号,类似`-u`选项。 11. **FORCE_COMMON_ALLOCATION**: 强制为通用符号(common symbols)分配空间,即使使用了`-r`选项。 三、链接概念 1. 输入文件可能是目标文件或链接脚本文件,输出文件是合并后的目标文件或可执行文件。 2. 目标文件的section包含名字、大小和可能的数据,分为可加载和可分配两类。 3. VMA和LMA表示section在内存中的位置,通常两者相等,但在某些情况下可能不同。 四、链接器操作 链接器的作用是合并输入文件,解决符号引用,分配内存,最终生成可执行文件。默认链接脚本可以被自定义脚本替换,以满足特定的链接需求。通过理解和利用这些链接脚本命令,开发者可以精确地控制程序的构建过程,从而优化性能或满足特定的系统要求。