C语言编译链接加载过程
来源:互联网 发布:人像摄影师 知乎 编辑:程序博客网 时间:2024/06/09 22:16
要把一个c程序变成一个可以在硬件上运行的程序(可执行程序),需要编译链接。编译就是将文本形式的源代码(高级语言写的代码)翻译成机器语言形式的目标文件的过程。链接就是将目标文件(可以是多个)、操作系统启动代码和用到的库文件进行组织形成最终可加载可执行的代码的过程。
过程图解如下:
- 预处理器:将.c 文件转化成 .i文件,使用的gcc命令是:gcc –E,对应于预处理命令cpp;
- 编译器:将.c/.h文件转换成.s文件,使用的gcc命令是:gcc –S,对应于编译命令 cc –S;
- 汇编器:将.s 文件转化成 .o文件,使用的gcc 命令是:gcc –c,对应于汇编命令是 as;
- 链接器:将.o文件转化成可执行程序,使用的gcc 命令是: gcc,对应于链接命令是 ld;
- 加载器:将可执行程序加载到内存并进行执行,loader和ld-linux.so。
其中,目标文件的组成如下图所示:
- .bss:未初始化的全局C变量。在目标文件中这个节不占据实际的空间,它仅仅是一个占位符。目标文件格式区分初始化和未初始化变量是为了空间效率在:在目标文件中,未初始化变量不需要占据任何实际的磁盘空间。
链接:
可执行程序是由各个目标文件经过连接而成。其主体部分依然是代码段、只读数据段和读写数据段,这三个段由各个目标文件(.o)经过“组合”而成。C语言目标文件到可执行程序的连接如下图所示。
加载:加载器把可执行文件从外存加载到内存并进行执行。 Linux中进程运行时的内存映像如下:
加载过程如下:
加载器首先创建如上图所示的内存映像,然后根据段头部表,把目标文件拷贝到内存的数据和代码段中。然后,加载器跳转到程序入口点(即符号_start 的地址),执行启动代码(startup code),启动代码的调用顺序如所示:
0 0
- C语言编译链接加载过程
- c语言编译、链接过程
- C语言 编译 链接 过程
- C语言编译、链接过程
- C语言编译和链接和加载
- C语言编译和链接和加载
- C语言的编译链接过程
- C语言的编译链接过程详解
- C语言的编译链接过程详解
- C语言的编译链接过程详解
- C语言 编译链接过程介绍
- C语言的编译链接过程详解
- 【C语言】编译链接的详细过程
- C语言的编译链接过程
- C语言的编译链接过程详解
- C语言的编译链接过程详解
- C 编译、链接、加载
- C 编译、链接、加载
- MySQL数据库设计好友列表遇到的问题
- sscanf函数和sprintf函数的用法
- 02-0. 整数四则运算(10)
- 黑马程序员——Java面向对象知识点(三)
- SQL提高查询效率【in、not in、between、like】等条件讲述
- C语言编译链接加载过程
- 12716 - GCD XOR
- 记最近几天的面试总结
- 批量复制文件-matlab实现
- 浅谈.Net反射
- 如果不测试,作为程序员的你绝对不知道自己有多么粗心
- Simple guide to forks in GitHub and Git
- TCP连接建立过程中为什么需要“三次握手”
- 关于git的一些错误解决方法。