c++ - 静态编译的纯标准 C++ 程序是否可移植提供在同一架构上运行?
问题描述
当一个程序被递归静态编译时(假设所有链接的库都允许静态编译并且在它们的代码中是某种平台独立的,我知道这是可能的,因为我设法从 Ubuntu 静态编译 nano 以在 x86 Android 上运行并且它可以工作,因为它没有链接到系统库),假设它是独立的真的安全吗?也就是说,它是否需要平台上的其他任何东西(即 Linux、Windows、...等)?我怀疑答案是肯定的。所以相应地...
为简单起见,如果我采用此程序(无依赖关系):
int main(){
return 0;
}
我可以轻松地静态编译它(因为它显然没有依赖项)并且应该生成在底层架构(比如 x86 架构)上运行的本机代码。
我知道有些包装器会传递环境变量和其他因平台而异的东西(例如 Windows exe 或 Linux 可执行文件)。
将包装器放在一边,问题是:如果我在 Linux 上使用 GCC 静态编译前面的程序,理论上我可以在 Windows 上运行它吗?
回到包装器,如果我知道如何将包装器从 Windows 转换为 Linux,反之亦然,我是否需要重新编译程序才能将其从一个转移到另一个?
解决方案
您熟悉的普通用户程序嵌入在可执行文件格式中。将程序从此类文件加载到内存中需要依赖于所使用的特定格式的操作系统服务。
加载后,程序使用对操作系统的请求来执行基本操作,例如读取输入、写入输出和终止程序。这些不能内置到程序中,因为普通用户程序无权访问实现它们所需的硬件功能。
当然可以编写不依赖于操作系统的软件。一个例子是操作系统本身:它们提供所有自己的功能。但是,它们必须在裸硬件(或模仿它的虚拟环境)上执行,并且必须构建为由硬件的引导加载程序加载。
推荐阅读
- solr - 如何查找 Solr 集合更新状态
- compiler-construction - 在为项目开发编译器时,我遇到了某种类型的生产问题
- php - 如何修复此错误“htmlspecialchars() 期望参数 1 为字符串,给定数组 (View:\frontend\passenger.blade.php)”
- laravel - 我可以在 laravel 和 mongodb 中更新我的密码吗?
- sql-server - CTE 基于输入创建递归动态行和列
- python - 如何在sqlalchemy中选择列存在
- java - 从 java 应用程序发送时没有在服务器中获取正确的 json
- python - Plotly-Dash:如何打印条形图的 hoverData?
- javascript - 如何在 jquery 中创建一个按钮,其 href 属性等于 ajax 响应
- php - 使用 php mailer 邮件从 localhost xamp 成功发送,但未能在生产 Windows 托管中发送