相同的cpu不同的操作系统可执行程序重新编译原因

不同的cpu需要重新编译很容易理解,因为可执行程序最终的就是机器语言,机器语言是对应cpu指令集的,通过指令集来完成各种各样的功能。不同的cpu指令集都有或多或少的区别,所以一定要重编。

但是对应相同的cpu,不同的操作系统这种情况来说,不同的操作系统实现的系统接口是不相同的,有可能大相径庭,站在静态链接库的角度,由于静态链接库链接到了可执行程序中,不同的操作系统

的系统调用不一样,故无法执行。

下面列出了很多理由:

因为可执行文件格式不同,所以共享库(或Windows中的DLL)也不同,libc实现也不同,等等。

除了计算之外,每个可执行文件在启动和终止时还会做很多额外的隐藏工作。这项工作是特定于OS的。隐藏的启动和终止代码是必须为每个OS分别生成的代码。

但是我不明白为什么可执行文件格式不同。最后,所有可执行文件都是机器操作,各操作系统之间并没有什么不同,但是从架构到体系结构却没有不同。共享库由操作系统处理,因此我只调用fopen之类的函数,而不关心哪个操作系统正在处理该调用(我想这就像微服务架构一样)。你了解我的问题,@ Pablo吗?

可执行文件格式有所不同,因为Microsoft希望这样-询问它们。他们没有理由不能使用现有格式(尽管仍然会有不同的库实现)。

二进制格式是不同的,因为它们的设计不同。 Linux使用不同的ELF,Windows使用(据我所知)可移植的可执行文件,这是不同的。会使用相同的汇编程序指令,但使用方式不同。

每个操作系统供应商可能也有不同的调用约定,如何将参数和结果传递到调用或从调用传递,因此fopen的win vs linux实现可能完全相同,但是一个人会期望rdi中的第一个参数,而其他rcx之类的东西,因此在调用之前,您需要不同的机器代码来设置寄存器。动态链接机制和许多其他底层OS API在细节上也有很大不同。通过提供相同的高级接口,C ++标准将使您免受许多差异的影响,但是使用dif进行内部实现是不同的。操作系统API。

从理论上讲,可以设计一种通用的可执行文件和库格式,以便为相同框架(例如Qt,GTK +或仅是STL)编写的程序可以编译为可在多个OS上运行的单个二进制文件。实际上,没有人做。

参考链接:

https://www.codenong.com/48235579/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值