首页 > 代码库 > 自己学驱动10——arm-linux-选项

自己学驱动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:反汇编所有段。

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