留存備份:
一般情況下我們最好是在乙個平台上編譯本平台的二進位制程式,比如在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
#!/bin/sh
gcc.bin -m32 $@
/usr/bin/ld:
[plain]
view plain
copy
#!/bin/sh
ld.bin -m elf_i386 $@
這樣就保證呼叫時將需要的引數加上,然後再呼叫真正的引數($@表示當前命令的所有引數,也就是把傳給教本的所有引數再傳給真正的命令),經測試可以解決問題。
可以用乙個簡單的c**測試一下:
[cpp]
view plain
copy
/* test.c */
#include
intmain()
[plain]
view plain
copy
$ gcc test.c
$ file a.out
a.out: elf 64-bit lsb executable ...
$ ./a.out
sizeof long is 8
32位編譯執行結果 (在64位系統編譯32位程式需要給 gcc 加 -m32 引數):
[plain]
view plain
copy
$ gcc -m32 test.c
$ file a.out
a.out: elf 32-bit lsb executable ...
$ ./a.out
sizeof long is 4
另外說明下在ubuntu上如果要用 -m32 引數就要
安裝如下的庫:
[plain]
view plain
copy
$ sudo apt-get install build-essential module-assistant
$ sudo apt-get install gcc-multilib g++-multilib
如果每次在32位編譯和64位編譯之間切換的時候都要用mv指令移動,會很麻煩,可以用如下指令碼來完成:
如果要64位編譯那麼就用gcc64.sh
[plain]
view plain
copy
#!/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:
[plain]
view plain
copy
#!/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
在64位linux下編譯32位程式
一般情況下我們最好是在乙個平台上編譯本平台的二進位制程式,比如在32位平台上編譯32位程式而在64位平台上編譯64位程式。現在64位的系統 這裡主要指x86 64系統,包括amd64和intel的em64t 已經開始廣泛的使用起來了,甚至於你現在要是想買32位的處理器根本就沒有。64位的系統在效能和...
在64位linux下編譯32位程式
一般情況下我們最好是在乙個平台上編譯本平台的二進位制程式,比如在32位平台上編譯32位程式而在64位平台上編譯64位程式。現在64位的系統 這裡主要指x86 64系統,包括amd64和intel的em64t 已經開始廣泛的使用起來了,甚至於你現在要是想買32位的處理器根本就沒有。64位的系統在效能和...
在64位linux下編譯32位程式
一般情況下我們最好是在乙個平台上編譯本平台的二進位制程式,比如在32位平台上編譯32位程式而在64位平台上編譯64位程式。現在64位的系統 這裡主要指x86 64系統,包括amd64和intel的em64t 已經開始廣泛的使用起來了,甚至於你現在要是想買32位的處理器根本就沒有。64位的系統在效能和...