我已经使用 Optware 在基于 ARM 的 NAS 上安装软件包已有一段时间了 - 通常的东西,如 Transmission、Samba 等。然而,我在启动后不久就遇到了变速箱挂起的问题。我四处寻找解决方案一段时间,最后发现我使用的 Optware feed 不是为我的 NAS 盒子设置的。我切换了源并重新安装了所有软件包,但现在当我尝试运行重新安装的任何内容时,出现以下错误:
$ smbd
-bash: /opt/sbin/smbd: No such file or directory
$ transmission-daemon
-bash: /opt/bin/transmission-daemon: No such file or directory
$ unrar
-bash: /opt/bin/unrar: No such file or directory
我检查了一下/opt/bin
,/opt/sbin
可执行文件肯定在那里 - 那么真正的问题是什么?
$ ldd /opt/bin/transmission-daemon
/usr/bin/ldd: line 116: /opt/bin/transmission-daemon: No such file or directory
$ file /opt/bin/transmission-daemon
/opt/bin/transmission-daemon: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), stripped
$ readelf - l /opt/sbin/smbd
readelf: error while loading shared libraries: libc.so.0: cannot open shared object file: No such file or directory
$ cat /proc/$$/maps
…
40084000-4019e000 r-xp 00000000 09:01 112594 /lib/libc-2.7.so
…
我不确定这是什么意思,但它证明了该文件是在那里,对吗?或者这与共享库有关?
答案1
当您无法执行依赖于“加载器”的文件时,您收到的错误可能涉及加载器而不是您正在执行的文件。
- 动态链接的本机可执行文件的加载器是系统中负责加载动态库的部分。它类似于
/lib/ld.so
或/lib/ld-linux.so.2
,并且应该是一个可执行文件。 - 脚本的加载器是 shebang 行中提到的程序,例如
/bin/sh
以 . 开头的脚本#!/bin/sh
。
该错误消息相当具有误导性,没有表明加载程序是问题所在。不幸的是,解决这个问题很困难,因为内核接口只有报告数字错误代码的空间,而没有空间指示该错误实际上涉及不同的文件。有些 shell 自己为脚本做这些工作(读取#!
脚本上的行并重新计算错误条件),但我见过没有一个 shell 尝试对本机二进制文件执行相同的操作。
ldd
也不适用于二进制文件,因为它通过设置一些特殊的环境变量然后运行程序,让加载程序完成工作来工作。strace
也不会提供任何有意义的信息,因为它不会报告超出内核报告的内容,并且正如我们所见,内核无法报告它所知道的所有信息。
此处,您重新安装的可执行文件(smbd
、transmission-daemon
等)正在请求系统上不存在的加载程序。因此,您的新提要也不适合您的系统。
当您尝试为正确的系统(或系统系列)和超体系结构运行二进制文件,但为错误的子体系结构运行二进制文件时,通常会出现这种情况。这里,您在需要 ELF 二进制文件的系统上有 ELF 二进制文件,因此内核可以很好地加载它们。它们是在 ARM 处理器上运行的 ARM 二进制文件,因此这些指令是有意义的,并使程序能够查找其加载程序。但这是错误的加载程序。
现在我开始猜测,但我怀疑你的新提要适用于错误的 ARMABI。ABI 是进行过程间调用(尤其是调用库函数)的通用语言。在某些处理器架构上,有几种可能的 ABI 选择,您需要选择一种并始终如一地使用它。目前 Linux 发行版有两种 ARM ABI:传统arm-elf
ABI,和较新的EABI ( arm-eabi
)。您不能在同一系统上混合使用 ABI,因此您需要为您的 ABI 找到软件包源(或为不同的 ABI 重新安装系统)。