C程序的编译与链接
编译器驱动程序
编译器驱动程序可以在用户需要时调用语言预处理器、编译器、汇编器和链接器。
例如使用GNU编译系统,我们需要使用如下命令来调用GCC驱动程序:
gcc -o main main.c
编译过程
一个C语言程序从源文件到可执行文件经过如下步骤:
- 驱动程序运行C预处理器(cpp),它将main.c翻译成一个ASCII码的中间文件main.i。预处理指令以#开头标识。
gcc -E -o main.i main.c
在预处理阶段进行的工作包括:
* 文件包含
* 宏替换
* 条件编译指令
* 其他预处理指令
- 接下来,驱动程序运行C编译器(cc1)它将main.i翻译成一个ASCII汇编语言文件main.s
gcc -S -o main.s main.i
- 然后,驱动程序运行汇编器(as),它将main.s翻译成一个可重定位目标文件main.o
gcc -c -o main.o main.s
- 最后,驱动程序运行链接程序(ld),将经前面步骤生成的多个可重定位目标文件以及一些系统必要的系统目标文件组合起来,创建一个可执行目标文件。
gcc -o main main.o
(这里均使用gcc指令完成,使用单独的程序例如ld则需要自己手动链接大量系统目标文件)
静态链接
像unix ld程序这样的静态链接器以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。
输入的可重定位目标文件由各种不同的代码和数据节组成。
链接器的两个主要任务:
- 符号解析
目的是将每个符号引用刚好和一个符号定义联系起来。 - 重定位
编译器和汇编器生成地址从0开始的代码和数据节。链接器通过把每个符号定义与存储器位置联系起来,然后修改所有对这些符号的引用,使得它们指向这个存储器位置,从而重定位这些节
C程序的编译与链接的更多相关文章
- 窥探C语言程序的编译、链接与.h文件
概述 C语言程序从源文件经过编译.链接生成可执行文件.那么编译与链接分别做了什么? 开发中为什么使用.h编写函数的声明?接下来使用案例说清楚为什么这样编写代码. C语言程序的编译和链接 C语言程序从源 ...
- C/C++程序从编译到链接的过程
编译器是一个神奇的东西,它能够将我们所编写的高级语言源代码翻译成机器可识别的语言(二进制代码),并让程序按照我们的意图按步执行.那么,从编写源文件代码到可执行文件,到底分为几步呢?这个过程可以总结为以 ...
- Linux中程序的编译和链接过程
1.从源码到可执行程序的步骤:预编译.编译.链接.strip 预编译:预编译器执行.譬如C中的宏定义就是由预编译器处理,注释等也是由预编译器处理的. 编译: 编译器来执行.把源码.c .S编程机器码. ...
- 原创 C++应用程序在Windows下的编译、链接:第一部分 概述
本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 cl.exe是windows平台下的编译器,link.ex ...
- C++应用程序在Windows下的编译、链接(一)概述
C++应用程序在Windows下的编译.链接(一)概述 本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 c ...
- 13_传智播客iOS视频教程_OC程序的编译链接
C程序的编译.链接.执行怎么来的?在.C文件里面写上符合C语言部分的源代码.OC也是一样的.记住:OC程序的后缀名是.m. 为什么要链接?第一个.o的目标文件里面它启动不了.因为它没有启动代码我们要加 ...
- 关于一个程序的编译过程 zkjg面试
http://blog.csdn.net/gengyichao/article/details/6544266 一 以下是C程序一般的编译过程: 从图中看到: 将编写的一个c程序(源代码 )转换成可以 ...
- 原创 C++应用程序在Windows下的编译、链接:第三部分 静态链接(二)
3.5.2动态链接库的创建 3.5.2.1动态链接库的创建流程 动态链接库的创建流程如下图所示: 在系统设计阶段,主要的设计内容包括:类结构的设计以及功能类之间的关系,动态链接库的接口.在动态链接库中 ...
- 原创 C++应用程序在Windows下的编译、链接:第二部分COFF/PE文件结构
2.1概述 在windows操作系统下,可执行文件的存储格式是PE格式:在Linux操作系统下,可执行文件的存储格式的WLF格式.它们都是COFF格式文件的变种,都是从COFF格式的文件演化而来的. ...
随机推荐
- Yii2事件驱动的运行机制
最近一段时间正在作个一个项目,这个项目会系统逻辑比较复杂,使用PHP Yii2,使用事件驱动机制进行研发,下面就最近研究事件驱动机制的使用作以下总结: 流程如下: 1.要创建含有事件注入的类,一般这样 ...
- 关于if...else语句的小注意
if...else是一个使用非常频繁的条件语句,在条件满足时执行if下的代码,条件不满足时执行else下的代码.但在使用过程中会由于粗心犯一些错误. 比如我想要把性别的默认值设置为“男”,应该进行如下 ...
- Ubuntu 下解压tar.xz方法
参考地址:https://www.cnblogs.com/baby123/p/6611169.html
- C语言编程知识点
(1)预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题):#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 1) #defin ...
- docker 进程监控 Dumb-Init进程信号处理 --转自https://blog.csdn.net/tiger435/article/details/54971929
随着docker及Kubernetes技术发展的越来越成熟稳定,越来越多的公司开始将docker用于生产环境的部署,相比起物理机上直接部署,多了一层docker容器的环境,这就带来一个问题:进程信号接 ...
- VS2017 对com组件调用返回错误hresult e_fail
解决步骤如下: 第一步: 第二步:进入VS2017 安装目录,如下(路径仅供参考) 执行:gacutil -i Microsoft.VisualStudio.Shell.Interop.11.0.dl ...
- 【转载】robocopy的用法
经常进行文件管理操作的朋友们,不满意于Windows系统内置的复制功能,因为它太龟速了.于是大家就使用FastCopy.TeraCopy之类的软件来加速复制,但是你是否知道Windows 7已经内置快 ...
- 学习笔记之Problem Solving with Algorithms and Data Structures using Python
Problem Solving with Algorithms and Data Structures using Python — Problem Solving with Algorithms a ...
- 涂抹mysql笔记-管理mysql库和表
mysql的表对象是基于库维护的,也就是说它属于某个库,不管对象是由谁创建的,只要库在表就在.这根Oracle不同Oracle中的表对象是基于用户的.属于创建改对象的用户所有,用户在表就在.mysql ...
- 01-简单编写http服务器
package com.day3; import java.io.IOException; import java.io.InputStream; import java.net.ServerSock ...