linux平台的c代码编译,一般分四步:
1.预处理 gcc test.c -E -o test.i (头文件展开,宏替换,注释清除,条件变异处理等操作)
2. 编译 gcc test.i -S -o test.s (检查语法,生成汇编文件)
3. 汇编 gcc test.s -c -o test.o (生成电脑识别的二进制文件)
4. 链接 gcc test.o -o test (使用连接器ld链接一些列库文件从而生成平台可执行文件)
常用的编译命令:
-
gcc 编译器 eg: gcc test.c -E -o test.i
-
gdb 代码调试工具 可设置断点和监控参数来调试程序,很强大。 eg: gdb hello
-
ld 链接器 通常编译的时候在后天通过 -L来链接, 优先级从左到右,查找方式为从右向左 eg: gcc -c test.c -0 test -Llib.a -Llib.b
-
objcopy 目标文件拷贝,可用于源文件格式转换 eg: objcopy -O binary -S test.elf test.bin
-
addr2line 将地址转化为固定文件名中的函数中的某行, 一般用于段死后找位置 eg: addr2line 0x632689215 -e test
-
readelf 查看elf文件和.a .so库文件的信息,通过一些列参数可以到文件的信息 eg: readelf -a test
-
ar 创建、修改库 eg:ar -rcs test.a test.o hello.o 生成test.a 静态库 ar test.a math.o
-
objdump 反汇编文件查看器 可以查看二进制文件的相关信息,将二进制文件转化为汇编文件,从而能了解代码如何运行。 eg:objdump -S hello.o
-
size 查看目标文件的各数据段信息 eg: size hello
-
nm names 的简称,列出目标文件或可执行文件中的符号 eg: nm hello.o / nm hello
-
strip 将可执行文件和库文件瘦身,去掉其符号,使其变小 eg: strip hello 瘦身前后, hello 文件大小由 8.2K 变为 6.1K
-
gprof 可测试工程中各个函数的运行事件,通过指定-pg参数编译,
-
as 汇编语言编译器,将汇编代码生成二进制 eg: as -l hello.s -o hello.o
-
ldd 查看可执行文件依赖那些库 eg: ldd test
-
strings 打印文件中的可打印的字符 eg: strings hello eg2: strings -f “*.so” | grep “xxxxxx”, 在库中查找
-
c++ 编译c++ 代码, gcc -c++ hello.c -0 hello
-
g++ 编译c++ 代码, g++ hello.cpp -0 hello.exe
-
ranlib 更新库的有效符号表, 用ar命令更新库之后,需要对库中的._SYMDEF符号表进行更新,否则会报错。