许多问题询问如何让M1/M2苹果硅macs安装纯英特尔或纯arm conda环境。
对于如何实现这两种配置,有很好的答案。
经过广泛的研究后,我还没有看到答案的问题是,为什么不可能在一个环境中混合架构。
这是动态加载库(DLL)地狱的一个例子吗?
如果我只想混合二进制文件,那就没问题了。
我应该能够使用哪种架构更有表现力。Rosetta 2应该基于二进制架构进行仿真。
依赖链中的问题是在哪里产生的?我是否可以忽略这些警告,仍然安装混合包,希望它们能像单独的二进制文件一样运行?
发布于 2022-08-05 07:37:56
是的,您可以开始另一个体系结构的单独进程,并通过管道甚至共享内存与其对话。但不打电话去图书馆。
对此没有调用约定,也无法确定在从x86代码跳转或调用之后哪些ARM64寄存器应该得到什么值,反之亦然。(在一般情况下,对于各种函数来说,这可能是一个不可解决的问题,在x86-64 System中,我认为在寄存器中传递的for要比ARM64多,而且您不知道在蹦床/shim/包装器中加载哪个堆栈arg到FP寄存器中,这样做甚至是合理的,因为被调用的ARM64代码也是从x86-64机器代码编译的本地ARM64代码。您实际上没有x86-64寄存器,尽管ARM64确实具有与整数和向量regs Rosetta-2支持的相同宽度的寄存器(而不是AVX)。
仿真是在一个完整的进程级别上,对于整个进程的所有虚拟地址空间。不是在每个函数级别上将单个函数移植到标准的ARM64调用约定。不同的ABI(类型的大小和对齐以及结构布局)也是一个问题。
如果Rosetta-2没有完全提前重新编译,也就是说,如果有任何运行时组件,比如JVM JIT如何编译,但仍然在VM中运行代码,那么当从ARM64进程调用x86-64函数时,这也必须启动。
https://stackoverflow.com/questions/73243700
复制相似问题