Max*_*bit 4 c cpu assembly compilation cpu-architecture
我已经学习了关于CPU/ASM/C的基础知识,并且不明白为什么我们需要为不同的OS目标不同地编译C代码.编译器所做的是创建汇编程序代码,然后汇编到二进制机器代码.ASM代码当然因CPU架构(例如ARM)而不同,因为指令集架构不同.
但是当Linux和Windows在同一个CPU上运行时,MOVE/ADD/......之类的机器操作应该是相同的.虽然我知道有一些特定于操作系统的功能,比如打印到终端,但是这个功能可以由stdio.h的不同实现提供.而且,我可以创建一个非常基本的程序,只计算a + b而不打印任何东西,这样我就不需要任何特定于操作系统的代码.为什么我仍然需要为Linux和Windows编译而不是仅仅为我的Linux可执行文件添加.exe-Extension?
即使CPU是相同的,仍然存在许多差异:
snprintf
直接的功能,但在Windows上snprintf
可能会static inline
在头文件中实现为函数,该头文件实际上从C运行时调用另一个函数.这对程序员来说是透明的,但会为可执行文件生成不同的导入列表.long
在Linux 上是8字节,在Windows 上是4字节.理论上可以解决此处列出的所有内容:可以编写自定义加载器以支持不同的可执行格式,如果整个程序使用相同的一组内容,则不同的约定和接口不会导致问题.这就是Wine之类的项目可以在Linux上运行Windows二进制文件的原因.问题是Wine必须在其他操作系统提供的功能之上模拟Windows NT内核的功能,从而降低实现效率.由于使用了不同的非互操作接口,因此这种程序在与本机程序交互时也存在问题.
归档时间: |
|
查看次数: |
818 次 |
最近记录: |