首頁 > 軟體

64位元Linux不能執行32位元程式的問題解決方案

2020-06-16 17:28:56

問題由來

交叉編譯是嵌入式開發非常重要的(應該說是必須的)一個環節,但是最近在實體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後也經常遇到此問題,所以就寫成部落格備忘,也和遇到同樣問題的同道們分享。


IT145.com E-mail:sddin#qq.com