美文网首页
C编译细节

C编译细节

作者: 小乙的乙 | 来源:发表于2019-10-24 17:57 被阅读0次

    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编译细节

          本文链接:https://www.haomeiwen.com/subject/tipdvctx.html