• 1707

许多初学者都有比较大的疑惑,电脑是怎么识别我们写的代码并进行处理的呢?其实这个问题对我们初学者来说是很重要的,只有了解机器的运行原理,我们才能真正地学号留下。那么今天我就以此为题为大家略讲一二,有错误的地方希望大家多多指教。

一般来说我们编译一个程序都是直接通过gedit  project.c编辑代码,然后通过gcc project.c编译代码,最后通过./a.out执行,但是今天我们将其分解为四个步骤:

分析编译的过程  ---->  获得机器码

1、预处理: gcc -E project.c -o project.i     //生成预处理文件 project.i 宏展开 包含展开
2、编译:   gcc -S project.i -o project.S     //生成汇编文件 project.S  //高级语言转成低级语言
3、汇编:   gcc -c project.S -o project.o     //生成机器语言 project.o  生成未地址定位的机器码 
4、链接:   gcc project.o  -o project         //生成可运行程序project   加载库文件

1、预处理: gcc -E project.c -o project.i     //生成预处理文件 project.i 宏展开 包含展开 -o后面要跟着生成的文件。

此过程将头文件里的定义如stdio.h里的例如extern int sys_nerr;等定义全部展开添加到mian函数里面,printf是一个库函数,定义在stdio.h里面,大家可以通过输入cd /usr/include/stdio.h查看。

==============编程要点================

1、语法   ----> 便于编译器识别  ---->  GCC 
 
#include <stdio.h>
#define MAX 100        //预处理后 int a=100;

运行参数个数   运行参数内容
int main(int argc,       char **argv)   //入口main
{
        int a=MAX;
printf("project!\n");           //格式化输出

return 0;                       //结果反馈,成功结束 0 ,异常 负数(错误码)
}

提示: Linux 是多用户,多任务系统
  
  头文件位置:  /usr/include/xxxx.h

查阅上一个程序的结束反馈状态值 :  echo  $?
  如main函数最后是return0;,那执行echo  $?后显示0;

2、编译:   gcc -S project.i -o project.S     //生成汇编文件 project.S  //调用对应的编译器将高级语言(C语言)转成低级语言

3、汇编:   gcc -c project.S -o project.o     //生成机器语言 project.o ,即生成未地址定位的机器码 (启动系统时用到汇编的知识,硬件开发需要学(.o是适合CPU识别的东西)

4、链接:   gcc project.o  -o project         //生成可运行程序project   加载库文件(*.S)将库和文件链接到一起(使用nm xxxx.o查看,发现没有给printf分配地址,
链接后将自定义代码程序段与调用的插件(库)进行组合,确定了运行地址,再次查看发现u printf后面多了一个@GLIBC_2.0,当函数调用printf时从库函数@GLIBC_2.0
这个库找,此过程为:确定运行地址--->链接%,即.o--->elf,这是动态链接方法,可以节省内存)

附:动态链接与静态链接优缺点

动态链接:地址绑定发生在程序运行时,需要运行环境中有动态文件存在。printf是公用的,运行时再使用这个库可以节省内存。GLIBC
优点:编译时调用的数据库不占用内存空间,程序体积小,便于存储。
缺点:需要运行中有动态文件的存在,经过加载才运行,运行速度较慢。

静态链接:地址绑定发生在程序编译时

编译命令:
gcc xxx.c -o xxx -static
优点:编译时将全部依赖文件进行装载,运行过程不再装载其他文件,速度快
缺点:体积大,可能导致数据冗余

注意:机器不能识别我们人类的高级语言,所以需要将写好的程序通过编译和汇编转化成机器能识别的二进制文件(汇编代码,低级语言)让机器识别。 (CPU识别的是010101这样的高低电平)

写完的程序会保存在rom里,当执行时再提取到ram。

好的,今天就写到这里了。可能写得比较乱,但是毕竟是新人,我会在以后的慢慢学习慢慢进步的,希望我写的内容能帮到更多的人,哈哈

