在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:

#!/bin/sh
gcc.bin -m32 $@

/usr/bin/ld:

#!/bin/sh
ld.bin -m elf_i386 $@


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

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

/* test.c */
#include <stdio.h>
int main()
{
    printf("sizeof long is %d\n", sizeof(long));
    return 0;
}
$ gcc test.c
$ file a.out
a.out: ELF 64-bit LSB executable ...
$ ./a.out
sizeof long is 8


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

$ gcc -m32 test.c
$ file a.out
a.out: ELF 32-bit LSB executable ...
$ ./a.out
sizeof long is 4

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

$ sudo apt-get install build-essential module-assistant
$ sudo apt-get install gcc-multilib g++-multilib

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

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

#!/bin/sh
mv -i /usr/bin/gcc /usr/bin/gcc.sh
mv -i /usr/bin/ld  /usr/bin/ld.sh
 
mv -i /usr/bin/gcc.bin /usr/bin/gcc
mv -i /usr/bin/ld.bin  /usr/bin/ld

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

#!/bin/sh
mv -i /usr/bin/gcc /usr/bin/gcc.bin
mv -i /usr/bin/ld  /usr/bin/ld.bin
 
mv -i /usr/bin/gcc.sh /usr/bin/gcc
mv -i /usr/bin/ld.sh  /usr/bin/ld


參考鏈接:

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章