源程序文件是怎样变成可执行的二进制文件的

下面以linux  x86 下的程序来说明一个源程序是怎样变成一个可执行的二进制文件的。下面是我由一个交换数组中两个元素的值得简单程序来说明

main.c源文件的代码,和swap.c源文件代码分别如下:

1  #include<stdio.h>
2  #define  SIZE 2
3  int buf[SIZE]={1,2};
4  void swap();
5  int main(){
6       printf("before swap buf[0]=%d ,buf[1]=%d\n",buf[0],buf[1]);
7     swap();
8      printf("after swap buf[0]=%d ,buf[1]=%d\n",buf[0],buf[1]);
9  }
extern int buf[];

void swap()
{
     int temp;
     temp=buf[0];
     buf[0]=buf[1]
     buf[1]=temp;
}

通过下面这条命令,就产生了一个可执行二进制文件swap

》gcc mian.c swap.c -o swap

那么这条命令是么样把源程序变成可执行程序的呢?

步骤如下:

1、驱动程序首先调用C预处理器(CPP)把源文件翻译成一个ASCII中间文件mian.i,预处理器会把#include所包含的内容都插入到声明的位置,并且做宏替换,把main.c 文件的第3行     的SIZE替换成2(注意这里只是做简单的文本替换)。

2、接下来驱动程序的C编译器将main.i翻译成汇编语言程序main.s

3、然后驱动程序的汇编器将汇编语言程序main.s 翻译成可重定位的二进制文件main.o

4、最后运行链接器将main.o 与swap.o 以及一些必要的系统目标文件(比如你将调用的printf函数就是printf.o)连接起来变成一个可执行的二进制文件。

时间: 2024-08-03 07:55:57

源程序文件是怎样变成可执行的二进制文件的的相关文章

所经历的大文件数据导出(后台执行,自动生成)

所经历的大文件数据导出(后台执行,自动生成) http://www.cnblogs.com/fanfan259/p/4710019.html 阅读目录 一.前言 二.生成excel文件 三.让程序在后台执行 四.显示文件生成进度 五.下载文件 六.上线后出现的问题 七.相应的后续优化 八.后记 一.前言 记录一下以前做的后台excel格式导出统计信息的功能,也是最近同事问到了相关东西,一时之间竟忘了具体的细节,因此记录一下: 大家知道,excel导出数据的功能,后台几乎是必须功能,一般都是点击后

jQuery插件AjaxFileUpload实现ajax文件上传时老是执行error方法 问题原因

今天在用jQuery插件AjaxFileUpload实现ajax文件上传时,遇到一个问题,如图: 老是执行error,无法执行succes方法,追踪ajaxfileupload.js源码发现: 当执行if(type=="json")    eval("data = "+data);会抛出异常,导致在处理异常的时候将status = "error" 因此一直执行error方法. 上网查询,得知eval函数是用来执行一段js代码,而并不是如我所想的反

【转载】IIS7.5(经典模式)访问静态资源(.css和.js文件)提示:未能执行 URL

IIS7.5(经典模式)静态资源(.css和.js文件)提示:未能执行 URL “/”应用程序中的服务器错误. 未能执行 URL. 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.Web.HttpException: 未能执行 URL. 源错误: 执行当前 Web 请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息. 堆栈跟踪: [HttpExce

PostgreSql那点事(文件读取写入、命令执行的办法)

? 2013/07/9 作者: admin PostgreSql那点事(文件读取写入.命令执行的办法) 今天无意发现了个PostgreSQL环境,线上学习了下,一般的数据注射(读写数据库)差异不大,不做讨论,个人比较关心PostgreSQL的文件读取和命令执行方面. 1,文件读取/写入 PostgreSQL 8.1 以后提供了一组现成的文件操作函数 pg_logdir_ls().pg_ls_dir().pg_file_rename().pg_file_write(). pg_read_file(

expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

20.31 expect脚本同步文件#!/usr/bin/expectset passwd "liang.123"spawn rsync -av [email protected]:/tmp/12.txt /tmp/ 将远程的/tmp/12.txt同步到本地的机器上 expect {"yes/no" { send "yes\r"} 第一次会提示yes或no"password:" { send "$passwd\r&q

crontab定时执行c二进制文件问题

当c源文件编译成功后, 比如AUTOBATCH 直接输入AUTOBATCH就可以执行了,但是写入crontab定时任务中时,就执行不了了,因为crontab是不识别环境变量的,因此 需要把环境变量写入一个sh脚本文件中,然后把AUTOBATCH执行条件也写入该sh中 我写的是AUTOBATCH.sh 内容如下: #! /bin/bash ############################# .  ~/.bash_profile .   /etc/profile ##############

html、css、js文件加载顺序及执行情况

今天看书,看到html,css,js加载执行情况,发现自己并不是真正的了解,网上搜了半小时依然未弄明白,就在这时我找到了让我恍然大悟的一段话,如下: HTML页面加载和解析流程 1. 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件. 2. 浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件. 3. 浏览器又发出CSS文件的请求,服务器返回这个CSS文件. 4. 浏览器继续载入html中&

将js和css文件装入localStorage加速程序执行

原理如下: 一次批量加要加载的文件存入数组,采用Ajax方式异步载入各个文件,然后采用循环方式逐个执行下载下来的Js或者Css文件,如果已经被缓存(localStorage)的则省略下载过程. 由于JS采用的是单线程模式运行,在执行某一个js时会阻塞其它并发的js执行,所以会按顺序执行各个js.在执行完所有的脚本之后,图片会被浏览器接着 加载,所以第一次加载速度略慢,后面就会比较快了.在JQuery Mobile 1.4.5+FireFox/微信浏览器下实测效果不错,IE就被省略了,我主要是要在

Spark2 文件处理和jar包执行

上传数据文件 mkdir -p data/ml/ /home/wangxiao/data/ml/Affairs.txt hadoop fs -mkdir -p /datafile/wangxiao/ hadoop fs -ls / hadoop fs -put /home/wangxiao/data/ml/Affairs.txt /datafile/wangxiao/ hadoop fs -ls -R /datafile hdfs://ns1/datafile/wangxiao/Affairs.