冒犯自己,这个问题可能会显得天真和/或愚蠢,因为我对诸如系统之类的unix的内部工作和编程一般来说还比较陌生。
准备?好!我将经历大约3个水平的可笑性,并随着操作的进行而增加。
我们有两个具有相似硬件的系统(主要是处理器,让我们说一个标准的Intel Core 2 Duo)。
一个正在运行(在此处插入您的Linux发行版:以后将使用Ubuntu),另一个正在运行,例如Mac OSX。
一个人编译一个等效的程序,让我们说一些类似的东西:
int main()
{
int cat = 33;
int dog = 5*cat;
return dog;
}
代码非常简单,因为我还不想考虑共享库的含义。
在各个系统上编译时。输出之间的主要区别不是ELF和Mach-O的问题吗?如果要剥离格式的每个二进制文件,而只保留一个平面二进制文件,那么反汇编的机器指令会不会相同?(根据编译器的习惯/倾向,可能会有一些差异)。
1.)如果要开发一种程序,以Mach-O格式重新包装从我们的Ubuntu系统产生的平面二进制文件,它将在Mac OS X系统中运行吗?然后,如果一个人只有上面假定程序的编译二进制文件,而一个人只有这个神秘的工具用于重新打包平面二进制文件,那么简单的程序是否可以在Mac OS X系统上运行?
现在让我们更进一步。
我们现在有一个程序,其源代码如下:
#include <stdio.h>
int main()
{
printf("I like tortoises, but not porpoises");
return 0;
}
2.)假设该程序已编译并静态链接,我们的魔术程序是否仍然能够以Mach-O格式重新打包原始二进制文件,并使它在mac os X上运行?看起来它不需要依赖任何其他二进制文件(在这种情况下,mac系统不需要)
现在到了最后的水平;
3.)如果我们使用该假定程序将所有必需的共享库转换为Mach-O格式,然后使用动态链接编译上述程序,该怎么办。该程序仍然可以成功运行吗?
现在应该是这样,显然荒谬的每一步都依赖于先前的基础,甚至变得有意义。因此,如果第一根支柱遭到破坏,我怀疑其余层级会有很多好处。
我绝对不会想到带有GUI的程序来考虑这一点。窗口系统可能完全是另一个麻烦。在此阶段,我仅考虑命令行程序。
现在,我邀请世界来纠正我,并告诉我我荒谬的思维思路中的所有错误。