2015-07-13 24 views
5

Tôi đang cố gắng cài đặt một số gói phần mềm mới dưới openwrt sử dụng opkg và cài đặt đã thành công và chúng ta có thể thấy tập tin nhị phân thực sự tồn tại trong/usr/bin, và tôi có trird kiểm tra lld nhưng hóa ra giống nhau. như sau:Tệp ELF tồn tại trong/usr/bin nhưng hóa ra "-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 [#]# 

cảm ơn.

+1

Mã nhị phân cfdisk của bạn có thể liên kết với một trình liên kết động không tồn tại (ví dụ: ld-uClibc.so.0) Chạy 'readelf -a' trên nhị phân của bạn, tìm" interpreter interpreter " – nos

+0

thanks @ nos, readelf đã không cài đặt được nêu ra .... tôi có nên sao chép tập tin đó vào phù thủy hệ thống ubuntu của tôi đã đọc sau đó kiểm tra xem nó ra? và tôi nghĩ rằng nó có thể gây ra bởi phiên bản linux.by cách, "ld-uClibc.so.0 "là từ" id "như lệnh' lld id' chỉ để so sánh với 'ldd cfdisk'. – coder

+0

Chắc chắn, hãy chạy chính mình trên hệ nhị phân bất cứ nơi nào bạn muốn. Tôi nói rằng kể từ khi 'ldd id' hiển thị' ld-uClibc.so.0' thì thư viện đó tồn tại. và, cfdisk của bạn có thể không sử dụng, nhưng một số liên kết động khác không tồn tại trên máy của bạn. Có thể do cfdisk được biên dịch với một phiên bản khác của uClibc hoặc một thư viện C khác. – nos

Trả lời

1

Như đã đề cập bởi @nos trong các nhận xét về câu hỏi, điều này có thể xảy ra nếu nhị phân được liên kết với một libc không tồn tại trên thiết bị của bạn.

ví dụ: Đây là đầu ra tôi nhận được khi tôi cố gắng chạy một nhị phân được xây dựng với libc sai (lưu ý rằng tôi chỉ định đường dẫn đầy đủ /usr/bin/ldd vì không có lý do đó tôi gặp lỗi "không tìm thấy" bạn lưu ý trong câu hỏi của mình).

[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 

Đối với tôi vấn đề là tôi đang xây dựng gói của mình bằng cách sử dụng sai chuỗi công cụ. Tôi giả định rằng repo git://git.openwrt.org/openwrt.git là dành cho Chaos Calmer (bản phát hành hiện tại tại thời điểm viết bài). Nhưng tất nhiên là repo là chi nhánh phát triển (svn trunk). Tôi cần sử dụng git://git.openwrt.org/15.05/openwrt.git để thay thế.

Bạn có thể xác nhận libc bạn đang xây dựng bằng cách kiểm tra tên của thư mục chuỗi công cụ staging_dir. Phiên bản libc là thành phần cuối cùng của tên (ví dụ: toolchain-mips_34kc+dsp_gcc-4.8-linaro_uClibc-0.9.33.2 đang sử dụng uClibc-0.9.33.2).

So sánh phiên bản này với phiên bản libc hiện có trên bộ định tuyến của bạn bằng cách kiểm tra những liên kết /lib/libc.so* trên bộ định tuyến của bạn (chạy ls -l /lib/libc.so*). Nếu bạn cần thay đổi phiên bản libc được sử dụng bởi toolchain của bạn thì hãy thực hiện make menuconfig trong trình xây dựng OpenWRT và đặt phiên bản libc trong Advanced configuration options (for developers) ->Toolchain Options ->C Library implementation. Bạn có lẽ không cần phải thay đổi thiết lập này mặc dù - hãy chắc chắn rằng bạn đang xây dựng từ repo nguồn chính xác cho phiên bản được cài đặt trên bộ định tuyến của bạn.

+0

vâng, cuối cùng nó hoạt động bằng cách kết hợp phiên bản gcc, cảm ơn rất nhiều! Tôi đã xây dựng các công cụ khác cho bộ định tuyến của mình bằng gcc mới nhất và hoạt động bằng cách thêm tùy chọn gcc -Wl, -rpath,/boxer/lib -Wl , - dynamic-linker,/boxer/lib/ld-linux.so.3 và đặt libc.so v.v. vào một nơi đắt tiền như/boxer/lib/* – coder