linux写出一个程序怎么运行不了

2024年10月10日 阅读 (51)

16号与18号

大家好,近期我发的文章都比较底层,过些天再发Linux基础方面的内容,多谢大伙儿的支持,回到正题。

您看,linux和windows都是运行在x86体系架构cpu上的操作系统,也就是指令的机器码都是一样的,为什么linux系统下的应用程序不能在windows系统下运行呢?其实,windows下的程序也无法直接在linux下运行,也许您在想,这不是废话吗。对于这个问题,很多同学都会马上给出答案:格式不同!其实。。。。答对啦,哈哈,确实是格式不同,不过这只是一方面,还有另一方面,系统API不同,API即Application Programming Interface,应用程序编程接口。

先说说格式,格式也可称为协议,协议是指:在某个固定的位置有固定意义的数据。比如偏移量为A字节、连续大小为B字节的空间中,存放的是数据C,像mysql协议、http协议都是类似这样的组织形式。一般特定于某个应用程序的文件只能被那个应用程序打开,原因是只有那个程序懂这个文件,如何懂呢?应用程序在生成文件时,一般都会在文件的开始部分写一段固定格式的数据,也就是元信息,这段数据称为文件头,故文件头是某个应用程序为自己埋下的伏笔,应用程序需要从文件头中获取文件的信息以方便它解析该文件。比如视频播放软件可通过读取视频文件的文件头来提前了解视频的信息,以选择合适的播放模式。这种应用程序和被解析文件的关系同样适用于操作系统和可执行程序,可执行程序是被操作系统识别并加载的。

Linux下的可执行程序格式是elf,也就是 “Executable and Linking Format。平时咱们用readelf命令可以查看elf文件头,里面有节(section)信息,段(segment)信息,程序入口(entry_point),哪个段由哪些节组成等等信息。而windows下的可执行程序是PE格式(portableexecutable,可移植的可执行文件),因为我没了解过,所以具体文件头咱们就不关注了,有兴趣的同学自行查看。说到这您也懂了,如果文件可以被多种应用程序解析的话,这个文件的格式必须被多种应用程序接受,即所有的应用程序都要认得这种格式的文件,比如一个视频文件可以被多种播放器播放原因正是如此。linux程序不能在windows下运行,说白了就是人家windows不认linux文件的格式。如果windows肯支持elf文件格式,那么linux程序在windows下运行也是可能的,但是…,还没完,还有另外一个硬伤,这就是操作系统API不同。

操作系统是通过API为应用程序提供功能支持的,一般是通过软中断指令int,再加上一个中断向量号来实现,这也称为系统调用。Linux是通过int 0x80来实现系统调用的,而windows是通过int 0x2e来实现的,也就是说,两个操作系统下的应用程序获得操作系统功能的方式不同,同样一句机器指令int 0x80,在linux下就是进入内核以获得操作系统的功能支持,结果是符合预期的,而在windows下却是另一翻景象,获得的结果也许是灾难性的。所以,双方的应用程序显然是不能在对方的系统中运行。

除以上原因外,这还和编译器、标准库有关,不再列举。

先到这。

郑重声明:玄微运势的内容来自于对中国传统文化的解读,对于未来的预测仅供参考。