我知道每个CPU /架构都有自己的指令集,因此为特定CPU编写的程序(二进制)不能在另一个CPU上运行.但我真正理解的是为什么一个可执行文件(例如.exe之类的二进制文件)无法在Linux上运行,但即使在同一台机器上也可以在Windows上运行.
这是一个基本问题,我期待的答案是.exe和其他二进制格式可能不是原始机器指令,但它们包含一些依赖于操作系统的数据.如果这是真的,那么这个OS依赖的数据是什么样的?作为一个例子,.exe文件的格式是什么,以及它与Linux可执行文件之间的区别?
有没有来源我可以获得有关此的简要和详细信息?
linux windows compiler-construction executable operating-system
如果你在基于Linux的平台上编译一个程序,比如C,然后移植它来使用MacOS库,它会起作用吗?
核心机器代码是来自兼容Mac和Linux的编译器吗?
我问这个的原因是因为两者都是"基于UNIX的"所以我认为这是真的,但我不太确定.
我几乎可以肯定我的问题是因为编译的程序被编译为linux可执行文件,但我只是想仔细检查一下.
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Hello world!\n");
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
上面的"程序"应该在Windows和Linux上编译得很好,因为它与源代码兼容,因为没有特定于操作系统的库或类似的东西.
然而,当我在我的Linux机器上键入"c99 hello.c -o hello.exe",然后将该"可执行文件"传输到Windows机器时,它拒绝运行.根据我的理解,Linux生成一个只能在linux上运行的可执行文件,因此添加".exe"无效.要在Linux for Windows上构建该程序,我需要在Windows机器上重新编译该程序吗?或者还有另一种更简单的方法吗?
有一个为语言研究开发的程序(http://people.csail.mit.edu/mcollins/code.html)。当我尝试在 Windows 上使用 Git bash 终端运行解析器时,出现错误:
bash: cannot execute binary file: Exec format error.
Run Code Online (Sandbox Code Playgroud)
首先,我认为这是因为我的 64 位操作系统,因为该文件是 32 位的。因此,我在 32 位系统上尝试了该程序,但得到了相同的消息。
关于如何解决这个问题有什么想法吗?:
file (program)
显示:
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, with debug_info, not stripped
Run Code Online (Sandbox Code Playgroud)
uname -srv
对于我的 64 位操作系统,显示:
MINGW64_NT-10.0-19042 3.1.7-340.x86_64 2021-03-26 22:17 UTC
Run Code Online (Sandbox Code Playgroud)
uname -srv
对于我的 32 位操作系统,显示:
MINGW32_NT-6.1-7601 3.1.7-340.i686 2021-03-26 22:01 UTC
Run Code Online (Sandbox Code Playgroud)
PS:如果你想尝试一下,这段代码应该可以在程序目录中运行,但它对我不起作用:
gunzip -c models/model2/events.gz | code/parser examples/sec23.tagged models/model2/grammar 10000 1 1 1 1 …
Run Code Online (Sandbox Code Playgroud) 当我编译我的c源代码时(例如在Linux环境中),编译器以"机器可读"格式生成文件.
我已经学习了关于CPU/ASM/C的基础知识,并且不明白为什么我们需要为不同的OS目标不同地编译C代码.编译器所做的是创建汇编程序代码,然后汇编到二进制机器代码.ASM代码当然因CPU架构(例如ARM)而不同,因为指令集架构不同.
但是当Linux和Windows在同一个CPU上运行时,MOVE/ADD/......之类的机器操作应该是相同的.虽然我知道有一些特定于操作系统的功能,比如打印到终端,但是这个功能可以由stdio.h的不同实现提供.而且,我可以创建一个非常基本的程序,只计算a + b而不打印任何东西,这样我就不需要任何特定于操作系统的代码.为什么我仍然需要为Linux和Windows编译而不是仅仅为我的Linux可执行文件添加.exe-Extension?
如果我在操作系统(例如:Windows)中创建一个 C 可执行文件,该文件是否可以在其他操作系统(例如:Linux、Mac-OS)上运行。