64位代码如何在OS-X 10.5上运行?

时间:2010-03-20 07:20:32

标签: macos gcc 32bit-64bit

我最初认为64位指令不适用于OS-X 10.5。

我写了一个小测试程序并用GCC -m64编译。 我使用long long作为64位整数。

使用的汇编指令看起来像是64位。例如。 imultqmovq 8(%rbp),%rax

我似乎工作。

我只使用printf使用%lld显示64位值。

  1. 这是预期的行为吗?
  2. 是否有导致此失败的gotcha's
  3. 我可以在一个问题中提出多个问题吗?
  4. 这适用于其他操作系统吗?

3 个答案:

答案 0 :(得分:2)

Mac OS X 10.5非常适合支持64位用户级应用程序。实际上,Xcode在兼容架构上以10.5位运行在10.5位。

只有内置应用程序(Finder,Safari,框架,守护进程等)在10.6中也有64位版本。

答案 1 :(得分:2)

为了使这一点完全清楚,以下是OS X上32位和64位可执行文件的情况:

  • 32位和64位用户空间可执行文件都可以在OS X 10.6中的32位和64位内核上运行,无需仿真。在10.4和10.5上,32位和64位可执行文件都可以在32位内核上运行。 (在Windows上不是这样)

  • 用户空间系统库和框架在10.5和10.6上构建为32/64位胖。无论您是为32位,64位还是两者构建,都可以正常链接它们。一些库(基本上是POSIX层)也在10.4上构建了32/64位胖,但其中很多都不是。

  • 在10.6上,构建工具默认生成64位可执行文件。在10.5及更早版本中,默认值为32位。

  • 在10.6上,构建为fat的可执行文件默认情况下将运行64位端。在10.5及更早版本中,默认情况下会执行32位端。

  • 您始终可以使用arch命令手动指定要使用的胖可执行文件的哪个片段。例如。 arch -arch i386 someCommandToRunThatIWantToRunIn32BitMode。对于应用程序包,您可以从命令行启动它们,或者如果您在应用程序上“获取信息”,则会有首选项。

  • OS X和Linux将LP64模型用于64位可执行文件。指针和long为64位宽,int仍为32位,long long仍为64位。 (Windows使用LLP64模型 - long在64位Windows中为32位宽。)

答案 2 :(得分:0)

Meta:我不希望看到答案被删除。我想这已在某处讨论过了。

无论如何,KennyTM和另一种鞋底让我开始了,虽然一个答案被删除,但我很感激你的努力。

  1. 看起来这是Mac上的预期行为,它甚至似乎也适用于32位Linux(虽然我没有进行过广泛的测试)

  2. 是的。对于32(-m32)和64(-m64)位模式,GCC表现不同(至少在我有限的观察中)。在32位中,我能够使用数组访问变量参数。在64位模式下,这不起作用。

  3. 我了解到你必须使用stdarg.h定义的va_list访问变量参数,因为它可以在两种模式下工作。

    现在我有一个命令行程序在Mac OS-X上以32位和64位模式运行并传递我的所有测试用例。

    该程序实现了一个链表垃圾收集器,从全局列表中扫描16字节对齐的malloc分配对象以及机器寄存器和堆栈 - 实际上,在64位模式下有额外的寄存器,所以我还有一点要做的工作。

    对象是32或64位字的集合,它们链接在一起形成类似LISP / Scheme的数据结构。

    总之,它是一个复杂的程序,它可以很好地处理指针,并且它在32位和64位模式下的工作方式相同。

    1. 提出多个问题并不能为您提供所需的全部答案。

    2. 正如我所写,它似乎在Linux上有效。

    3. 再次感谢您帮助我。