Ubuntu 64位編譯32位程序

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編譯即可.

參考資料:

https://blog.csdn.net/XscKernel/article/details/38045783

https://blog.csdn.net/fengbingchun/article/details/50924311

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