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格式的文件演化而来的. ...
随机推荐
- Beanshell断言
Beanshell断言示例一:通过从数据库查询结果集,和从接口返回中解析json格式的返回内容,比较两者来验证sample请求是否成功 1>先通过JDBC PreProcessor把测试计划中所 ...
- 解决使用C/C++配置ODBC链接使用SQLConnect返回-1
VS中建立空项目使用ODBC连接时,SQLConnect函数总是返回-1,mysql和命令行连接数据库都是没问题的 retcode = SQLConnect(hdbc, (SQLCHAR*)" ...
- C++学习(四十)(C语言部分)之 学生管理系统设计
涉及到的:指针申请内存 结构体数据结构部分排序文件操作 vs2013数据结构 排序 结构体 指针 功能:1.人工录入信息2.删除3.查找4.修改5.全部显示6.文件的读取和保存7.排序 设计:学生信息 ...
- 19/03/15Pyhon笔记
1.快速在python中显示目标的2进制写法 bin(342) "0b101010110" 2.一个二进制位就是一比特(bit) 3.Python2默认无法识别中文,需要加文件头 ...
- django 增加自定义权限的一个博客,讲的很详细
来自 https://www.cnblogs.com/huangxm/p/5770735.html
- websocket 心跳重连
websocket 的基本使用: var ws = new WebSocket(url); ws.onclose = function () { //something reconnect(); // ...
- best practices for designing web api
restful why: meaningful This will be improve efficiency , less documents , just read the code auto g ...
- grafna与饼状图
官网: https://grafana.com/plugins/grafana-piechart-panel/installation https://grafana.com/p ...
- Excel技巧--巧用差异化插入空行
假设有上面这一列,要求在不同城市之间插入一空行相隔开.数据少的时候可以手动操作,但数据量大时,就需要以下技巧: 1.复制该列(除去标题),并粘贴到右侧一列,但上方要隔开一个单元格B2: 2.将这两列选 ...
- 阿里轻量应用服务器 Tomcat 注意的地方 Unsupported major.minor version 52.0(unable to load class
本地编译工程,提交到远程服务其的tomcat上报这个错 Unsupported major.minor version 52.0(unable to load class com.cl.busines ...