2015-07-13 1 views
5

Ich versuche, ein neues Softwarepaket unter openwrt mit opkg zu installieren, und die Installation war erfolgreich, und wir können die sehen Binärdatei existiert wirklich in der/usr/bin, und ich habe die lld-Prüfung trird, aber stellt sich heraus, die gleiche. wie unten:ELF-Datei existiert in/usr/bin, aber stellt sich heraus "-ash: file: not found"

[email protected] /usr/bin [#]# opkg files cfdisk 
Package cfdisk (2.25.2-4) is installed on root and has the following files: 
/usr/sbin/cfdisk 
[email protected] /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 
[email protected] /usr/bin [#]# cfdisk 
-ash: cfdisk: not found 
[email protected] /usr/bin [#]# ./cfdisk 
-ash: ./cfdisk: not found 
[email protected] /usr/bin [#]# ldd cfdisk 
-ash: cfdisk: not found 
[email protected] /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) 
[email protected] /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' 
[email protected] /usr/bin [#]# 

danke.

+1

Ihre cfdisk-Binärdatei ist wahrscheinlich mit einem dynamischen Linker verknüpft, der nicht existiert (dh etwas anderes als ld-uClibc.so.0) Führen Sie 'readelf -a' auf Ihrer Binärdatei aus, suchen Sie nach dem" Programminterpreter " – nos

+0

danke @ nein, das readelf hat noch nicht installiert..kann ich diese datei in mein ubuntu-system kopieren, das readelf hat, dann check es aus? und ich denke, dass es wahrscheinlich durch linux version verursacht wurde. übrigens, die "ld-uClibc.so.0 "ist von der" id "als 'lld id' Befehl nur für die Vergleiche mit' ldd cfdisk'. – coder

+0

Sicher, führe readelf auf der Binärdatei, wo immer du willst. Ich sage, da 'ldd id'' ld-uClibc.so.0' anzeigt, dann existiert diese bestimmte Bibliothek. und wahrscheinlich verwendet Ihre cfdisk das nicht, sondern einen anderen dynamischen Linker, der auf Ihrem Rechner nicht existiert. Möglicherweise weil cfdisk mit einer anderen Version von uClibc oder einer anderen C-Bibliothek kompiliert wurde. – nos

Antwort

1

Wie von @nos in den Kommentaren zu der Frage erwähnt, kann dies passieren, wenn binary mit einer libc verbunden ist, die nicht auf Ihrem Gerät existiert.

z.B. Dies ist die Ausgabe, die ich erhalte, wenn ich versuche, eine Binärdatei mit der falschen libc zu erzeugen (beachte, dass ich den vollständigen Pfad /usr/bin/ldd anführe, weil ich aus irgendeinem Grund den gleichen "nicht gefunden" -Fehler erhielt, den Sie in Ihrer Frage notieren).

[email protected]:~# /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 

Für mich war das Problem, dass ich mein Paket mit der falschen Toolchain baute. Ich hatte angenommen, dass das Repertoire git://git.openwrt.org/openwrt.git für Chaos Calmer (die aktuelle Version zum Zeitpunkt des Schreibens) war. Aber natürlich ist das Repo der Entwicklungszweig (svn trunk). Ich musste stattdessen git://git.openwrt.org/15.05/openwrt.git verwenden.

Sie können bestätigen, welche libc Sie erstellen, indem Sie den Namen des Toolchain-Verzeichnisses staging_dir überprüfen. Die libc-Version ist die letzte Komponente des Namens (z. B. toolchain-mips_34kc+dsp_gcc-4.8-linaro_uClibc-0.9.33.2 verwendet uClibc-0.9.33.2).

Vergleichen Sie diese Version mit der Version von libc, die auf Ihrem Router vorhanden ist, indem Sie überprüfen, was /lib/libc.so* Links zu auf Ihrem Router (Lauf ls -l /lib/libc.so*). Wenn Sie die von Ihrer Toolchain verwendete libc-Version ändern müssen, dann führen Sie make menuconfig im Build-Verzeichnis OpenWRT aus und stellen Sie die libc-Version unter Advanced configuration options (for developers) ->Toolchain Options ->C Library implementation ein. Sie sollten diese Einstellung wahrscheinlich nicht ändern müssen - stellen Sie sicher, dass Sie das richtige Quell-Repository für die auf Ihrem Router installierte Version erstellen.

+0

yeah, es funktioniert endlich, indem ich die gcc-version zusammenarbeite, vielen Dank übrigens, ich habe andere Tools für meinen Router mit dem neuesten gcc erstellt und es funktioniert, indem ich gcc-Option -Wl, -rpath,/boxer/lib -Wl hinzufüge , - dynamic-linker,/boxer/lib/ld-linux.so.3 und lege die libc.so etc in einen günstigen Platz wie/boxer/lib/* – coder

Verwandte Themen