程序的编译过程(转)

预处理、编译、汇编、链接

 

预处理:

  • 删除 #define 并展开宏定义
  • 处理所有的条件预编译指令,如 "#if","#ifdef","#endif"等
  • 插入头文件到 "#include" 处,可以递归方式进行处理
  • 删除所有的注释
  • 添加行号和文件名标识,以便编译时编译器产生调试用的行号信息
  • 保留所有 #pragma 编译指令(编译器需要用)
    命令示例如下:
  • gcc -E hello.c -o hello.i

 

编译:

编译过程就是将预处理后得到的预处理文件(如hello.i)进行词法分析、语法分析、语义分析、优化后,生成汇编代码文件。
经过编译后,得到的汇编代码文件(如,hello.S)还是一个可读的文本文件。
命令示例如下:

  • gcc -S hello.i -o hello.s
  • gcc -S hello.c -o hello.s
 

汇编:

汇编器将编译得到的汇编代码文件转换成机器指令序列。
汇编的结果是一个可重定位目标文件(如,hello.o)其中包含的是不可读的二进制代码。
命令示例如下:

  • gcc -c hello.s -o hello.o
  • gcc -c hello.c -o hello.o
  • as hello.s -o hello.o

链接:

链接过程将多个可重定位目标文件合并以生成可执行目标文件。
命令示例如下:

  • gcc -static -o myproc main.o test.o
  • ld -static -o myproc main.o test.o


作者:N8_xEnn7nA1
链接:https://www.jianshu.com/p/b7e44f749211
来源:简书

posted @   srid  阅读(207)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示