在64位linux下編譯32位程式

2021-08-14 08:18:02 字數 2375 閱讀 7192

一般情況下我們最好是在乙個平台上編譯本平台的二進位制程式,比如在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位的系統在效能和...