振作起来,这个问题可能会显得幼稚和/或愚蠢,因为我对类 Unix 系统的内部工作以及一般的编程比较陌生。
准备好?好的!我会经历大约 3 个可笑的水平,随着我的进行而增加。
一个正在运行(在此处插入您的 linux 发行版:此后将使用 Ubuntu),另一个正在运行,比如说 Mac OS X。
编译一个等效的程序,让我们这样说:
int main()
{
int cat = 33;
int dog = 5*cat;
return dog;
}
Run Code Online (Sandbox Code Playgroud)
代码非常简单,因为我还不想考虑共享库的含义。
在各自的系统上编译时。输出之间的主要区别不是 ELF 与 Mach-O 的问题吗?如果要剥离格式的每个二进制文件,留下一个平面二进制文件,反汇编的机器指令是不是一样?(根据编译器的习惯/倾向,可能会有一些差异)。
1.)如果要开发一个程序来重新打包从我们的 Ubuntu 系统生成的平面二进制文件,以 Mach-O 格式,它会在 Mac OS X 系统中运行吗?那么,如果只有上面假设程序的编译后的二进制文件,并且有这个用于重新打包平面二进制文件的神秘工具,那么简单的程序是否能够在 Mac OS X 系统上运行?
我们现在有一个带有源代码的程序,例如:
#include <stdio.h>
int main()
{
printf("I like tortoises, but not porpoises");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
2.)假设这个程序被编译并静态链接,我们的神奇程序是否仍然能够以 Mach-O 格式重新打包原始二进制文件并使其在 mac os X 上运行?看到它不需要依赖任何其他二进制文件,(在这种情况下,mac系统不会有)
3.)如果我们使用这个假设的程序将所有必需的共享库转换为 Mach-O 格式,然后使用动态链接编译上面的程序会怎样。程序还能成功运行吗? …