1 / 7
文档名称:

gcc链接脚本学习.doc

格式:doc   页数:7页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

gcc链接脚本学习.doc

上传人:xxj16588 2016/5/5 文件大小:0 KB

下载得到文件列表

gcc链接脚本学习.doc

文档介绍

文档介绍:GCC 的连接脚本学****笔记来源: ChinaUnix 博客日期: 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 就是程序第一条执行的指令,但是,说老实话,我并不理解,因为这里跟我的理解矛盾了,首先,通常情况,系统需要一个初始化的 文件来初始化硬件,也就是 bootloader 的第一阶段了。那么很自然,入口点需要设置在这段代码的第一条指令中,那么正常运行的时候从第一条指令开始运行。所以这里设置了__ENTRY 为入口点,这个在汇编代码中必须得先声明一下为全局,才能用,否则系统找不到。例如: .global __ENTRY 但是问题是,如果我用同样的办法,设置另外一个不是第一条指令的入口点, LD 并没有报错,但是问题来了,生成的文件和刚才设置入口点为__ENTRY 的时候一模一样,这就蒙了,到底这个入口点是怎么回事? 记得以前 ADS 的时候也碰到过 entry point 的问题,下载仿真的时候确实是自动跳转到 entry point 中运行。我想到的可能的原因,第一,生成 elf 文件并不是能直接用在嵌入式平台上面裸跑的,因为我们并没有操作系统,我们不需要 elf 文件头的那些指示信息提供给操作系统,指示系统怎么去加载文件,在嵌入式上面的完全没有那个必要,只需要将实际的代码提取出来,直接运行就 OK ,也就是 objcopy 的操作,所以我觉得,在裸奔的嵌入式系统上面, entry point 是没有意