执行二进制文件

时间:2012-02-10 03:45:09

标签: linux macos unix gcc x86

我使用GCC 4.4.4为x86-64 Red Hat Linux下载了一个已编译的二进制文件(一个C程序)。

当我尝试在运行GCC 4.2.1的Mac OS X(运行Lion以及x86-64)上运行它时会说:cannot execute binary file是正常的吗?它无法将其检测为二进制文件。

为什么会这样做?我相信gcc版本与此无关,因为该文件已经被编译。它已经为x86-64编译,其中两台机器都运行。有人可以解释一下吗?

4 个答案:

答案 0 :(得分:11)

有不同的二进制格式。 Linux系统使用ELF表示可执行文件和库,但Mac OS X使用Mach-O format。 Windows使用另一个:PE format

答案 1 :(得分:8)

为特定操作系统编译的二进制文件极不可能在另一个操作系统上运行。要么为Mac获取二进制文件,要么获取源代码并自行编译。

有很多事情会导致问题 - libc和libstdc ++的版本,.so库的版本可能会有所不同 - 与操作系统本身不同的API接口。甚至是不同的二进制格式(即VMS二进制文件不能在AIX上运行)。

答案 2 :(得分:2)

虽然Rad Hat Linux和Mac OS X都是“基于Unix的”,但它们无法运行彼此的二进制文件。就像你不能在Mac上运行Windows二进制文件一样,反之亦然。

答案 3 :(得分:0)

当你的程序有一个归结为操作系统调用的printf()时,这个意义上的二进制文件被编译为进行操作系统调用。如果它编译的操作系统是64位redhat linux那么这可能意味着二进制文件将在redhat linux路径中为共享库寻找redhat linux名称。对于完全不同的操作系统,Mac OS X及其系统调用和共享或静态库等,它绝对没有任何形式或形式。它就像从迷你库珀中取出一个轮子并试图将其拧紧骑自行车。是的,在某个时间点它是原料金属和橡胶,并且可能已经形成自行车轮胎。但是,一旦你制造了二元车,汽车轮胎或自行车轮胎,就是这样。有时候你会发现像wine这样的模拟器模仿posix系统顶部的窗口。或者像vmware这样的虚拟机,它允许你通过虚拟化整个计算机来运行一个完全不同的操作系统。

通常情况下,您通常不会期望使用任何旧的C程序并在任何具有gcc编译器的操作系统上编译和运行它。是的,你可以学习编写可移植的c程序,但你必须谨慎地坚持所有目标平台上支持的库。所以即使将程序的源代码带到mac并编译它也不一定能正常工作。