2010-03-20 24 views
0

我最初认为64位指令不适用于OS-X 10.5。64位代码如何在OS-X 10.5上工作?

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

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

我似乎工作。

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

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

回答

2

只是为了使这个完全清楚,这里是32位和64位可执行文件在OS X的情况:32位和64位的用户空间的可执行文件可以在32运行

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

  • 用户空间系统库和框架内置六十四分之三十二位脂肪对10.5和10.6。无论您是在构建32位,64位还是两者,您都可以正常关联它们。一些库(基本上是POSIX层)在10.4上也被构建为32/64位的fat,但其中很多不是。

  • 在10.6,构建工具在默认情况下产生64位可执行文件。在10.5和更早版本上,默认值是32位。

  • 在10.6,这是建立脂肪会在默认情况下运行64位侧的可执行文件。在10.5及更早版本中,默认情况下执行32位侧。

  • 您可以随时手动指定使用arch命令中使用的脂肪可执行的切片。例如。 arch -arch i386 someCommandToRunThatIWantToRunIn32BitMode。对于应用程序包,您可以从命令行启动它们,或者如果您在应用程序上“获取信息”,则有一个首选项。

  • OS X和Linux使用64位可执行的LP64模式。指针和long是64位宽,int仍然是32位,并且long long仍然是64位。 (Windows使用LLP64型号 - long在64位Windows中为32位宽)。

+0

看起来你彻底地回答了这个问题。谢谢。如果您有时间,请跟进:您如何使用LP64模型 - 是gcc选项? – philcolbourn 2010-03-23 09:58:18

+0

使用LP64模型(OS X,Linux等)的系统上的任何编译器都将默认使用该模型生成64位代码。如果他们不这样做,这将导致用不同编译器构建的程序之间的不兼容。所使用的64位模型是系统ABI的属性,而不是您(通常)需要通过编译器开关更改的内容。 – 2010-03-23 14:33:51

2

Mac OS X 10.5支持64位用户登陆应用程序非常好。事实上,Xcode在10.5兼容体系结构中运行在64位。

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

0

Meta:我不喜欢看到删除的答案。我想这已经在某个地方讨论过了。

无论如何,KennyTM和其他类型的鞋底让我开始了,尽管一个答案被删除了,但我赞赏你的努力。

  1. 它看起来像这样有望在Mac上的行为,它甚至似乎在32位Linux以及工作(虽然我没有经过广泛的测试)

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

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

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

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

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

总之,这是一个复杂的程序,它会对指针进行大量的操作,它在32位和64位模式下的工作原理是一样的。

  1. 问多个问题并不能为您提供所有您想要的答案。

  2. 在我写的Linux中,它似乎工作正常。

再次感谢您对我的帮助。

相关问题