在64位的ubuntu,gcc8.2.0的系統上,如何編譯乙個32的程式?
查詢gcc文件可知,編譯64位程式使用-m64選項,例如:
gcc -m64 -o3 index.c -o index //該程式只能在64位機器上執行
編譯32位程式使用-m32選項,例如:
gcc -m32 -o3 index.c -o index //該程式可以在32位或64位機器上執行
但是如果編譯32位系統報如下錯誤:
/usr/bin/ld: skipping incompatible /home/zgl/gcc-8.2.0-exe/lib/gcc/x86_64-pc-linux-gnu/8.2.0/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
此時可能有兩個原因:第一是你安裝gcc時../configure
配置裡面使用了--disable-multilib
,導致沒有安裝系統庫,第二個原因可能是你安裝的gcc-multilib、g++-multilib
庫版本和你的gcc版本不匹配。
嘗試1:
// 比如我gcc-8.2.0版本,使用如下命令安裝multilib的話是安裝的gcc-8.3.0版本
// 有些情況是,安裝完成之後,系統自帶的gcc能使用-m32了,但是自己安裝的gcc還是不能使用
apt-get
install gcc-multilib g++-multilib
或者apt-get
install gcc-8-multilib g++-8-multilib
// 使用apt-get install gcc-8.2-multilib g++-8.2-multilib是不行的
嘗試2:
修改usr/bin/gcc
和/usr/bin/ld
,強制加入m32資訊
經過嘗試了以上方式,我的問題依然沒有解決,於是我刪除了gcc-8.2.0重新安裝讓它支援multilib,安裝命令如下:
wget
wget
wget
wget
tar xzvf gcc-8.2.0.tar.gz
tar -jxvf gmp-6.1.0.tar.bz2
tar -xzvf mpc-1.0.3.tar.gz
tar -jxvf mpfr-3.1.4.tar.bz2
mv gmp-6.1.0 gcc-8.2.0/
mv mpc-1.0.3 gcc-8.2.0/
mv mpfr-3.1.4 gcc-8.2.0/
cd gcc-8.2.0/
// 2.建立軟連線
ln -s gmp-6.1.0/ gmp
ln -s mpc-1.0.3/ mpc
ln -s mpfr-3.1.4/ mpfr
// 3.建立編譯目錄
mkdir gcc-build
cd gcc-build/
// 4.配置configure 此時使用 --enable-multilib安裝
../configure cflags=
"-g3 -gdwarf-2 -o0" cxxflags=
"-g3 -gdwarf-2 -o0" cflags_for_target=
"-g3 -gdwarf-2 -o0" cxxflags_for_target=
"-g3 -gdwarf-2 -o0" --enable-multilib --enable-languages=c,c++,fortran --prefix=/home/zgl/gcc-8.2.0-exe
// 5.編譯安裝
make -j 32
make
install
安裝完成之後我再source gcc,執行gcc -m32 -o3 index.c -o index
便能成功了。
references:
如何在linux 32位機器編譯64位程式
編譯64位程式,不一定要編譯機器是64位的,但是32位機器預設安裝的gcc編譯環境還是不能用來編譯64位程式。編譯64位程式,需要加上 m64編譯器引數,預設安裝的gcc已經支援該引數,但是缺少64位機器指令相關的檔案,所以不能編譯,會出現下面的錯誤 plain view plain copy in...
VirtualBox上安裝64位系統
原來virtualbox安裝64位的系統需要滿足以下條件 1.64位的cpu 2.安裝的系統必須為64位 3.cpu允許硬體虛擬化 前面兩個條件都滿足,那就是第三個條件的問題了。這裡補充說明 硬體虛擬化其實就是cpu的虛擬化技術。intel的叫vt x,amd的叫amd v。支援虛擬技術的cpu帶有...
如何分析64位系統上32位程式的dump
隨著硬體越來越便宜,為了能夠識別大於4g的記憶體,越來越多的電腦使用64位的作業系統,然後現在大多數的軟體還是32位的,64位的系統使用wow64來幫助執行32位的程式。如果乙個64位系統上,32位程式出現crash,得到乙個dump檔案,如果不進行轉換是不能直接用windbg分析的。下面介紹如何處...