在64位linux下編譯32位程序


一般情況下我們最好是在一個平台上編譯本平台的二進制程序,比如在32位平台上編譯32位程序而在64位平台上編譯64位程序。

   現在64位的系統(這里主要指x86_64系統,包括AMD64和Intel的EM64T)已經開始廣泛的使用起來了,甚至於你現在要是想買32位的處理器根本就沒有。64位的系統在性能和處理能力上相對32位系統也都有很大的提高。所以現在很多用戶已經選擇使用64位的系統了。

    有一些軟件,在安裝過程中需要對部分代碼進行編譯以便在不同的發布版本都可以很好的運行。那么當我們在64位系統上安裝32位的軟件時,它的編譯就會出錯,因為軟件的二進制部分是32位的,但是編譯出來的部分是64位的,所以我們就需要讓我們的64位系統可以編譯32位的程序,並且需要默認就是編譯32位的程序。

   通過查閱資料,發現可以使用-m32來使得gcc編譯32位程序(在x86_64系統上),使用-m elf_i386參數可以使得64位的ld能夠兼容32位的庫,但是編譯時是使用自己的一個命令,所以沒有辦法給他加參數,但是這個命令也是要調用gcc和ld得,所以我們可以通過修改gcc和ld來解決,也就是將上述的兩個支持32位編譯連接的參數默認給加上去:

 

將/usr/bin/gcc和/usr/bin/ld都改名為*.bin,就是改為: /usr/bin/gcc.bin和/usr/bin/ld.bin

然后寫兩個腳本:

/usr/bin/gcc:

 

[plain]  view plain copy
 
 
 
  1. #!/bin/sh  
  2.   
  3. gcc.bin -m32 $@  

 


/usr/bin/ld:

 

[plain]  view plain copy
 
 
 
  1. #!/bin/sh  
  2.   
  3. ld.bin -m elf_i386 $@  

 

  這樣就保證調用時將需要的參數加上,然后再調用真正的參數($@表示當前命令的所有參數,也就是把傳給教本的所有參數再傳給真正的命令),經測試可以解決問題。

可以用一個簡單的C代碼測試一下:

 

[cpp]  view plain copy
 
 
 
  1. /* test.c */  
  2. #include <stdio.h>  
  3. int main()  
  4. {  
  5.     printf("sizeof long is %d\n", sizeof(long));  
  6.     return 0;  
  7. }  
[plain]  view plain copy
 
 
 
  1. $ gcc test.c  
  2. $ file a.out  
  3. a.out: ELF 64-bit LSB executable ...  
  4. $ ./a.out  
  5. sizeof long is 8  

   32位編譯執行結果 (在64位系統編譯32位程序需要給 GCC 加 -m32 參數):

 

 

[plain]  view plain copy
 
 
 
  1. $ gcc -m32 test.c  
  2. $ file a.out  
  3. a.out: ELF 32-bit LSB executable ...  
  4. $ ./a.out  
  5. sizeof long is 4  


另外說明下在ubuntu上如果要用 -m32 參數就要安裝如下的庫:

 

 

[plain]  view plain copy
 
 
 
  1. $ sudo apt-get install build-essential module-assistant  
  2. $ sudo apt-get install gcc-multilib g++-multilib  


 

如果每次在32位編譯和64位編譯之間切換的時候都要用mv指令移動,會很麻煩,可以用如下腳本來完成:

如果要64位編譯那么就用gcc64.sh

 

[plain]  view plain copy
 
 
 
  1. #!/bin/sh  
  2.   
  3. mv -i /usr/bin/gcc /usr/bin/gcc.sh  
  4. mv -i /usr/bin/ld  /usr/bin/ld.sh  
  5.   
  6. mv -i /usr/bin/gcc.bin /usr/bin/gcc  
  7. mv -i /usr/bin/ld.bin  /usr/bin/ld  


如果用32位編譯那么就用gcc32.sh:

 

 

[plain]  view plain copy
 
 
 
  1. #!/bin/sh  
  2.   
  3. mv -i /usr/bin/gcc /usr/bin/gcc.bin  
  4. mv -i /usr/bin/ld  /usr/bin/ld.bin  
  5.   
  6. mv -i /usr/bin/gcc.sh /usr/bin/gcc  
  7. mv -i /usr/bin/ld.sh  /usr/bin/ld  



參考鏈接:

http://blog.sina.com.cn/s/blog_542ecc79010007gh.html



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM