/usr/bin 中存在 ELF 文件,但结果为“-ash:文件:未找到”
ELF file exists in /usr/bin but turns out "-ash: file: not found"
我正在尝试使用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='\[3[35;1m\]\u\[3[0m\]@\[3[31;1m\]\h \[3[32;1m\]$PWD\[3[0m\] [\[3[35m\]\#\[3[0m\]]\[3[31m\]$\[3[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
因为由于某种原因没有它我得到了相同的 "not found" 您在问题中记下的错误)。
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 t运行k)。我需要改用 git://git.openwrt.org/15.05/openwrt.git
。
您可以通过检查工具链目录的名称来确认您正在构建的 libc staging_dir
。 libc 版本是名称的最后一个组成部分(例如 toolchain-mips_34kc+dsp_gcc-4.8-linaro_uClibc-0.9.33.2
使用 uClibc-0.9.33.2)。
通过检查路由器上的 /lib/libc.so*
链接 (运行 ls -l /lib/libc.so*
),将此版本与路由器上存在的 libc 版本进行比较。如果您需要更改工具链使用的 libc 版本,请在 OpenWRT buildroot 中执行 make menuconfig
并在 Advanced configuration options (for developers)
-> Toolchain Options
-> C Library implementation
中设置 libc 版本。不过,您可能不需要更改此设置——确保您是从正确的源代码库构建路由器上安装的版本。
我正在尝试使用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='\[3[35;1m\]\u\[3[0m\]@\[3[31;1m\]\h \[3[32;1m\]$PWD\[3[0m\] [\[3[35m\]\#\[3[0m\]]\[3[31m\]$\[3[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
因为由于某种原因没有它我得到了相同的 "not found" 您在问题中记下的错误)。
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 t运行k)。我需要改用 git://git.openwrt.org/15.05/openwrt.git
。
您可以通过检查工具链目录的名称来确认您正在构建的 libc staging_dir
。 libc 版本是名称的最后一个组成部分(例如 toolchain-mips_34kc+dsp_gcc-4.8-linaro_uClibc-0.9.33.2
使用 uClibc-0.9.33.2)。
通过检查路由器上的 /lib/libc.so*
链接 (运行 ls -l /lib/libc.so*
),将此版本与路由器上存在的 libc 版本进行比较。如果您需要更改工具链使用的 libc 版本,请在 OpenWRT buildroot 中执行 make menuconfig
并在 Advanced configuration options (for developers)
-> Toolchain Options
-> C Library implementation
中设置 libc 版本。不过,您可能不需要更改此设置——确保您是从正确的源代码库构建路由器上安装的版本。