C编译细节

Linux C编译细节

编译工具一般隐藏了编译的细节,c源文件到可执行文件,一般经过4个过程

  1. 预编译
  • 翻译 #define #if 等预编译指令 展开宏
  • 删除注释
  • 添加行好和文件标识 便于报错标识
  • 保留 #pragma编译指令
  • 生成.i 文件
gcc -E hello.c -o hello.i
  1. 编译 预编译文件生成汇编代码 生成.s 文件
gcc -S hello.i -o hello.s
  1. 汇编 汇编文件转化为机器可执行的指令(目标文件.o)
as hello.s -o hello.o
#或者
gcc -c hello.c -o hello.o 
# 从c代码一步到 可执行指令
  1. 连接 可执行的指令连接成可执行文件 .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

运行效果

C编译细节_第1张图片
效果

你可能感兴趣的:(C编译细节)