Compiling

在 Raspberry Pi 上執行交叉編譯程序時“沒有這樣的文件或目錄”

  • April 29, 2018

我最近買了一個樹莓派。我已經對其進行了配置,並在我的桌面(amd64)上安裝了一個用於 arm 的交叉編譯器。我編譯了一個簡單的“hello world”程序,然後我將它從我的桌面複製到我的 Pi 中scp ./hello david@192.168.1.33:~/hello。登錄我的 Pi 後,我執行ls -l hello並得到正常響應:

-rwxr-xr-x 1 david david 6774 Nov 16 18:08 hello

但是當我嘗試執行它時,我得到以下資訊:

david@raspberry-pi:~$ ./hello
-bash: ./hello: No such file or directory

david@raspberry-pi:~$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x6a926b4968b3e1a2118eeb6e656db3d21c73cf10, not stripped
david@raspberry-pi:~$ ldd hello 
   not a dynamic executable

如果ldd說它不是動態執行檔,那麼它是為錯誤的目標編譯的。

顯然,您確實交叉編譯了它,因為它file是一個 32 位 ARM 執行檔。但是,有不止一種“ARM”架構,因此您的工具鏈可能配置不正確。

如果您使用的是 crosstool-NG,請.config查看CT_ARCH_ARCH. 對於樹莓派,它應該是“armv6j” 1——或者至少,這對我有用。還有其他細節,但我認為這應該足夠了。不幸的是,如果它錯了,你現在必須重建。

IMO 讓交叉編譯器工具鏈工作可能是乏味和令人沮喪的,但是,假設主機不是一個重要因素(它不應該是),在這種情況下它可以完成。Crosstool-ng 使用 TLI 配置器,因此如果您最終不得不嘗試多個建構,請每次都寫下您的選擇,這樣您就知道什麼是有效的。

1我相信 armv7 是一個更常見的拱門(很多手機等),所以如果你只是使用你認為是通用 ARM 交叉編譯器的東西,那可能就是問題所在。這些數字令人困惑,例如,pi 的處理器是ARM11,但是(根據該頁面),ARM11 系列處理器使用 ARMv6 架構——即 ARM11 是 ARMv6 的實現。

引用自:https://unix.stackexchange.com/questions/101429