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

时间:2011-12-02 21:40:50

标签: iphone c arm executable abi

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

所以,我所看到的是有一个名为Frash的Flash播放器实现(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;
}

(来自原始代码,截至2011年12月2日在GitHub上)

在我看来,他使用libelf执行此操作,对吧?那个在ELF文件中有符号可以在兼容的处理器上执行就好了吗?

我还想知道所有其他处理器架构是否都适用?那么也许可以在OS X上从Linux二进制文件执行符号?

1 个答案:

答案 0 :(得分:5)

兼容性的重要一点是底层处理器架构,而不是Linux vs. OS X vs. Android。如果ELF或.so是针对相同的处理器指令集编译的,那么这可以工作。如果没有,那么它们就不兼容了。例如,如果两者都是为Linux而是为不同的处理器构建的,那么它们就不兼容了。