linux系统中-E,-S,-c的区别和作用(怎么讲代码转化为机器识别的语言)的更多相关文章

  1. 获得Unix/Linux系统中的IP、MAC地址等信息

    获得Unix/Linux系统中的IP.MAC地址等信息 中高级  |  2010-07-13 16:03  |  分类:①C语言. Unix/Linux. 网络编程 ②手册  |  4,471 次阅读 ...

  2. Linux 系统中用户切换(su user与 su - user 的区别)

    1. Linux系统中用户切换的命令为su,语法为: su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]] 参 ...

  3. Linux 系统中用户切换

    1. Linux系统中用户切换的命令为su,语法为: su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]] 参 ...

  4. 实例讲解Linux系统中硬链接与软链接的创建

    导读 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.硬链接与软链接的区别从根本上要从Inode节点说 ...

  5. linux系统中用户切换

    1. Linux系统中用户切换的命令为su,语法为: su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]] 参 ...

  6. 2017-03-04 dotnet core网站发布到Linux系统中

    今天开始学习dotnet core的开发,距离Visual Stuio 2017正式版的发布,也就是VS20周岁的生日还有三天,在我的电脑上安装的是VS2017 Enterprise RC版, 在VS ...

  7. 【OS_Linux】Linux系统中目录及文件管理

    1.Linux系统中目录的树状结构 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里. /etc 存放系统管理和配置文件 /home 存放所有用户文件的根目录, ...

  8. [转帖]Linux系统下x86和ARM的区别有哪些?

    Linux系统下x86和ARM的区别有哪些? https://www.cnblogs.com/alantu2018/p/9209143.html 其实界限 越来越小了.. 问题: 最近在用三星的一款i ...

  9. 三、Linux系统中的文件类型和文件扩展名

    .sock文件也是一类特殊的文件,这类文件通常用在网络之间进行数据连接,如:我们可以启动一个程序来监听客户端的要求,客户端可以通过套接字来进行通信: linux中的文件类型 文件类型介绍 Linux系 ...

随机推荐

  1. Linux系统目录结构,Shell脚本;关闭和开启防火墙

    Linux系统目录结构 目录 描述 备注 /bin a.存放着最经常使用的命令 b.可执行文件,用户命令 c.构建最小系统所需要的命令 /boot a.内核与启动文件 b.系统启动相关文件 c.启动L ...

  2. java编写Loadrunner脚本

    web.set_max_html_param_len("1000000"); lr.start_transaction("red_envelop"); web. ...

  3. Simple Factory (简单工厂模式)

    简单工厂模式不是23种设计模式之一,简单工厂模式属于创建型模式, 又叫做静态工厂方法(Static Factory Method) 简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模 ...

  4. JavaScript(三)-- DOM编程

    JavaScript编程中最基本的就是DOM编程,DOM是 Document Object Model文本对象模型,就是对DOM对象进行编程的过程. Java语言和Js都有针对于DOM的编程,两者类似 ...

  5. 在Docker中执行web应用

    启动一个简单的web 应用 使用社区提供的模板,启动一个简单的web应用,熟悉下各种Docker命令的使用: # docker run -d -P training/webapp python app ...

  6. Lintcode---单词的添加与查找

    设计一个包含下面两个操作的数据结构:addWord(word), search(word) addWord(word)会在数据结构中添加一个单词.而search(word)则支持普通的单词查询或是只包 ...

  7. Shell 基础笔记

    1-22-shell脚本的基础 本节所讲内容:      shell 基本语法      变量 第1章 什么是SHELL?.. 2 1.1 shell编程.. 3 第2章 shell变量及运用.. ...

  8. django学习笔记【003】创建第一个带有model的app

    [1]python应用程序要连接mysql有多个驱动程序可供选择: 1.MySQLdb 这个只支持python2.x 所以在这里就不说了: 2.mysqlclient 下载地址 https://pyp ...

  9. Java并发编程(四):线程安全性

    一.定义 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 二.线程安 ...

  10. JUC组件扩展(二)-JAVA并行框架Fork/Join(四):监控Fork/Join池

    Fork/Join 框架是为了解决可以使用 divide 和 conquer 技术,使用 fork() 和 join() 操作把任务分成小块的问题而设计的.主要实现这个行为的是 ForkJoinPoo ...