-pipe 利用管道优化编译过程
-M 递归打印文件所包含的头文件
-MM 打印头文件不递归
-E 预处理
-S 编译成汇编代码
-c 汇编成机器码
-v 查看执行细节
-g 增加调试信息
-o 指定输出文件名
-dM-E 查找某个宏定义
-Wall 打开所有警告
-Werror 所有警告认为是错误
-O0 不优化
-O/-O1
-O2
-O3
-llib 链接库
-L
-nostartfiles 不链接启动文件 在制作BootLoader 内核时使用
-nostdlib
-nostdinc
-static 在支持动态库的机器上,禁止链接动态库而采用静态方式链接
-shared 制作动态库
-Xlinker option 将参数传给连接器。gcc无法识别,故需选项参数分别制定
-Xlinker option
-Xlinker arg1
-Xlinker arg2
-Wl,option 把选项传给连接器 多个参数间用逗号隔开
-u symbol 使链接器认为取消了symbol符号的定义,从而链接器库模块以取得定义
-Idir 制定头文件搜索路径 -Idir1 -I- -Idir2 dir1只能搜索 #include“file” dir2可以搜索任意#include
-L 指定库文件搜索路径
-Bprefix 指定gcc所调用用具的前缀 ,未找到时,可使用GCC_EXEC_PREFIX环境变量
ld,arm-linux
-Ttext startaddr 指定代码段起始地址
-Tdata dataaddr 指定数据段起始地址
-T bss bssaddr 指定bss段起始地址
-m32 64位机器上产生32位代码
$@ 目标
$< 第一个依赖
$^ 所有依赖
-T指定链接脚本
链接脚本完整格式
SECTIONS {
…
secname start ALIGN(align) (NOLOAD) : AT(ldadr)
{ contents } >region :phdr =fill
…
}
secname 段名
start 重定位地址 对于位置相关代码,重定位地址必须为代码内实际地址
ALIGN(align) 起始地址对齐
(NOLOAD)运行时不需要加载
AT(ldadr)
指定此段位于映像文件中的地址,不指定时默认为运行地址
{ contents } 确定obj文件中哪些内容存入本段
arm-linux-objcopy 被用来拷贝一个目标文件的内容到另一个文件中, 可以使用不同于源文件的格式来输出目的文件,即可以进行格式转换
input-file outfile指定输入输出文件名
-I 指定输入格式
-O 指定输出格式
-F 指定输入=输出格式
-R sectionname 删掉sectionname段
-S 删除重定位信息和符号信息
-g 删除调试符号
arm-linux-objdump
-b 指定目标码格式
-d 反汇编可执行段
-D 反汇编所有段
-EB 指定大端字节序 -EL指定小段字节序
-f 显示文件的整体头部摘要信息
-h 显示目标文件各个段的头部摘要信息
-i 显示支持的目标文件格式和cpu架构
-j name 仅显示指定section的信息
-m machine 当待反汇编文件未指定架构信息时 手动指定
eg1 arm-linux-objdump -D elf_file > dis_file
eg2 arm-linux-objdump -D -b binary -m arm bin_file > dis_file
arm-linux-objcopy
#define fastcall __attribute__((regparm(3)))
用于修饰函数 表示从寄存器获取参数
#define asmlinkage __attribute__((regparm(0)))
用于修饰函数 表示从堆栈获取参数
#define __weak __attribute__((weak))
用于修饰函数弱符号类型
遇强则强 无强弱顶