1. 程式人生 > >linux64平臺上編譯32位程式: GCC編譯選項 -m64 -m32 -mx32

linux64平臺上編譯32位程式: GCC編譯選項 -m64 -m32 -mx32

x86-64 與 IA-64

x86-64一般稱為AMD x86-64,難道x86-64不是Intel首先搞出來的指令集麼?這回的確是AMD乾的,但是用的是Intel 16bits升到32bits向下相容的套路。大致是這樣的:

  • x86:從1978年來的8086處理器開始,就已經出現了x86架構CPU,即32位處理器。
  • x86-64:又簡稱為x64,最初開發為1999年AMD,為了擴充IA64。當時的x86-64架構誕生頗有時代意義,處理器的發展遇到了瓶頸,記憶體定址空間由於受到32位CPU的限制而只能最大到約4G。於是就有了x86-64。後被INTEL所採用。
  • ia-64:其實ia64的歷史早於x86-64x,最初由INTEL和惠普聯合推出。由於ia-64不與32位相容,所以沒有受到重視。直到INTEL採用了AMD的x86-64架構,才正式的批量生產。而後為了日益擴張的計算需求,INTEL重新將IA-64拿出來,釋出了安騰系列伺服器CPU。

  x86-64架構基於x86,是為了讓x86架構CPU相容64位計算而產生的技術。X86-64架構的設計是採用直接簡單的方法將目前的x86指令集擴充套件。這個方法與當初的由16位擴充套件至32位的情形很相似。優點在於使用者可以自行選擇x86平臺或x64平臺,相容性高。

  IA-64則是原生的純64位計算處理器,並且與x86指令不相容。如果想要執行x86指令需要硬體虛擬化支援,而且效率不高。優點在於IA-64架構體系將擁有64位記憶體定址能力,能夠支援更大的記憶體定址空間。並且由於架構的改變,效能比起x86-64的64位相容模式更高更強。 
  所以,IA-64作業系統也是比較少見的,由於只能在INTEL安騰系列處理器及AMD部分伺服器處理器執行,所以主流市場並不常見。而且,這些IA-64架構處理器也不能夠使用x64作業系統。而x86-64處理器則可以自由選擇x86或是x64作業系統。

編譯選項

These `-m’ switches are supported in addition to the above on AMD x86-64 processors in 64-bit environments. 
-m32 
-m64 
-mx32 
Generate code for a 32-bit or 64-bit environment.

  • The -m32 option sets int, long and pointer to 32 bits and generates code that runs on any i386 system.
  • The -m64 option sets int to 32bits and long and pointer to 64 bits and generates code for AMD’s x86-64 architecture.
  • The -mx32 option sets int, long and pointer to 32 bits and generates code for AMD’s x86-64 architecture.

For darwin only the -m64 option turns off the -fno-pic and -mdynamic-no-pic options.

1.c

編譯

執行結果 
-mx32選項編譯出的程式只能在x86-64上執行。