在Raspberry Pi上执行交叉编译的程序时,“没有这样的文件或目录”


8

我最近买了Raspberry Pi。我已经配置好了,并且在桌面(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

尝试file helloldd hello发布输出。
goldilocks


您选择了错误的交叉编译器。认为只是在Pi上工作?
托尔比约恩Ravn的安徒生

Answers:


5

如果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的实现。


1

首先使用--staticoption 编译程序,然后对其进行测试。如果它是静态的,那么在树莓派上

cat "programname" | grep "lib*"
/lib/ld-linux.so.3
libc6.so 

然后检查所有库是否在那里

我已经解决了 我有/lib/ld-linux-armhf-so.3,但不是/lib/ld-linux.so.3 那么做ln -s,我再工作之间


1

如何识别问题?

file cross_compiled_executable

包含如下内容:

interpreter /lib/ld-uClibc.so.0

问题是该文件在目标上不存在。

如何解决问题?

使用适当的编译器,或者:

  • 创建磁盘映像的人员必须为您提供交叉编译器,或者确切地告诉您如何构建它,例如,使用crosstool-ng在此询问了如何获取RPI 。
  • 编译自己的映像并交叉编译,例如使用Buildroot。这是一个通用的QEMU示例。Buildroot 具有RPI支持
  • 在目标上使用本机编译器。但是通常目标比主机慢得多,而且空间有限,因此您可能不想这样做。

    您也许还可以使用功能仿真器(例如QEMU)进行构建,然后仅在较慢的平台(例如gem5或慢速板)上运行程序。

仅破解interpreter可能还不够,值得注意的是/proc,如果您尝试使用-static(目标内核可能太旧且不包含必需的接口)。唯一可靠的解决方案是使用正确的工具链。


0

目标系统上的库与可执行文件在其上/针对其编译的主机系统的库不同。

如果使用make,则应在CFLAGS和LDGLAGS中包括--static选项。如果您使用的是直接gcc,请使用--static选项,以便可执行文件具有移植性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.