有没有办法创建一个可以在多种可执行文件格式(例如 Mach-O 和 ELF)上运行的二进制文件?即使它只是一个包含两者并运行正确的文件的文件,我也想制作一个可以在 Linux 和 Mac 上运行的可执行文件。
答案1
简短回答:不(但请参阅下面的更新),因为每个二进制格式都以特定序列开头(“神奇数字”) 来标识格式。ELF 二进制文件以 0x7F 45 4C 46 开头,Mach-O 单架构二进制文件以 0xFE ED FA CE 或 0xCE FA ED FE(取决于字节顺序)开头,Mach-O 胖二进制文件以 0xCA FE BA BE 开头。由于二进制文件不能以多个这样的开头,因此它在多种格式中都无效。
现在,可能可以做一些更棘手的事情,比如有一个包装器 shell 脚本,以某种方式说服加载程序执行其自身的一部分...但这超出了我的专业知识(并且不仅取决于您尝试加载的二进制格式,还取决于您尝试加载它们的操作系统...)
更新:贾斯汀·汤尼想出了更棘手的方法。她利用各种技巧,想出了一个“αcτµαlly pδrταblε εxεcµταblε”格式可以在 Linux、Mac、Windows、FreeBSD、OpenBSD、NetBSD 和 BIOS 上运行。它确实需要 x86-64(64 位 Intel)架构,因此它无法在非常旧的 Mac 上运行,但它应该可以在新的基于 ARM 的 Mac 上模拟运行(只要 Rosetta 2 可用且已安装)。