自己学驱动10——arm-linux-选项

1、arm-linux-gcc选项

总体选项

(1)-E:预处理之后立即停止,不进行编译。

(2)-S:编译后停止,不进行汇编。

(3)-c:预处理、编译和汇编源文件,但是不作链接,编译器根据源文件生成obj文件。

(4)-o:指定输出文件名。这个选项可以使用在预处理、编译、汇编以及连接中,需要注意的是obj文件后缀为.o,而汇编文件的后缀为.s。

(5)-v:显示制作GCC工具自身时的配置命令:同时显示编译器驱动程序、预处理器、编译器的版本号。

预处理:处理宏定义以及#include语句。

编译:将C等代码翻译为汇编代码。

汇编:将汇编代码翻译为机器码。

连接:将obj文件和系统库文件、obj文件连接起来,最终生成可执行文件。

补充:在编写程序时,有时候查找某个宏定义是非常繁琐的事,可以使用-dM -E选项来帮助查找。

例如:gcc -dM -E test.c | grep -n ‘MAX‘

-dM为预处理器选项,这条语句将编译test.c用到的所有宏捕捉出来作为grep命令的输入,最终在里面搜索MAX。这条语句就能够找出MAX宏定义的行。

警告选项

-Wall:该选项加上基本上打开了所有的需要注意的警告信息,比如没有指定类型的声明、在声明之前就使用的函数、局部变量未使用等。

调试选项

-g:以操作系统的本地格式产生调试信息,GDB能够使用这些调试信息。

优化选项

-O、-O1、-O2、-O3、-O0:不同的优化程度,优化编译的过程将占用较长的时间和较大的内存,不使用-O选项的目的是为了减少编译的开销,使编译结果能够调试、语句是独立的。

连接器选项

(1)object-file-name:如果某些文件没有特别明确的后缀,编译器就认为它们是obj文件或者库文件(连接器根据文件内容区分)。

gcc -o test test.o中的test.o就是这里的object-file-name。

(2)-llibrary:连接名为library的库文件,连接器会搜索名为liblibrary.a的库文件,-l就相当于lib的缩写。指定-l选项和指定文件名的区别是:-l选项用lib和后缀.a将给定的名字展开并且搜索一些目录。

(3)-nostartfiles:不连接系统标准启动文件,标准库文件仍然可以正常使用。

(4)-nostdlib:不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。

(5)-static:在支持动态连接的系统上阻止连接共享库。

(6)-shared:生成一个obj文件,它可以和其他obj文件连接产生可执行文件。

gcc -c -o sub.o sub.c

gcc -shared -o sub.a sub.o

目录选项

(1)-Idir:在头文件的搜索路径中添加dir目录,这个dir目录生效在" "包含的头文件搜索时,而<>包含的头文件还是只在标准库中搜索。

(2)-I-:如果用-I指定的搜索路径位于-I-选项后面,那么<>包含的头文件也会在-I指定的路径中搜索。

(3)-Ldir:在-I选项的搜索路径列表中添加dir目录。

(4)-Bprefix:这个选项指出在何处寻找可执行文件、库文件以及编译器自己的数据文件。

2.arm-linux-ld选项

该选项用于将多个目标文件、库文件连接成可执行文件。-T选项可以直接指定代码段、数据段、bss段的起始地址,也可以用来指定一个连接脚本,在连接脚本中进行更为复杂的地址设置。

-T选项只用于连接Bootloader、内核等“没有底层软件支持”的软件,连接运行于操作系统之上的应用程序时,无需指定-T选项,它们使用默认的方式进行连接。

(1)-Ttext startaddr:其中的startaddr是一个十六进制的起始地址值。

(2)连接脚本:arm-linux-ld -Ttimer.lds -o timer_elf $^

3.arm-linux-objcopy选项

arm-linux-objcopy被用来复制一个目标文件的内容到另一个文件中,可以使用不同于源文件的格式来输出目的文件,即可以进行格式转换。

在编译bootloader、内核时,常用arm-linux-objcopy命令将ELF格式的生成结果转换为二进制文件,例如:

arm-linux-objcopy -o binary -S elf_file bin_file

-o:用来指定输出文件的格式,这里后面跟的是binary。

