c - C 平台(H/W + S/W)是依赖的还是独立的

标签 c gcc

如果您使用所有平台通用的所有标准 C 库编写 C 程序,无论是 Unix(任何风格)还是 Windows(即 stdio.h、math.h 等),并使用标准编译器(即 GCC)并在任何一个相同的 CPU 架构上运行它,为什么二进制文件不能在符合所有上述条件的不同机器上运行?

当我在 X86 Mac 上仅使用标准库编译 C 程序时,为什么编译后的二进制文件不能在相同 CPU 架构的 Linux 或 Windows 下运行?

是因为在 C 运行时期间发生了特定于平台的库链接还是什么?

最佳答案

可执行二进制文件不仅仅是源代码和所需库的机器语言的组合,但现在跳过这一点答案仍然是否定的:您链接的库特定于它们所要使用的系统继续运行。例如,您询问 mac 与 linux...每个系统都有自己的调用方式来陷入系统(例如,对于 I/O),并且如果您的可执行文件将这些项目链接到其中(而不是通过共享对象),你从一开始就注定失败。

回到“特定于系统”...不仅系统调用之类的问题是一个问题,而且有不止一种可执行二进制格式,这在很多时候会给您带来不仅仅是轻微的痛苦。例如,OS X 使用“Mach-O”二进制格式,而Linux 使用“ELF”格式。当然,在这些文件中,您会发现同一可执行文件的类似代码,但您会发现该数据的不同二进制布局,这使得在一个系统上看似简单的内容在另一个系统上完全未知。许多示例之一...Mach-O 格式嵌入在可执行文件中动态加载的库预期所在的位置 - 例如,绝对位置或相对于加载可执行文件的位置。这个概念(据我所知)既不是 ELF 也不是 Windows“PE”格式。

关于c - C 平台(H/W + S/W)是依赖的还是独立的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22661667/

相关文章:

c++ - Reg 在 U-Boot 上执行 C++ 应用程序(无操作系统)

c - GCC:为实际符号指定目标地址

c - 错误1 : no input files when making a c file

gcc - 错误 : junk `bswapl eax movl %eax' after register

c - 使用 fgets() 和 strtok() 在 C 中逐行读取文件?

c - 字符串数组并在字符串中定位字符

c - 为什么 GCC 声明 clock_gettime() 隐式声明,但预处理器对相关宏非常满意?

c - 仅删除句子中的字母字符

c - 基本线性代数算法(MATLAB 和 C)

检查变量何时被修改