linux系统中-E,-S,-c的区别和作用(怎么讲代码转化为机器识别的语言)
- 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的区别和作用(怎么讲代码转化为机器识别的语言)的更多相关文章
- 获得Unix/Linux系统中的IP、MAC地址等信息
获得Unix/Linux系统中的IP.MAC地址等信息 中高级 | 2010-07-13 16:03 | 分类:①C语言. Unix/Linux. 网络编程 ②手册 | 4,471 次阅读 ...
- Linux 系统中用户切换(su user与 su - user 的区别)
1. Linux系统中用户切换的命令为su,语法为: su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]] 参 ...
- Linux 系统中用户切换
1. Linux系统中用户切换的命令为su,语法为: su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]] 参 ...
- 实例讲解Linux系统中硬链接与软链接的创建
导读 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.硬链接与软链接的区别从根本上要从Inode节点说 ...
- linux系统中用户切换
1. Linux系统中用户切换的命令为su,语法为: su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]] 参 ...
- 2017-03-04 dotnet core网站发布到Linux系统中
今天开始学习dotnet core的开发,距离Visual Stuio 2017正式版的发布,也就是VS20周岁的生日还有三天,在我的电脑上安装的是VS2017 Enterprise RC版, 在VS ...
- 【OS_Linux】Linux系统中目录及文件管理
1.Linux系统中目录的树状结构 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里. /etc 存放系统管理和配置文件 /home 存放所有用户文件的根目录, ...
- [转帖]Linux系统下x86和ARM的区别有哪些?
Linux系统下x86和ARM的区别有哪些? https://www.cnblogs.com/alantu2018/p/9209143.html 其实界限 越来越小了.. 问题: 最近在用三星的一款i ...
- 三、Linux系统中的文件类型和文件扩展名
.sock文件也是一类特殊的文件,这类文件通常用在网络之间进行数据连接,如:我们可以启动一个程序来监听客户端的要求,客户端可以通过套接字来进行通信: linux中的文件类型 文件类型介绍 Linux系 ...
随机推荐
- Git 思想和工作原理
从根本上来讲,Git是一个内容寻址文件系统,并在此之上提供了一个版本控制系统的用户界面,它是一个非常强大且易用的工具,理解Git的工作原理,能够帮助我们更容易学习和使用Git. 本文不会像书籍里那样, ...
- Redis中为什么使用跳表---------转自http://blog.csdn.net/u010412301/article/details/64923131
最近在研究数据库的一些底层实现,百度的面试官问到了跳表,当时没有回答上来,在csdn上看到了这篇文章,感觉写的比较好,希望大家可以多多交流. Redis里面使用skiplist是为了实现sorted ...
- PHP定时执行计划任务
一.Windows计划任务 在web 服务下新建需要执行的文件 二.新建bat文件,命名为test.bat,内容如下: D:\php\php.exe -q D:\website\test.php 三. ...
- 也谈编译 VS 解释
语言发展 计算机的硬件仅仅能识别0和1组成的机器指令,而机器指令是最主要的计算机语言,可是我们平时进行程序设计时肯定不会用机器语言来编程,由于用它的效率低.更让人难以理解. 因此聪明的人类发明了汇编语 ...
- hp-ux 集群,内存 小记
-----查看hp 集群状态信息 # cmviewcl -v CLUSTER STATUS dbsvr up NODE ...
- 08-hibernate注解-多对多单向外键关联
多对多单向外键 1,学生和教师构成多对多的关联关系 2,其中一个多方持有另一个多方的集合对象(学生持有教室的集合) 3,通过注解@JoinTable,创建中间表(作为多对多的载体,用来确定学生和教师的 ...
- 利用socket.io+nodejs打造简单聊天室
代码地址如下:http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...
- 利用Redis撤销JSON Web Token产生的令牌
利用Redis撤销JSON Web Token产生的令牌 作者:chszs.版权全部.未经允许,不得转载.博主主页:http://blog.csdn.net/chszs 早先的博文讨论了在Angula ...
- 将object格式转为json格式
在页面内容显示时,有时需要用到json格式.但数据库内容的显示,需要将数据库中获取的格式转为json: using Newtonsoft.Json;public static string ToJso ...
- sql server使用sql插入中文字符串乱码问题
在插入语句前加N就行了 sb.Append(string.Format("update chapter set [content]=N'{0}' where Id ={1} ;", ...