- 1、本文档共72页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第3章 嵌入式编程基础知识;3.1 交叉编译工具选项说明;1、 GCC介绍; GCC将源代码程序转变为可执行程序的过程分为四个相互关联的步骤:预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。;2、gcc的执行过程; $ gcc file.c (针对C语言源程序)
执行完成后,生成默认的可执行文件a.out。
若想指定所生成可执行文件的名称可用–o选项
$ gcc file.c -o myfile; gcc hello.c -o hello
分步执行:
gcc -E hello.c -o hello.i (预处理)
gcc -S hello.i -o hello.a (编译)
gcc -c hello.a -o hello.o (汇编)
gcc hello.o -o hello (链接)
;3.1.1 arm-linux-gcc选项 ; 4、优化选项
-O、-O1:对编译、链接过程进行优化,产生的可执行代码的执行效率可以提高,但是速度会慢一些。
-O2:比-O更好的优化,但过程会更慢。
-O0:不优化。;5、连接器选项
-llibrary:ld链接程序链接函数库中名为library的文件。 库文件的真正名字是“libname.a”。ld链接程序会自动链接常用的函数库文件,对于一些特殊的函数库文件,例如“libm.a”,和用户自定义的函数库文件需要使用该参数。;5、连接器选项;静态库和动态库的区别:
静态库:程序在编译链接时把库的代码链接到可执
行文件中。此时,库的内容是可执行文件
的一部分。缺点:占用磁盘空间。
动态库:链接时不把库的代码写入可执行文件,只
写入整个库函数的入口地址。程序在执行
时凭入口地址找到代码运行。
注意:既有静态库又有动态库时优先使用动态库。
;5、目录选项;3.1.2 arm-linux-ld选项;2、使用连接脚本设置地址
arm-linux-ld -Ttimer.lds –o timer_elf head.o init.o interrupt.o main.o
连接脚本的基本命令是SECTIONS命令,它描述了输出文件中各段、各文件怎么放置。段(Section)是连接脚本的基本单元。
SECTIONS{
. = 0 .text : {*(.text)}
.rodata ALIGN(4) : {*(.rodata)}
.data ALIGN(4) : {*(.data)}
.bss ALIGN(4) : {*(.bss)}
}
;命令格式
secname start ALIGN(align) (NOLOAD) : AT(ldadr)
{ contents } region : phdr =fill
1、secname和contents是必须的,前者用来命名这个段,后者用来确定代码中的什么部分放在这个段中。
2、start是这个段重定位的地址,也称为运行地址。如果代码中有位置相关的指令,程序在运行时,这个段必须放在这个地址上。
3、ALIGN(align):指定段的对齐要求
;3.1.3 arm-linux-objcopy
该选项用来复制一个目标文件到另一个目标文件中,可以使用不同于源文件的格式来输出目的文件,即可以进行格式转换。
arm-linux-objcopy -O binary -S elf_file bin_file
3.1.4 arm-linux-objdump
该选项用于显示二进制文件信息,本书中常用来查看反汇编代码。
arm-linux-objdump -D elf_file dis_file
arm_linux-objdump -D -b binary -m arm bin_file dis_file
;3.2 Makefile介绍; 在Linux中使用make命令来编译程序。
make在执行时, 需要一个命名为Makefile的文件。M
文档评论(0)