在64位linux下编译32位程序
一般情況下我們最好是在一個平臺上編譯本平臺的二進制程序,比如在32位平臺上編譯32位程序而在64位平臺上編譯64位程序。
?? 現(xiàn)在64位的系統(tǒng)(這里主要指x86_64系統(tǒng),包括AMD64和Intel的EM64T)已經(jīng)開始廣泛的使用起來了,甚至于你現(xiàn)在要是想買32位的處理器根本就沒有。64位的系統(tǒng)在性能和處理能力上相對32位系統(tǒng)也都有很大的提高。所以現(xiàn)在很多用戶已經(jīng)選擇使用64位的系統(tǒng)了。
??? 有一些軟件,在安裝過程中需要對部分代碼進行編譯以便在不同的發(fā)布版本都可以很好的運行。那么當(dāng)我們在64位系統(tǒng)上安裝32位的軟件時,它的編譯就會出錯,因為軟件的二進制部分是32位的,但是編譯出來的部分是64位的,所以我們就需要讓我們的64位系統(tǒng)可以編譯32位的程序,并且需要默認(rèn)就是編譯32位的程序。
?? 通過查閱資料,發(fā)現(xiàn)可以使用-m32來使得gcc編譯32位程序(在x86_64系統(tǒng)上),使用-m elf_i386參數(shù)可以使得64位的ld能夠兼容32位的庫,但是編譯時是使用自己的一個命令,所以沒有辦法給他加參數(shù),但是這個命令也是要調(diào)用gcc和ld得,所以我們可以通過修改gcc和ld來解決,也就是將上述的兩個支持32位編譯連接的參數(shù)默認(rèn)給加上去:
?
將/usr/bin/gcc和/usr/bin/ld都改名為*.bin,就是改為: /usr/bin/gcc.bin和/usr/bin/ld.bin
然后寫兩個腳本:
/usr/bin/gcc:
?
[plain]?view plaincopy?
/usr/bin/ld:
?
[plain]?view plaincopy?
? 這樣就保證調(diào)用時將需要的參數(shù)加上,然后再調(diào)用真正的參數(shù)($@表示當(dāng)前命令的所有參數(shù),也就是把傳給教本的所有參數(shù)再傳給真正的命令),經(jīng)測試可以解決問題。
可以用一個簡單的C代碼測試一下:
?
[cpp]?view plaincopy?? 32位編譯執(zhí)行結(jié)果 (在64位系統(tǒng)編譯32位程序需要給 GCC 加 -m32 參數(shù)):
?
?
[plain]?view plaincopy
另外說明下在ubuntu上如果要用 -m32 參數(shù)就要安裝如下的庫:
?
?
[plain]?view plaincopy
?
如果每次在32位編譯和64位編譯之間切換的時候都要用mv指令移動,會很麻煩,可以用如下腳本來完成:
如果要64位編譯那么就用gcc64.sh
?
[plain]?view plaincopy
如果用32位編譯那么就用gcc32.sh:
?
?
[plain]?view plaincopy
參考鏈接:
http://blog.sina.com.cn/s/blog_542ecc79010007gh.html
轉(zhuǎn)載于:https://www.cnblogs.com/zzdbullet/p/9634865.html
總結(jié)
以上是生活随笔為你收集整理的在64位linux下编译32位程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sar命令使用详解
- 下一篇: Linux之父为过去的言行道歉,宣布离开