-S:不从源文件中复制重定位信息和符号信息到目标文件中去。

4.arm-linux-objdump选项

编译、连接、反汇编过程(以link.s举例)

arm-linux-gcc -c -o link.o link.s

arm-linux-ld -Ttext 0x000000000 link.o -o link_elf

arm-linux-objdump -D link_elf > link_dump.dis

-D:反汇编所有段。

时间: 2024-10-26 10:06:52

自己学驱动10——arm-linux-选项的相关文章

自己学驱动17——ARM工作模式和ARM9寄存器

1.ARM体系CPU的7种工作模式 (1)用户模式(usr):ARM处理器正常的程序执行状态. (2)快速中断模式(fiq):用于高速数据传输或通道处理. (3)中断模式(irq):用于通用的中断处理. (4)管理模式(svc):操作系统使用的保护模式. (5)数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护. (6)系统模式(sys):运行具有特权的操作系统任务. (7)未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的

LINUX块设备驱动&lt;10&gt;

第 1 章 +---------------------------------------------------+  |                 写一个块设备驱动                   | +---------------------------------------------------+  | 作者:赵磊                                         |  | email: [email protected]          

ARM Linux 3.x的设备树(Device Tree)【转】

转自:http://blog.csdn.net/21cnbao/article/details/8457546 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] ARM Device Tree起源 Device Tree组成和结构 DTS device tree source DTC device tree compiler Device Tree Blob dtb Binding Bootloader Device Tree引发的BSP和驱动变更 常用OF API 总结

ARM Linux 3.x的设备树(Device Tree)

1.    ARM Device Tree起源 在过去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,相当多数的代码只是在描述板级细节,而这些板级细节对于内核来讲,不过是垃圾,如板上的platform设备.resource.i2c_board_info.spi_board_info以及各种硬件的platform_data.读者有兴趣可以统计下常见的s3c2410.s3c6410等板级目录,代码量在数万行.社区必须改变这种局面,

[转]ARM Linux 3.x Device Tree Usage

此文转自:http://blog.csdn.net/21cnbao/article/details/8457546 更详细内容可以参考官网 Device Tree 官网:http://devicetree.org/Device_Tree_Usage 1.    ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pain in the ass”,引发ARM Li

【转】ARM Linux 3.x的设备树(Device Tree)

原文网址:http://blog.csdn.net/21cnbao/article/details/8457546 1.    ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pain in the ass”,引发ARM Linux社区的地震,随后ARM社区进行了一系列的重大修正.在过去的ARM Linux中,arch/arm/plat-xxx和arch/a

学习ARM+Linux的很好的资料(转)

前段时间做了一个关于ARM9 2440资料的汇总帖,很高兴看到***和CSDN等论坛朋友们的支持和鼓励.当年学单片机的时候datasheet和学习资料基本都是在论坛上找到的,也遇到很多好心的高手朋友,耐心的回答我提出的问题.感激.图报,很简单的想法.希望这次整理的资料帖能对更多的嵌入式爱好者朋友带来帮助! PS:    在此特别感谢 古道热肠 版主把我的帖子加精,给小弟极大鼓舞! 嵌入式入门篇: 什么是嵌入式系统                         http://www.helloa

【转】6.4.6 将驱动编译进Linux内核进行测试

原文网址:http://www.apkbus.com/android-98520-1-1.html 前面几节都是将Linux驱动编译成模块,然后动态装载进行测试.动态装载驱动模块不会随着Android系统的启动而自动装载,因此Android系统每次启动都必须使用insmod或modprobe命令装载Linux驱动模块. 对于嵌入式系统(包括嵌入式Android.嵌入式Linux等)一般都采用将Linux驱动编译进内核的方式.这样做虽然没有动态装载灵活,但Linux驱动会随着Android的启动而

ARM+Linux 嵌入式开发环境搭建

这些都是自个从一月份开始学习ARM+Linux中遇到的问题做的笔记,我觉得很有用,所以分享出来! 因为没有老师教,自己琢磨遇到的问题很多,欢迎交流! -------------------------------------------------------------------------------------------------- 零点漂移队:封尘浪 ------------------------------------------------------------------