Linux04 LinuxC程序编译链接过程

C/C++编译链接过程

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

Linux04 LinuxC程序编译链接过程_第1张图片

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

(1)处理预编译指令

(2)删除注释

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

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

Linux04 LinuxC程序编译链接过程_第2张图片

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

(1)词法语法解析

(2)代码优化

(3)生成符号

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

Linux04 LinuxC程序编译链接过程_第3张图片

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

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

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

(2)生成符号表

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

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

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

Linux04 LinuxC程序编译链接过程_第4张图片

Linux04 LinuxC程序编译链接过程_第5张图片

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

Linux04 LinuxC程序编译链接过程_第6张图片

main.o变量的存储位置

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

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

Linux04 LinuxC程序编译链接过程_第7张图片

Linux04 LinuxC程序编译链接过程_第8张图片

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

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

(2)符号重定位。

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

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

Linux04 LinuxC程序编译链接过程_第9张图片

 

你可能感兴趣的:(Linux)