macOS中arch -arch命令如何实现Rosetta启用与二进制架构强制?
关于macOS中
arch命令工作机制的疑问 在搭载ARM处理器的macOS系统上使用Rosetta时,可通过arch命令强制指定被包裹的命令以特定架构执行。例如,arch -arch x86_64 mycommand会尝试以x86/Intel程序的方式启动mycommand:若mycommand仅支持ARM则会执行失败;若为universal二进制文件,则会以x86架构运行。
我对arch -arch ...命令的实际工作机制存在以下疑问:
arch -arch $arch $program通过何种机制从universal二进制文件$program中选择对应$arch的版本并运行?arch -arch $arch $program尝试以指定架构$arch运行非universal二进制文件$program时,是通过何种机制在二进制不支持该架构时触发失败?- 是否存在无需调用
arch命令,由其他程序实现相同功能的方式?即使是不推荐的私有macOS API,我也想了解其实现原理。
我提出这些问题仅出于好奇,并非要规避arch命令的功能。
我已尝试的方法:
- 研究制作universal二进制文件时
lipo工具的内部原理,发现lipo是将不同架构的二进制文件拼接在Mach-O“fat binary”容器中,顶部通过特定标识指明各内容的位置。这对解答第一个疑问有一定帮助,但无法解决后两个问题。 - 研究mach_object等fat二进制解析工具,理论上可以从fat二进制文件中提取对应架构的子二进制,转储到临时文件后执行,但这种方式存在诸多问题(如工作目录错误、仅为启动程序而写入文件过于冗余)。
内容的提问来源于stack exchange,提问作者Zac B
相关产品推荐
相关产品推荐

