当程序是 递归 静态编译时(假定所有链接的库都允许静态编译并且在其代码中独立于某种平台,我知道这是可能的,因为我设法从Ubuntu静态编译nano以在x86 Android上运行,并且它得以工作,因为它没有链接到系统库),假设它是自包含的,真的安全吗?也就是说,它是否还需要平台上的其他功能(例如Linux,Windows等)?我怀疑答案是肯定的。因此,相应地...
为简单起见,如果我使用此程序(无依赖项):
int main(){
return 0;
}
我可以轻松地对其进行静态编译(因为显然它没有依赖性),并且应该生成在底层体系结构(例如x86体系结构)上运行的本机代码。
我知道有些包装器会传递环境变量以及其他因平台而异的东西(例如Windows exe或Linux可执行文件)。
将包装器放置一分钟,问题是:如果我在Linux上使用GCC静态编译了以前的程序,我是否可以 理论上 视窗?
回到包装器,如果我知道如何将包装器从Windows转换为Linux,反之亦然,我是否需要重新编译该程序以将其从一个移到另一个?
答案 0 :(得分:3)
您熟悉的普通用户程序以可执行文件格式嵌入。将程序从此类文件加载到内存需要操作系统服务,具体取决于所使用的特定格式。
一旦加载,程序就会使用对操作系统的请求来执行基本操作,例如读取输入,写入输出以及终止程序。这些不能内置到程序中,因为普通用户程序无权访问实现它们所需的硬件功能。
当然可以编写不依赖操作系统的软件。操作系统本身就是一个例子:它们提供所有自己的功能。但是,它们必须在裸机(或模仿它的虚拟环境)上执行,并且必须构建为由引导加载程序为硬件加载。
答案 1 :(得分:1)
假设它是独立的真的安全吗?也就是说,它是否还需要平台上的其他功能(例如Linux,Windows等)?我怀疑答案是肯定的。
您将是对的。为在操作系统中使用而构建的程序通过特定于该系统的OS接口依赖于主机操作系统的服务。其中最基本的是用于加载和启动程序的工具,这些工具仅处理特定的程序格式。 Windows和Linux支持的格式不重叠。
如果我在Linux上使用GCC静态编译了以前的程序,理论上我是否可以在Windows上运行它?
不,不是直接。但是您可以在Windows Subsystem for Linux容器中运行它,该容器为在其中运行的二进制文件提供了Linux环境。
如果我知道如何将包装程序从Windows转换为Linux,反之亦然,我是否需要重新编译该程序以将其从一个移到另一个?
要在本地运行该程序,您需要针对每个目标OS分别构建它。您甚至可能需要针对不同版本的OS分别构建它。完全静态编译可以减少后者所需的表面积,但不能解决跨平台问题。
答案 2 :(得分:1)
不,即使是完全静态构建的C ++二进制文件也不会跨平台。甚至最简单的程序
int main() {
}
将(静态)链接到CRT启动代码。而且CRT不会有少量的依赖于操作系统的API调用(exit
syscall可以立即想到,但当然还有更多)。
对不起,但是您必须交叉编译或在目标平台上本地编译
答案 3 :(得分:0)
从理论上讲,是的。另一种方法(在Linux中运行Windows可执行文件)使用Wine已有相当长的一段时间。现在,借助适用于Linux的Windows子系统,我认为您也可以在Windows 10中运行Linux可执行文件。