【问题标题】:Running executables of different format on any OS在任何操作系统上运行不同格式的可执行文件
【发布时间】:2011-12-02 21:40:50
【问题描述】:

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

所以,我所看到的是有一个名为 Frash 的 Flash 播放器实现(由 Comex 顺便说一句,最近越狱的开发者)。安装后,此实用程序要求 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 年 2 月 12 日在 GitHub 上)

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

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

【问题讨论】:

    标签: iphone c arm executable abi


    【解决方案1】:

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

    【讨论】:

    • 谢谢!那是好消息。您对实际实施有任何指导吗? (更准确地说,我可以使用 libelf 来获取例如指向某些实际代码的函数指针吗?我也很想有一个指向 libelf 文档的链接 [我找不到])。
    • 我不知道他是否在使用 libelf,但是可以,libelf 可以解析 ELF 文件,让您在库或可执行文件中找到函数的二进制实现。我不了解文档,但来源在这里:directory.fsf.org/wiki/Libelf
    猜你喜欢
    • 1970-01-01
    • 2011-02-21
    • 2015-06-14
    • 1970-01-01
    • 2019-03-01
    • 2016-02-23
    • 1970-01-01
    • 2012-10-12
    • 2013-08-13
    相关资源
    最近更新 更多