当一个程序是递归地静态编译(假设所有链接库都允许静态编译,并且在代码中是独立于某种平台的情况下),我知道这是可能的,因为我成功地从Ubuntu静态编译了nano以在x86 Android上运行,并且它工作了,因为它没有链接到系统库),那么假设它是自包含的,真的安全吗?也就是说,它还需要来自平台的其他东西(如Linux、Windows、.等等)吗?我想答案是肯定的。所以相应的..。
为了简单起见,如果我使用这个程序(没有依赖项):
int main(){
return 0;
}我可以很容易地静态编译它(因为它显然没有依赖项),并且应该生成在底层体系结构(例如x86体系结构)上运行的本机代码。
我知道有些包装器会传递环境变量和其他东西,这取决于平台的不同(例如Windows或Linux可执行文件)。
把包装放在一边,问题是:如果我在Linux上静态地使用GCC编译之前的程序,理论上是否能够在Windows上运行它?
回到wrappers,如果我知道如何将包装器从Windows转换到Linux,反之亦然,我是否需要重新编译这个程序来将它从一个转到另一个呢?
发布于 2019-02-28 16:19:48
您熟悉的普通用户程序都嵌入了可执行文件格式。将程序从这样的文件加载到内存中需要依赖于所使用的特定格式的操作系统服务。
一旦加载,程序就会使用对操作系统的请求来执行基本操作,例如读取输入、写入输出和终止程序。这些不能内置到程序中,因为普通用户程序没有访问实现它们所需的硬件特性的权限。
当然,编写不依赖于操作系统的软件是可能的。一个例子是操作系统本身:它们提供自己的所有功能。但是,它们必须在裸露的硬件(或模拟硬件的虚拟环境)上执行,并且必须由硬件的引导加载程序加载。
发布于 2019-02-28 16:26:06
假设它是独立的,这真的安全吗?也就是说,它还需要来自平台的其他东西(如Linux、Windows、.等等)吗?我想答案是肯定的。
你应该是对的。为在操作系统中使用而构建的程序依赖于主机操作系统的服务,通过特定于该系统的OS接口。其中最基本的是加载和启动程序的设施,它只处理特定的程序格式。Windows支持的格式和Linux支持的格式不重叠。
如果我在Linux上静态地使用GCC编译了以前的程序,理论上我能在Windows上运行吗?
不不是直接的。但是您可以在容器中运行它,它为运行在内部的二进制文件提供了一个Linux环境。
如果我知道如何将包装器从Windows转换到Linux,反之亦然,我是否需要重新编译这个程序才能将它从一个转到另一个呢?
要在本机运行该程序,您需要为每个目标操作系统分别构建它。您甚至可能需要为不同版本的操作系统分别构建它。完全静态编译减少了后一种需要的表面积,但它没有解决跨平台问题。
发布于 2019-02-28 16:38:23
不,即使是为C++完全静态构建的二进制文件也不会跨平台。即使是最简单的程序
int main() {
}将有CRT启动代码链接到它(静态)。而且,CRT将有大量的依赖于操作系统的API调用(一个exit syscall会立即出现在人们的脑海中,但当然还有更多)。
对不起,您必须在目标平台上交叉编译或本地编译。
https://stackoverflow.com/questions/54929980
复制相似问题