博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编译简介
阅读量:2351 次
发布时间:2019-05-10

本文共 835 字,大约阅读时间需要 2 分钟。

平台:linux
编译器:GCC
源文件:hello.c
到底GCC在将源文件编程可执行文件的时候做了什么工作呢,首先你得
指导GCC的常用命令吧,GCC在工作的步骤为:
1. 预编译
  命令: gcc -E hello.c -o hello.i
     或者 cpp hello.c > hello.i
        然后你就可以gedit hello.i来打开它。好好比较下两者
    的内容
  主要作用:1. 展开所有的#define宏,就是在用到宏的地方进行替换。
         同时删除该宏
      2. 处理所有的条件编译选项,包括#if 等等
      3. 处理所有的#include指令,直接在包含的位置展开文件
         如果被包含的文件里面还包含其它的文件,那么递归展开
         4. 删除所有的注释
      5. 添加行号和文件名注释,以便在编译的时候输出信息
      6. 保留#pragma宏,因为编译器需要使用
2. 编译
  命令:gcc -S hello.i -o hello.s
     或者 调用你的gcc目录下的cc1程序,gcc目录一般在/usr/lib/下
       cc1 hello.i > hello.s
       然后你还是可以gedit hello.s来打开它,看看里面汇编的代码
  主要作用:1. 编译的过程是词法分析,语法分析,语义分析,目标代码
         生成,主要是用来生成汇编代码。好好看看编译原理方面
         的内容即可。
3. 汇编
  命令:gcc -c hello.s -o hello.o
     或者 as hello.s -o hello.o
       然后生成了常见的.o文件了,再怎么办?gedit打不开的,因为
          事实上.o文件已经算是一种可执行文件了,所以可以采用工具
    objdump ,readelf来进行查看。具体工具使用后面会说到。
  主要作用:1. 翻译汇编代码到目标代码,然后生成中间文件
    
4. 链接
  命令:ld
      详细的命令比较复杂,链接是是程序运行过程中最复杂的一个部分了
      目的就是将不同的.o文件或者库文件链接在一起,形成一个真正可执
      行的文件。

转载地址:http://yshvb.baihongyu.com/

你可能感兴趣的文章
JavaScript 闭包 详解
查看>>
Oracle 基础知识 详解
查看>>
JVM 命令参数 详解
查看>>
Java 产生随机数 详解
查看>>
Linux 后台执行命令 详解
查看>>
SpringBoot @ConfigurationProperties参数绑定 详解
查看>>
Nginx+Lua 开发的 hello world 案例 详解
查看>>
OpenResty 基础知识 和 Linux部署 详解
查看>>
Nginx+Lua 定制流量分发策略案例
查看>>
Nginx+Lua 从Nginx和Redis缓存获取数据案例 详解
查看>>
热备份、温备份、冷备份 详解
查看>>
分布式重建缓存的并发冲突 详解
查看>>
MapStruct 详解
查看>>
测试发现commons-dbcp2没有缓存Connection对象
查看>>
转载一篇关于《Java动态编译与性能测量》的文章
查看>>
转载 《JUC同步器框架(AQS框架)》论文原文翻译
查看>>
Java 非阻塞式的高伸缩性IO通信 学习demo
查看>>
从GCC编译器来学习各类C标准及编译器使用
查看>>
编译器、操作系统、CPU相关的预处理宏定义
查看>>
C语言注意事项——switch语句
查看>>