Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1106520
  • 博文数量: 143
  • 博客积分: 969
  • 博客等级: 准尉
  • 技术积分: 1765
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-30 12:09
文章分类

全部博文(143)

文章存档

2023年(4)

2021年(2)

2020年(4)

2019年(4)

2018年(33)

2017年(6)

2016年(13)

2014年(7)

2013年(23)

2012年(33)

2011年(14)

我的朋友

分类: C/C++

2011-08-13 12:06:14

编译过程分为4个阶段:预编译、编译、汇编、链接

预编译:
    预编译的命令如下
    $gcc  -E hello.c -o hello.i (-E表示只进行预编译)  预编译生成的文件后缀是.i 
    预编译过程主要处理以#号开头的预编译指令,做以下工作
    1.进行宏替换
    2.处理所有的预编译指令,如#ifdef #if #elif #endif ...
    3.处理#include预编译指令,将被包含文件内存插入到预编译指定的位置
    4.删除所有的注释
    5.添加行号和文件名,以便在编译过程中出现错误和告警能够显示行号
    6.保留#pragram指令,因为编译器要使用他们

编译:
   编译命令如下
   $gcc -S hello.i -o hello.s (-S表示编译)
   编译过程就是把经过预编译处理的文件进一步进行语法分析、语义分析、词法分析、源码优化及优化后生成相应的汇编代码。

   gcc把预编译和编译合并在一起用使用ccl来进行,其实gcc 根据不同参数要求调用预编译和编译处理程序ccl,汇编器as 和链接器ld

汇编:
  汇编命令如下:
  $as hello.s -o hello.o 或者 $gcc -c hello.s -o hello.o 或者$gcc -c hello.c -o hello.o
  汇编是将汇编代码转换成机器可以识别的指令

链接:
  链接命令如下:
  $ld -static hello.o  /lib/*/*.o
  链接就是把所有相关的目标文件(.o)链接起来生成可执行文件。

Linux下可以用以下工具来看可执行文件和obj文件
nm:列出目标文件中的符号。
objdump:显示目标文件中的详细信息。(windows 下用dumpbin.exe)
readelf:显示关于 ELF 目标文件的信息。
  


阅读(1588) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~