‘壹’ 你好!看到你对于有关linux的回答我想问下你,就是关于用arm-linux-gcc命令编译的C源程序。变为不能执...
首先你用arm-linux-gcc编译的时候,编译出来的是不能在PC机上运行的,并不是说它不是可执行文件
不论是gcc还是arm-linux-gcc,都是把c代码转换成机器码,性质是一样的,只不过,PC一般都是x86架构而arm-linux-gcc是编译成arm架构的可执行程序
‘贰’ linux运行与不同CPU体系架构的版本,其应用软件能否兼容
当然你得有软件的源代码,然后得重新编译一下才能用
代码要是写的特别规范而且没用什么某系统专有的东西的话,移植到windows都可以
不过也不保证所有的软件都没写某个cpu架构专有的东西
还有像wine那样的软件就不太可能移植到别的架构了
‘叁’ 高级编程语言也要编译成汇编语言,不同的cpu汇编语言不一样,那会编译成那种汇编语言呢
高级语言一般最终不是编译成汇编语言而是机器语言,而像C#这类语言编译后为公共语言,不是机器码,运行时公共语言代码由NET框架负责进一步即时翻译即时执行为机器指令。只有C++这类语言编译后为CPU可以直接执行的机器码。
附图是VS2019中C++语言的一段调试时的反汇编窗口,其中白字是C++源代码,下面是对应的汇编码,汇编行左列为内存地址,中间是对应的机器指令和数据(内存中的实际值),右侧是对应的汇编码。
比如,定义整数变量a并赋值1的语句,被编译器编译成C7 45 F8 01 00 00 00 这样几个字节,其中C7为汇编码中的MOV指令,可以操作16位寄存器和内存以及立即数,45 F8 是当前命名空间中变量地址,即变量a的地址(F845),而01 00 00 00 为32位宽度的数值1(内存排列顺序是前低后高)。也就是说机器语言的指令格式为:指令代码,地址,数据,当然根据不同指令,有时候地址和数据是不需要的。而右侧 MOV dword ptr[a],1 是指令助记符,也就是汇编指令,而用汇编指令编写的程序也是需要编译成机器指令的。
指令C7对应的汇编码及含义
‘肆’ 相同的cpu架构,在不同的操作系统下生成的程序为什么不可以通用程序不是机器语言么针对硬件操作的阿
相同的CPU架构只是指程序运行的硬件是相同的,而软件(操作系统、操作系统下生成的程序)是不一样的,最后生成的针对硬件操作的机器语言也不一样。生成的程序最后都要汇编成机器语言才能被运行,而机器语言在同一种架构下都可以用.但不能运行在不同架构的平台下。
‘伍’ 请问运行于不同CPU构架的linux,它们的软件可以通用吗
以上回答中jiangtao9999的比较靠谱儿。
是这样:
1、Linux下的软件几乎都是c语言的;
2、如果你学过C语言,找找书应该有这样一个概念:ANSI C,这个是一个C语言的标准,比如printf这个函数就属于标准库(也就是符合ANSI标准的)函数
3、假如你编写了一个软件,代码中仅仅包含ANSI的库函数,那么没有问题,只要是支持C语言的平台,都能正常运行,即:编写了一个简简单单的helloworld到哪里编译运行都没有问题。
【前提是:】编译再运行,不编译就运行是不可以的,比如printf函数在各种架构上的实现方式是不可能相同的,所以需要在arm的编译器上再编译一遍才可以。否则运行不了。
有的软件平台可以不用编译,直接运行,比如jiangtao9999说的java、Python什么的,Java可以实现“一次编译,满哪运行”什么的,而Python则是有了.py源代码就可以无敌了,使用的时候不用你去执行编译命令,直接执行即可。arm上实现这两种语言都是很容易的——下载源代码、编译、安装即可。
4、不同架构的Linux平台都要实现一个编译器,这是很重要的,有了编译器,才可以从源代码安装软件。
5、使用非ANSI库中的函数需要该Linux包含这个函数的实现,否则,编译后的连接将不通过,比如一个软件使用了GTK来实现图形用户界面,那么就需要系统中包含了gtk的库函数,这就叫依赖,安装软件,首先要解决依赖,依赖有时候解决起来很麻烦,所以软件开发过程中尽量减少依赖,这样方便安装。
6、tar.gz这种格式的软件包有可能是源代码,有可能是可执行文件(这是因为那只是一个压缩包,内容是什么不一定),这两者不同。很多软件以tar.gz格式发布源代码,而qq的Linux版本属于可执行文件,在几乎所有Linux平台下面直接双击或者通过命令就可以使用。
7、如果你使用的是rpm包或者deb包或者是tar.gz文件包中可执行文件形式的软件包,而不是tar.gz这种形式的源代码,你需要使用相应的软件包管理器安装就行,
但这不意味着arm版本的deb和x86版本的deb文件是通用的,你能这样用是因为所有的使用x86机器的软件经过编译或者交叉编译(在arm平台上编译x86平台上的软件就叫交叉编译)以后,运行于几乎完全一样的统一的平台上,实现软件和系统的无缝对接,方便了用户——一方面可以不用浪费编译的时间,主要还是方便了那些不会编译软件的人。
8、我也正在学习Linux,所以很多地方不太对,这只是我现在的一些理解。jiangtao9999说的主要是和汇编有关,如果代码的实现主要是在c语言水平,那么就会由编译器屏蔽掉指令集和寄存器什么的。
9、要是在网络回答的答案能改改就好了,这样错误就会少一点。
10、重新罗嗦一遍:
1在不重新编译源代码的情况下,x86下linux的软件不可以运行于arm构架的Linux,即使运行也会奇卡。
2和在编译是否时为X86的CPU构架优化了编译无关。(把我问迷糊了,估计是无关)
3软件在编译时是否为X86的CPU构架而优化主要看作者了,资料可以参看http://www.gentoo.org/doc/zh_cn/gcc-optimization.xml
4和不同的安装包格式有一定关系
5tar.gz格式的软件包不能保证在不同架构的Linux都能运行
6在arm的linux安装时解决依赖以后,乳沟编译通过基本是没什么问题的
7不是所有源代码在arm和x86下编译一下就可以了,还需要做一些努力
8有源代码可以对遇到的不通过的问题逐一解决,理论上可以实现所有软件都能运行
9重新编译过程中如果遇到依赖问题需要逐一解决
‘陆’ 谁知道为什么c语言程序为何可以在不同CPU上运行,还有,如果一个操作系统如果使用汇编语言开发,除了
因为运行的并不是C语言的代码,而是被编译器编译过的C语言代码,只要编译器设置正确,在不同的CPU上想完成相同的任务,C代码是完全一样的,只就是所谓的代码移植,编译好的C程序是不能移植的,但是相同的代码可以在任何有编译器的环境中编译.
至于操作系统,用汇编写的话,很难让人理解,查错,修改,升级都会比较麻烦,但是性能上,直接用汇编写,如果你的技术够高,肯定会比C的要好.
‘柒’ 同一程序在不同处理器上CPI一样吗
关于这个问题,相同的CPU架构只是指程序运行的硬件是相同的,而软件(操作系统、操作系统下生成的程序)是不一样的,最后生成的针对硬件操作的机器语言也不一样。生成的程序最后都要汇编成机器语言才能被运行,而机器语言在同一种架构下都可以用.但不能运行在不同架构的平台下。
‘捌’ 为什么同一款软件在不同指令集的CPU上运行相同的结果操作系统和编译器在其中起到了什么作用
软件是较高的层次,它告诉cpu具体的运算内容,cpu指令集是更底层的,它接受指令运算并输出结果,就像不同厂家的电视机,虽然内部电路不一样,但输出的图像时一样的,
当然由于指令集不同运行效率等细节上还是有差别但不影响结果!
操作系统就是管理各软件的,及管理软件运行所需要的软硬件资源,编译器是应用程序(软件)和操作系统的桥梁,操作系统通过编译器制定软件要干什么,才能调用相关资源使其运行起来!
‘玖’ 假如市场上有两种CPU架构,软件公司如何设计软件
如果你所说的这个软件公司,只是做应用软件的话,大可以不管这些。应用软件在操作系统之上。就像现下用java、.net做的软件就属于这一类。用java开发的只要能跑java虚拟机的操作系统,都没问题,因为java程序运行在java虚拟机上,不与操作系统直接打交道;.net程序运行在微软的CLR上,只要是安装有合适CLR的微软操作系统,基本都可以运行。所以,做应用开发与CPU架构无关。
如果是做杀毒安全之类软件,也关系不大,因为这类软件基本都是调用操作系统API,有厂家提供的SDK包就行。SDK包里封装了操作系统的相关技术调用,所以在使用时也可以不必担心。
如果是做驱动程序之类的就比较麻烦了,这个一般每种CPU都有针对性地开发包。如果CPU架构不同,或许不能通用。
以上都是一般性的说法,如果你用汇编做,以上的三种无论如何都与CPU架构相关,做时选用匹配CPU的汇编编译器版本就是了。
‘拾’ cpu架构 系统 和可执行程序之间的关系
这个话题其实挺大的,也挺小的。
cpu架构,
目前通用的桌面平台就是x86架构,也就是通用的复杂指令集,而power、arm是简单指令集。
相比较而言,复杂指令集提供的平台更小,毕竟规定更多。而简单指令集,提供的平台很宽广。
但,cpu的架构不能说好与坏,只是应用环境不同。
操作系统,
与cpu架构差不多,最早的unix一直应用在高端领域,关键就是稳定,但价格昂贵,维护费用高。
linux就是为了降低维护费用,并提供一个相对稳定的平台,而出现的衍生品。
windows平台,好处就是图形化,操作简单,应用多,而且广。
如果像unix或linux那种,编辑个文档,都需要开发个软件,对于绝大部分人来说,太复杂了。