title: Ubuntu 64位編譯32位程序
背景
一般情況下,一個平臺上只能編譯當前平臺對應的應用程序,比如,64位平臺編譯64位應用程序,但是隨着64位平臺的普及,多數採用了64位操作系統,而有時又基於某些原因需要編譯出32位的應用程序.
本文旨在說明如何在64位操作系統上編譯出32位應用程序.
準備
- 確認主機爲64位架構的內核,應該輸出爲amd64
$ dpkg --print-architecture #amd64
- 確認打開了多架構支持功能,應該輸出爲i386
$ dpkg --print-foreign-architectures #i386
# 如果沒有,則需要手動打開,依次執行:
$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get dist-upgrade
- 安裝gcc multilab
sudo apt-get install gcc-multilab g++-multilib
用gcc編譯時,需要添加-m32選項,但是在引用外部庫的情況下,需要採用使用-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:
- 創建腳本/usr/bin/ld:
#!/bin/sh
ld.bin -m elf_i386 $@
這樣就保證調用時將需要的參數加上,然後再調用真正的參數.
每次在32位編譯和64位編譯之間切換的時候都要用mv指令移動,會很麻煩,可以用如下腳本來完成:
#!/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
#!/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
執行腳本後,直接採用gcc編譯即可.
參考資料: