一、gcc编译
1、gcc编译过程:预处理->编译->汇编->链接
一步编译、连接
gcc无需加选项,直接生成可执行文件,如果是Linux内核中,可能要用交叉编译工具链的gcc。如/opt/toolchains/crosstools-arm-gcc-5.5-linux-4.1-glibc-2.26-binutils-2.28.1/usr/bin/arm-buildroot-linux-gnueabi-
对应gcc代码:gcc hello.c –o hello
1.1、预处理 -E
-E作用:**对头文件和宏定义等进行处理
对应gcc代码:gcc –E hello.c –o hello.i
1.2、编译 -S
-S作用:**检查代码是否有语法错误,并将其翻译成汇编语言
对应gcc代码:gcc –S hello.i –o hello.s
1.3、汇编 -c
-c作用:**将编译阶段生产的汇编.s文件,处理为.o目标文件
对应gcc代码:gcc –c hello.s -o hello.o
1.4、链接
**作用:**将多个.o目标文件组装成最后的可执行文件
对应gcc代码:gcc hello.o -o hello
1.5、运行 ./文件名
对应代码:./文件名
Ps:gcc编译多文件举例gcc -o main main.c sub_add.c unsgn_pow.c -I/include -L. -lmymath
其中,-I ./include 告诉gcc在“./include”目录下搜寻头文件
**-L. **表示要链接的库,库名为libmymath.a,链接时写为-lmymath
ps:大致过程应该是没问题的,直接copy的,有时间在验证整理下。。。。。。。
反汇编
objdump 参数介绍
-d: 将代码段反汇编 反汇编那些应该还有指令机器码的section
-D :与 -d 类似,但反汇编所有section
-S: 将代码段反汇编的同时,将反汇编代码和源代码交替显示,源码编译时需要加-g参数,即需要调试信息
-C: 将C++符号名逆向解析
-l: 反汇编代码中插入源代码的文件名和行号
-j section: 仅反编译所指定的section,可以有多个-j参数来选择多个section
具体用法示例如下:
objdump -dS helloworld.ko > helloworld.s //需要注意,编译时需加-g参数,在Makefile EXTRA_CFLAS中添加
vim hellowrold.s