gcc链接脚本学习gcc链接脚本学习.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
gcc链接脚本学习gcc链接脚本学习

GCC的连接脚本学习笔记 来源: ChinaUnix博客  日期: 2009.04.29 14:26 (共有条评论)?我要评论 ? 连接脚本将我整整蒙了1天零一个上午,做了很多实验,看了人家不少例子代码 勉强能驾驭了,让linker按照我想要的来处理,做个笔记。 1,什么叫输入段,什么叫输出段 不知道怎么回事,我对GCC系列的输入和输出两个单词总是进入思维死角,很简单 就是 input section 和 output section,这里不是说翻译的问题,我觉得是一种 思考的方式的问题。 我的问题就是:既然叫输入端,那输入什么?同理,输出的是什么?不知道其他人 不会不理解这个问题,我自己的话是理解了不少时间了 -v- 所谓的输出段,是指生成的文件,例如 elf 中的每个段 所谓的输入段,是指连接的时候提供LD的所有目标文件(OBJ)中的段。 2,lma 和 vma lma =??load memory address vma =??vitual memory address 如果有研究过ADS的估计有印象,那里有个 RO BASE 和 RW BASE 和 ZI BASE,也 就是说,lma 是装载地址,vma 是运行地址,想搞清楚这两个问题,可以阅读一下 《ARM学习报告(杜云海)》作者写的很好,将这个问题分析的很透澈。lma 和vma 只是GCC的叫法而已,其实原理是一样的。 3,两个基本架构 OUTPUT_FORMAT(elf32-littlearm, elf32-bigarm, ? ?? ?? ???elf32-littlearm) OUTPUT_ARCH(arm) 一句话,照抄......因为我们没有修改的余地,都是系统默认的关键字。第一句 指示系统可以有生成两种格式,默认是 elf32-arm,端格式是 little endian 4,ENTRY(__ENTRY) 指定入口点,LD的手册说,ENTRY POINT 就是程序第一条执行的指令,但是,说老 实话,我并不理解,因为这里跟我的理解矛盾了,首先,通常情况,系统需要一个 初始化的 STARTUP.S文件来初始化硬件,也就是 bootloader的第一阶段了。那么 很自然,入口点需要设置在这段代码的第一条指令中,那么正常运行的时候从第一 条指令开始运行。所以这里设置了__ENTRY为入口点,这个在汇编代码中必须得先 声明一下为全局,才能用,否则系统找不到。例如: .global __ENTRY 但是问题是,如果我用同样的办法,设置另外一个不是第一条指令的入口点,LD并 没有报错,但是问题来了,生成的文件和刚才设置入口点为 __ENTRY 的时候一模一 样,这就蒙了,到底这个入口点是怎么回事? 记得以前ADS的时候也碰到过 entry point的问题,下载仿真的时候确实是自动跳转 到 entry point中运行。 我想到的可能的原因,第一,生成 elf 文件并不是能直接用在嵌入式平台上面裸跑 的,因为我们并没有操作系统,我们不需要elf文件头的那些指示信息提供给操作 系统,指示系统怎么去加载文件,在嵌入式上面的完全没有那个必要,只需要将实 际的代码提取出来,直接运行就OK,也就是 objcopy的操作,所以我觉得,在裸奔 的嵌入式系统上面,entry point是没有意义的,只需要指向整个代码最开始的指 令就OK了。 暂时我还是不能清晰的理解这个东西。先放下。以后碰到问题再分析。 5,一个输出段的标准格式 section [address] [(type)] : [AT(lma)] ??{ ? ? output-section-command ? ? output-section-command ? ? ... ??} [region] [ATlma_region] [:phdr :phdr ...] [=fillexp] 前面也说了,所谓的输出段是指最终生成的文件里面的段,所以一个输出段就可以 理解为最终文件里面的一个块,那么多个块合起来就是一个完成文件了。 而每个小块又分别有什么文件来组成呢?那就是输入段了。 我自己实际用到有下面的一些,其他暂时不会用。 section_name??vma : AT(lma) ??{ ? ? output-section-command ? ? output-section-command ? ? ... ??} [ATlma_region] section_name 根据ld手册说是有个确定的名字,其他没啥,自己添加一些新段也是 可以的。 默认的4个段是必须有的 .text 代码 .rodata 常量,例如字符串什么的 .data 初始化的全局变量 .bss??没有初始化的全局变量 其实没什么,可以说,都

您可能关注的文档

文档评论(0)

vshoulrengb3 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档