GNUld链接脚本浅析.pdfVIP

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
GNUld链接脚本浅析

GNU-ld 链接脚本浅析 本文乃转载,原作者的E-mail 是zhanglei@sict.ac.cn. 完成于2005.11.5-2005.11.8 0. Contents 1. 概论 2. 基本概念 3. 脚本格式 4. 简单例子 5. 简单脚本命令 6. 对符号的赋值 7. SECTIONS 命令 8. MEMORY 命令 9. PHDRS 命令 10. VERSION 命令 11. 脚本内的表达式 12. 暗含的连接脚本 1. 概论 每一个链接过程都由链接脚本(linker script, 一般以lds 作为文件的后缀名)控制. 链接脚本主要用于规定如 何把输入文件内的section 放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 但你也可 以用连接命令做一些其他事情. 连接器有个默认的内置连接脚本, 可用ld --verbose 查看. 连接选项-r 和-N 可以影响默认的连接脚本(如何影 响?). -T 选项用以指定自己的链接脚本, 它将代替默认的连接脚本。你也可以使用暗含的连接脚本以增加自定 义的链接命令. 以下没有特殊说明,连接器指的是静态连接器. 2. 基本概念 链接器把一个或多个输入文件合成一个输出文件. 输入文件: 目标文件或链接脚本文件. 输出文件: 目标文件或可执行文件. 目标文件(包括可执行文件)具有固定的格式, 在UNIX 或GNU/Linux 平台下, 一般为 ELF 格式. 若想了解更多, 可参考 UNIX/Linux 平台可执行文件格式分析 有时把输入文件内的section 称为输入section(input section), 把输出文件内的section 称为输出 section(output sectin). 目标文件的每个section 至少包含两个信息: 名字和大小. 大部分section 还包含与它相关联的一块数据, 称 为section contents(section 内容). 一个section 可被标记为“loadable(可加载的)”或“allocatable(可分配的)”. loadable section: 在输出文件运行时, 相应的section 内容将被载入进程地址空间中. allocatable section: 内容为空的section 可被标记为“可分配的”. 在输出文件运行时, 在进程地址空间中空 出大小同section 指定大小的部分. 某些情况下, 这块内存必须被置零. 如果一个section 不是“可加载的”或“可分配的”, 那么该section 通常包含了调试信息. 可用objdump -h 命令 查看相关信息. 每个“可加载的”或“可分配的”输出section 通常包含两个地址: VMA(virtual memory address 虚拟内存地址或 程序地址空间地址)和LMA(load memory address 加载内存地址或进程地址空间地址). 通常VMA 和LMA 是相同的. 在目标文件中, loadable 或allocatable 的输出section 有两种地址: VMA(virtual Memory Address)和LMA(Load Memory Address). VMA 是执行输出文件时section 所在的地址, 而LMA 是加载输出文件时section 所在的地址. 一般而言, 某section 的VMA == LMA. 但在嵌入式系统中, 经常存在加载地址和执行地址不同的情况: 比 如将输出文件加载到开发板的flash 中( 由LMA 指定), 而在运行时将位于flash 中的 输出文件复制到SDRAM 中( 由VMA 指定). 可这样来理解VMA 和LMA, 假设: (1) .data section 对应的VMA 地址是0 该section 内包含了3 个32 位全局变量, i、j 和k, 分别 为1,2,3. (2) .text section 内包含由printf( j=%d , j );程序片段产生的代码. 连接时指定.data section 的VMA 为0 产生的printf 指令是将地址为0处的4 字节内 容作为一个整数

文档评论(0)

wannian118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档