Linux04 LinuxC程序编译链接过程

C/C++编译链接过程

文件以main.c为例,main.c内容如图(1)所示

1、第一步预编译后生成main.i文件,其中部分内容如图所示,预编译阶段做的事情有:

(1)处理预编译指令

(2)删除注释

(3)将包含的头文件展开

(生成main.i文件使用的命令为gcc    -E    main.c   -o      main.i)

2、编译后生成main.s文件,其中部分内容如图(3)所示,编译阶段做的事情有:

(1)词法语法解析

(2)代码优化

(3)生成符号

(生成mian.s文件的命令为 gcc    -S    mian.i)

3、汇编后生成main.o文件,其中部分内容如图(4)所示

mian.o文件是可重定位的二进制目标文件,汇编阶段做的事情有:

(1)将汇编指令翻译成二进制

(2)生成符号表

(3)生成section(段(图5)),整个文件都是由段组成的

Linux下二进制文件是ELF格式的,window是.exe

(生成mian.s文件的命令为 gcc    -c    mian.s)

.data段在5c结束,.bss段从5c开始,.comment从5c开始,所以.bss段不存在这里。

main.o变量的存储位置

从main.c内容及段的大小(图7),再使用objdump   -s   main .o查看段内容可得知各个变量的存储位置,见图(8)

.text段存储代码,权限只读,.data和.bss段村春数据可读可写。

4、链接后生成可执行文件

(1)合并各个段,调整段大小及起始位置,合并符号表,符号解析

(2)符号重定位。

使用objdump   -h   run(run是可执行文件)命令进行查看可执行文件中段内容。可执行文件中组织形式如下图

把main函数重定位到0x4804894,程序入口定为这个位置,程序就会从main函数执行

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值