Linux C编译细节
编译工具一般隐藏了编译的细节,c源文件到可执行文件,一般经过4个过程
- 预编译
- 翻译 #define #if 等预编译指令 展开宏
- 删除注释
- 添加行好和文件标识 便于报错标识
- 保留 #pragma编译指令
- 生成.i 文件
gcc -E hello.c -o hello.i
- 编译 预编译文件生成汇编代码 生成.s 文件
gcc -S hello.i -o hello.s
- 汇编 汇编文件转化为机器可执行的指令(目标文件.o)
as hello.s -o hello.o
#或者
gcc -c hello.c -o hello.o
# 从c代码一步到 可执行指令
- 连接 可执行的指令连接成可执行文件 .a 文件
ld -demangle -lto_library libLTO.dylib -no_deduplicate -dynamic -arch x86_64 -macosx_version_min 10.13.0 -o a.out hello.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/lib/darwin/libclang_rt.osx.a
# 大致分析
ld -demangle -lto_library libLTO.dylib #动态库
-no_deduplicate -dynamic -arch x86_64 #架构
-macosx_version_min 10.13.0 #最低系统版本
-o a.out hello.o #输入输出文件
-lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/lib/darwin/libclang_rt.osx.a #系统 版本可能不一样
写个Makefile玩一下
.PHONY:clean
# 链接 机器链接成可执行文件
main: hello.o hello.s hello.i
gcc hello.o -o a.out
# 预编译 生成预编译文件
pre:
gcc -E hello.c -o hello.i
#汇编 汇编代码生成机器指令(二进制)
asem:
gcc -c hello.s -o hello.o
# 编译 生成汇编文件
comp:
gcc -S hello.i -o hello.s
# clean 文件
clean:
rm -rf *.o a.out *.s *.I