C程序编译过程

  1. gcc编译C代码会有四个阶段:

    预处理:将C代码中的头文件和宏进行处理

    编译:把预处理好的c代码生成与机器相关的as汇编代码  .s

    汇编:把汇编代码转化成机器指令,并以特定的二进制格式输出保存在  .o这样的目标文件中

    链接:链接指定的动态库,把与程序相关的文件组合链接在一起,生成可执行的映像文件。


  2. 流程图:


参考阅读:http://blog.csdn.net/zzxian/article/details/16820035


3. c程序分析

 gcc -E hello.c -o hello.i        //预处理
 gcc -S hello.i -o hello.s        //编译
 gcc -c hello.s -o hello2.o      //汇编

 gcc hello.o -o hello                //链接


Attention:直接输出就使用  gcc -S hello.i -o - 即可,加优化选项就是-O1


readelf -h hello.o        //可以查看目标文件头文件的内容,  定义在"/usr/include/linux/elf.h"

objdump -h hello.o      //命令只是显示关键段,省略了辅助性的段。”readelf -S”命令显示的更完整

readelf -S hello.o        //命令可以显示所有段(bss data text)的内容

nm -A hello.o              //可以显示所有变量在哪个区域

weiwei@weiwei-ubuntu:~/tools$ nm -A hello2.o
hello2.o:0000000000000004 C aaaaa
hello2.o:0000000000000000 b bbbbb
hello2.o:0000000000000008 b ddddd.2061
hello2.o:0000000000000004 C eeeaaaaa
hello2.o:0000000000000004 b eeeebbb
hello2.o:0000000000000028 C exec1
hello2.o:0000000000000000 T main
hello2.o:                 U printf
hello2.o:                 U puts
第二列:指明符号值(地址)

第三列:符号类型:b--->bss c--->common t--->test(所有的可以见Linux 内核完全剖析 P71)

第四列:对应的符号名称


int aaa = 1;
const int bbb = 1;
int ccc;
const int ddd;
int eee = 0;
const int fff = 0;
a.out:0000000000601020 D aaa
a.out:00000000004005fc R bbb
a.out:0000000000601040 B ccc
a.out:000000000060103c B ddd
a.out:0000000000601038 B eee
a.out:0000000000400600 R fff

全局变量:

B--->bss bss是指那些没有初始化的和初始化为0的全局变量bss类型的全局变量只占运行时的内存空间,而不占文件空间

R---->rodata ro代表read only,即只读数据(const),运行时直接读取ROM内存,无需要加载到RAM内存中

D--->data data指那些初始化过(非零)的非const的全局变量data类型的全局变量是即占文件空间,又占用运行时内存空间的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值