1. 程式人生 > >64位linux不能執行32位程式,問題解決方案

64位linux不能執行32位程式,問題解決方案

問題由來

交叉編譯是嵌入式開發非常重要的(應該說是必須的)一個環節,但是最近在實體Linux機器上使用交叉編譯工具卻經常遇到一個問題:交叉編譯工具版本正確,安裝步驟正確,環境變數設定也正確,但是在執行arm-linu-gcc -v時卻一直報bash: /opt/arm-2009q3/bin/arm-linux-gcc: 沒有那個檔案或目錄的錯誤,很是鬱悶,一番google終於發現了問題原因:我的Linux是64位的,但是交叉編譯工具是32位的,因此不能執行。
用file命令檢視arm-none-linux-gnueabi-gcc 會出現如下資訊。

arm-none-linux-gnueabi-gcc
: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, stripped

而我的作業系統 uname -a

Linux kevin-TP 4.4.0-36-generic #55-Ubuntu SMP Thu Aug 11 18:01:55 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

解決方案

1、自己編譯適合自己系統的交叉編譯工具,覺得太麻煩,遂放棄。
2、尋找64位的交叉編譯工具,由於我的交叉編譯工具是開發板廠商提供的,很多DEMO都是由它編譯出來的,如果自己更換如果編譯途中出現錯誤很難確定是交叉編譯工具的問題還是程式碼的問題,風險較高,放棄。
3、重新安裝32位的linux,由於筆者需要編譯Android原始碼,編譯過的都知道,硬碟空間至少40G,記憶體要16G+,而32位系統只能管理4G的記憶體空間,如果重新安裝32位linux將會使本子的效能大打折扣,也放棄了。
4、最後一種方式就是在64位機器上安裝32位程式執行庫,由於64位CPU相容32位指令集,因此此方式最為合適。

安裝32位執行庫

ubuntu(debain系列)的linux可以按照以下方式安裝。(注意前邊的命令提示符是’#’也就是說我是用root執行的,如果不願意用root執行的話需要加 sudo)
# dpkg –add-architecture i386
#apt install libc6:i386

測試

安裝完成後,重新執行arm-linux-gcc -v
那久違的大坨版本資訊出現,OK,問題解決。

後記

這個問題經常遇到,又經常忘記,身邊的朋友在我的慫恿之下把本子換成linux後也經常遇到此問題,所以就寫成部落格備忘,也和遇到同樣問題的同道們分享。