arm-linux-ld命令.pdf

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

我们对每个c 或者汇编文件进行单独编译,但是不去连接,生成很多.o 的文件,这些.o文 件首先是分散的,我们首先要考虑的如何组合起来;其次,这些.o文件存在相互调用的关系; 再者,我们最后生成的bin 文件是要在硬件中 运行的,每一部分放在什么地址都要有仔细 的说明。我觉得在写makefile 的时候,最为重要的就是ld 的理解,下面说说我的经验: 首先,要确定我们的程序用没有用到标准的c库,或者一些系统的库文件,这些一般是在操 作系统之上开发要注意的问题,这里并不多说,熟悉在 Linux 编程的人,基本上都会用ld 命令;这里,我们从头开始,直接进行汇编语言的连接。 我们写一个汇编程序,控制GPIO,从而控制外接的LED,代码如下; .text .global _start _start: LDR R0,=0@GPBCON 寄存器 MOV R1,#0 strR1,[R0] LDR R0,=0 MOV R1,#0 STRR1,[R0] MAIN_LOOP: B MAIN_LOOP 代码很简单,就是一个对io 口进行设置然后写数据。我们看它是如何编译的,注意我们这 里使用的不是 arm-linux-gcc 而是 arm-elf- gcc,二者之间没有什么比较大的区别, arm-linux-gcc可能包含更多的库文件,在命令行的编译上面是没有区别。我们来看是如何编 译的: arm-elf-gcc-g-c-oled_On.o led_On.s 首先纯编译不连接 arm-elf-ld -Ttext0-gled_On.o-oled_on_elf 用Ttext 指明我们程序存储的地方,这里生成的是elf 文件,还不是我们真正的bin, 但是可以借助一些工具可以进行调试。然后: arm-elf-objcopy-O binary -Sled_on_elfled_on.bin 生成bin 文件。 -T选项是ld 命令中比较重要的一个选项,可以用它直接指明代码的代码段、数据段、博士 生、 段,对于复杂的连接,可以专门写一个脚本来告诉编译器如何连接。 -Ttext addr -Tdata addr -Tbss addr arm-elf-ld -Ttext0-gled_On.o-o led_on_elf ,运行地址为0由于没 有指明数据段和bss,他们会默认的依次放在后面。相同的代码 不同的Ttext,你可以对比 一下他们之间会变的差异,ld 会自动调整跳转的地址。 第二个概念:section,section 可以理解成一块,例如像c 里面的一个子函数,就是一个section, 链接器ld 把object文件中 的每个section 都作为一个整体,为其分配运行的地址(memory layout),这个过程就是重定位(relocation);最后把所有目标文件合并为一个目标文件。 链接通过一个linker script来控制,这个脚本描述了输入文件的sections 到输出文件的映射, 以及输出文件的memory layout。 因此,linker 总会使用一个linker script,如果不特别指定,则使用默认的script;可以使用‘-T’ 命令行选项来指定一个linker script。 *映像文件的输入段与输出段 linker 把多个输入文件合并为一个输出文件。输出文件和输入文件都是目标文件(object file), 输出文件通常被称为可执行文件(executable)。 每个目标文件都有一系列section,输入文件的section 称为input section,输出文件的section 则称为output section。 一 个section 可以是loadable 的,即输出文件运行时需要将这样的section 加载到memory(类 似于RORW段);也可以是 allocatable 的,这样的section 没有任何内容,某些时候用0对 相应的 memory 区域进行初始化(类似于 ZI 段);如果一个 section 既非loadable 也非 allocatable,则它通常包含的是调试信息。 每个 loadable 或 allocatable 的 output section 都有两个地址,一是 VMA(vi

文档评论(0)

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

教师资格证持证人

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

领域认证该用户于2024年04月12日上传了教师资格证

1亿VIP精品文档

相关文档