2010-03-20 26 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中,它似乎工作正常。

再次感謝您對我的幫助。

相關問題