linux - ELF 文件存在于/usr/bin 但结果为 "-ash: file: not found"

标签 linux ubuntu openwrt opkg

我正在尝试使用opkg在openwrt下安装一些新的软件包,并且安装成功,我们可以看到二进制文件确实存在于/usr/bin中,并且我已经进行了lld检查但是转出来一样。如下:

root@OpenWrt /usr/bin [#]# opkg files cfdisk
Package cfdisk (2.25.2-4) is installed on root and has the following files:
/usr/sbin/cfdisk
root@OpenWrt /usr/bin [#]# ls /usr/sbin/
adjtimex                arping                  ethtool                 iptables-save           mkfs.ext3               pppd                    telnetd
airbase-ng              besside-ng              fdisk                   iw                      mkfs.ext4               rate.awk                uhttpd
aireplay-ng             brctl                   hostapd                 iwconfig                modinfo                 rmmod                   wpa_supplicant
airmon-ng               cfdisk                  insmod                  iwlist                  modprobe                samba_multicall         wpad
airmon-zc               chroot                  ip6tables               iwpriv                  nmbd                    smbd                    xtables-multi
airodump-ng             crond                   ip6tables-restore       lsmod                   ntpclient               smbpasswd
airodump-ng-oui-update  dnsmasq                 ip6tables-save          miniupnpd               ntpd                    swapoff
airserv-ng              dropbear                iptables                mke2fs                  odhcp6c                 swapon
airtun-ng               e2fsck                  iptables-restore        mkfs.ext2               pdnsd                   tc
root@OpenWrt /usr/bin [#]# cfdisk
-ash: cfdisk: not found
root@OpenWrt /usr/bin [#]# ./cfdisk
-ash: ./cfdisk: not found
root@OpenWrt /usr/bin [#]# ldd cfdisk
-ash: cfdisk: not found
root@OpenWrt /usr/bin [#]# ldd id
        libcrypt.so.0 => /lib/libcrypt.so.0 (0x77898000)
        libm.so.0 => /lib/libm.so.0 (0x77872000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x7784e000)
        libc.so.0 => /lib/libc.so.0 (0x777e2000)
        ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x778bc000)
root@OpenWrt /usr/bin [#]# export
export HOME='/root'
export LOGNAME='root'
export OLDPWD='/usr'
export PATH='/usr/bin:/usr/sbin:/bin:/sbin'
export PS1='\[\033[35;1m\]\u\[\033[0m\]@\[\033[31;1m\]\h \[\033[32;1m\]$PWD\[\033[0m\] [\[\033[35m\]\#\[\033[0m\]]\[\033[31m\]\$\[\033[0m\] '
export PWD='/usr/bin'
export SHELL='/bin/ash'
export SHLVL='1'
export SSH_CONNECTION='192.168.1.152 29105 192.168.1.1 22'
export SSH_TTY='/dev/pts/0'
export TERM='xterm'
export USER='root'
root@OpenWrt /usr/bin [#]# 

谢谢。

最佳答案

正如@nos 在问题评论中提到的,如果二进制文件链接到您的设备上不存在的 libc,就会发生这种情况。

例如这是我尝试运行使用错误的 libc 构建的二进制文件时得到的输出(请注意,我指定了完整路径 /usr/bin/ldd 因为由于某种原因没有它我得到您在问题中注意到的相同“未找到”错误)。

root@OpenWrt:~# /usr/bin/ldd badbin 
ldd: can't open cache '/etc/ld.so.cache'
checking sub-depends for '/usr/lib/libusb-1.0.so.0'
checking sub-depends for '/lib/libgcc_s.so.1'
checking sub-depends for 'not found'
    libusb-1.0.so.0 => /usr/lib/libusb-1.0.so.0 (0x00000000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00000000)
    libc.so => not found (0x00000000)
    not a dynamic executable

对我来说,问题是我使用错误的工具链构建我的包。我假设 git://git.openwrt.org/openwrt.git 存储库是用于 Chaos Calmer(撰写本文时的当前版本)。但是当然那个repo是开发分支(svn trunk)。我需要改用 git://git.openwrt.org/15.05/openwrt.git

您可以通过检查工具链目录 staging_dir 的名称来确认您正在构建的 libc。 libc 版本是名称的最后一个组成部分(例如,toolchain-mips_34kc+dsp_gcc-4.8-linaro_uClibc-0.9.33.2 使用的是 uClibc-0.9.33.2)。

通过检查 /lib/libc.so* 链接到路由器上的内容,将此版本与路由器上存在的 libc 版本进行比较(运行 ls -l/lib/libc .so*).如果您需要更改工具链使用的 libc 版本,请在 OpenWRT buildroot 中执行 make menuconfig 并在 Advanced configuration options (for developers) 中设置 libc 版本 > -> 工具链选项 -> C 库实现。不过,您可能不需要更改此设置——确保您是从正确的源代码库构建路由器上安装的版本。

关于linux - ELF 文件存在于/usr/bin 但结果为 "-ash: file: not found",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31385121/

相关文章:

linux - 查找列中唯一值的数量

linux - 寄存器地址 - 将第二位(位索引 = 1)的位值更改为 1

linux - 带参数的脚本

linux - 在kgdb中,我无法设置断点

c - sysinfo 系统调用在 Linux 上返回错误的负载平均值

java - UBUNTU - java 编译但未执行 - log4j ClassNotFoundException

php - Phalcon.ini 在 phpifo 中加载但 phalcon 没有安装

linux - 网络感知 wx.FileDialog

snmp - 通过 SNMP 访问路由表

c++ - 配置OpenWrt进行socket编程的问题