Iphone 在任何操作系统上运行不同格式的可执行文件

Iphone 在任何操作系统上运行不同格式的可执行文件,iphone,c,arm,executable,abi,Iphone,C,Arm,Executable,Abi,如果我没弄错的话,这应该不会有人想的那么难。具体来说,我将从iOS和ELF可执行文件格式开始。让我们澄清一下,我有一个越狱的iPhone,我不想在任何appstore应用程序中这样做,所以请避免“好建议”,比如“你不能这样做,因为苹果禁止这样做” 所以,我看到的是有一个Flash播放器实现,叫做Frash(由Comex btw,最近越狱的开发者)。安装后,此实用程序需要Android的libflashplayer.so存在(复制到)iPhone文件系统。我深入研究了源代码,发现这个调整实际上打开

如果我没弄错的话,这应该不会有人想的那么难。具体来说,我将从iOS和ELF可执行文件格式开始。让我们澄清一下,我有一个越狱的iPhone,我不想在任何appstore应用程序中这样做,所以请避免“好建议”,比如“你不能这样做,因为苹果禁止这样做”

所以,我看到的是有一个Flash播放器实现,叫做Frash(由Comex btw,最近越狱的开发者)。安装后,此实用程序需要Android的libflashplayer.so存在(复制到)iPhone文件系统。我深入研究了源代码,发现这个调整实际上打开了Android(ELF)共享对象文件,“解析”它并执行其中的代码。我已经问过我的一个朋友这到底是可能的还是不可能的,他告诉我这是可能的,因为ARM上的ELF和ARM上的Mach-O是二进制兼容的(因为它们都是ARM)。但他实际上没有向我详细解释,所以我想问一下如何做到这一点?我不能完全理解处理的源代码片段,但有一点是肯定的:

int fd = open("libflashplayer.so", O_RDONLY);
_assert(fd > 0);

fds_init();

sandbox_me();

int symtab_size;
Elf32_Sym *symtab;
void **init_array;
Elf32_Word init_array_size;
char *strtab;
TIME(base_load_elf(fd, &symtab, &symtab_size, &init_array, &init_array_size, &strtab));

// Call the init funcs
_assert(init_array);
while(init_array_size >= 4) {
    void (*x)() = *init_array++;
    notice("Calling %p", x);
    x();
    init_array_size -= 4;
}
(源于GitHub上2011年12月2日的原始代码)

在我看来,他使用libelf来执行这个任务,对吗?在一个ELF文件中,有一些符号可以在兼容的处理器上很好地执行


我还想知道这是否适用于所有其他处理器体系结构?因此,也许可以在OS X上执行Linux二进制文件中的符号?

有关兼容性的重要问题是底层处理器体系结构,而不是Linux与OS X与安卓。如果ELF或.So是针对同一处理器指令集编译的,那么这是一个can工作。如果不工作,则它们不兼容。例如,如果两者都是为Linux构建的,但处理器不同,则它们将不兼容。

谢谢!这是个好消息。您对实际实现有何指导原则?(更准确地说,我可以使用libelf来获取一些实际代码的函数指针吗?我还希望有一个指向libelf文档的链接[我找不到]).我不知道他是否在使用libelf,但是,是的,libelf可以解析一个ELF文件,让您在库或可执行文件中找到函数的二进制实现。我不知道文档,但源代码在这里: