Dav*_*nez 9 compiling arm executable raspberry-pi
我最近买了一个树莓派。我已经配置好了,我在我的桌面上安装了一个用于 arm 的交叉编译器(amd64)。我编译了一个简单的“hello world”程序,然后用scp ./hello david@192.168.1.33:~/hello
. 登录我的 Pi 后,我运行ls -l hello
并得到正常响应:
-rwxr-xr-x 1 david david 6774 Nov 16 18:08 hello
Run Code Online (Sandbox Code Playgroud)
但是当我尝试执行它时,我得到以下信息:
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
Run Code Online (Sandbox Code Playgroud)
如果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 的实现。