我最初认为64位指令不适用于OS-X 10.5。
我写了一个小测试程序并用GCC -m64
编译。
我使用long long
作为64位整数。
使用的汇编指令看起来像是64位。例如。 imultq
和movq 8(%rbp),%rax
。
我似乎工作。
我只使用printf
使用%lld
显示64位值。
gotcha's
?答案 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)
无论如何,KennyTM和另一种鞋底让我开始了,虽然一个答案被删除,但我很感激你的努力。
看起来这是Mac上的预期行为,它甚至似乎也适用于32位Linux(虽然我没有进行过广泛的测试)
是的。对于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位模式下的工作方式相同。
提出多个问题并不能为您提供所需的全部答案。
正如我所写,它似乎在Linux上有效。
再次感谢您帮助我。