【发布时间】:2018-06-22 11:11:01
【问题描述】:
我了解了有关 CPU/ASM/C 的基础知识,但不明白为什么我们需要针对不同的操作系统目标以不同的方式编译 C 代码。编译器所做的是创建汇编程序代码,然后将其汇编为二进制机器代码。由于指令集架构不同,ASM 代码当然因 CPU 架构(例如 ARM)而异。
但由于 Linux 和 Windows 在同一个 CPU 上运行,因此 MOVE/ADD/... 等机器操作应该是相同的。虽然我知道有一些特定于操作系统的功能,比如打印到终端,但这个功能可以由 stdio.h 的不同实现提供,例如。而且,我仍然可以创建一个非常基本的程序,只计算 a + b 而不打印任何内容,因此我不需要任何特定于操作系统的代码。为什么我仍然需要针对 Linux 和 Windows 进行编译,而不仅仅是向我的 Linux 可执行文件添加 .exe 扩展?
【问题讨论】:
-
由于可执行格式不同,共享库(或Windows中的DLL)不同,libc实现不同等
-
除了你的计算之外,每个可执行文件在启动和终止时都会做很多额外的隐藏工作。这项工作是特定于操作系统的。这个隐藏的启动和终止代码必须为每个操作系统单独生成。
-
但我不明白为什么可执行格式不同。最后,所有可执行文件都是机器操作,在操作系统之间没有区别,而是从架构到架构。共享库由操作系统处理,所以我只调用 fopen 之类的函数,而不关心哪个操作系统正在处理调用(我想这就像一个微服务架构)。你明白我的问题吗,@Pablo?
-
可执行格式是不同的,因为微软想要那样——问问他们。他们没有理由不能使用现有的格式(尽管这些库仍然会有不同的实现)。
-
二进制格式不同,因为它们的设计不同。 Linux 使用 ELF,这是不同的,Windows 使用(据我所知)Portable Executable,这是不同的。将使用相同的汇编指令,但方式不同。
标签: c assembly compilation cpu cpu-architecture