当 C 程序被编译成可执行文件时,这是以系统相关的方式完成的。在 Ubuntu 上使用ELF格式,在 Windows 上使用PE。
当您启动一个进程时,将读取 ELF 或 PE,提供有关如何分配内存以及将进程的各个部分放在虚拟内存表中的位置的说明/映射。此外,它链接到已经在物理内存中的动态加载的库,它与使用相同库的其他进程共享。或者,如果动态库不存在,则加载它们。(Linux .so、Windows .dll)。如果它有静态库,这些库会被分配并链接在(Linux .a、Windows .lib)中。- 非常简化。
内存限制等是从先前的进程继承的。
环境变量被放入进程的运行环境中。这是路径、参数等。然后main()
被添加到堆栈中并被调用。
现在调用 main 之前发生的所有事情以及如何解决链接等以及许多其他事情都取决于系统。这就是为什么人们根本无法在 Windows 上运行在 Linux 上编译的可执行文件的原因。
使用cygwin
一个只是创建一个虚拟环境,其中这些链接等是相同的并且可以工作。一个创建一个ELF环境。
要将其链接到本机 Windows 命令行,必须针对 Windows 进行编译。在这件事上,我看到已经有很多答案了。
ELF 和PE,在不同的系统上,也有不同的方式来处理环境变量等。这些是什么等等。所以文件扩展的处理方式不同。但是,两个正在运行的进程都具有默认流,例如stderr
,stdout
和stdin
. 但是在你的 C 代码下面,它们是不一样的。
这就像驾驶柴油车与汽油车。很多是相同的,但在引擎盖下有很多东西是不同的。
请注意,ie 信号在 Windows 上的处理方式不同。