GNU/Linux >> Belajar Linux >  >> Linux

“Tidak Ada File Atau Direktori Tersebut” Terletak Pada Binari yang Dipasang Optware?

Saya telah menggunakan Optware untuk menginstal paket pada NAS berbasis ARM saya untuk sementara waktu – hal-hal biasa seperti Transmisi, Samba, dan lainnya. Namun, saya mengalami masalah dengan Transmisi yang macet tidak lama setelah memulai. Saya mencari solusi untuk sementara waktu dan akhirnya menemukan bahwa umpan Optware yang saya gunakan bukan yang telah disiapkan untuk kotak NAS saya. Saya mengganti feed dan menginstal ulang semua paket, tetapi sekarang saya mendapatkan kesalahan berikut ketika saya mencoba dan menjalankan apa pun yang diinstal ulang:

$ 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

Saya memeriksa /opt/bin dan /opt/sbin dan executablenya pasti ada – jadi apa masalah sebenarnya?

$ 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
…

Saya tidak yakin apa artinya semua itu, tetapi ini membuktikan bahwa file tersebut adalah di sana, kan? Atau apakah ini ada hubungannya dengan lib bersama?

Jawaban yang Diterima:

Saat Anda gagal mengeksekusi file yang bergantung pada "loader", kesalahan yang Anda dapatkan mungkin merujuk ke loader, bukan file yang Anda jalankan.

  • Pemuat executable asli yang ditautkan secara dinamis adalah bagian dari sistem yang bertanggung jawab untuk memuat pustaka dinamis. Ini seperti /lib/ld.so atau /lib/ld-linux.so.2 , dan harus berupa file yang dapat dieksekusi.
  • Pemuat skrip adalah program yang disebutkan pada baris Shebang, mis. /bin/sh untuk skrip yang dimulai dengan #!/bin/sh .

Pesan kesalahan agak menyesatkan karena tidak menunjukkan bahwa pemuat adalah masalahnya. Sayangnya, memperbaikinya akan sulit karena antarmuka kernel hanya memiliki ruang untuk melaporkan kode kesalahan numerik, bukan juga untuk menunjukkan bahwa kesalahan sebenarnya menyangkut file yang berbeda. Beberapa shell bekerja sendiri untuk skrip (membaca #! baris pada skrip dan mengerjakan kembali kondisi kesalahan), tetapi tidak ada yang saya lihat mencoba melakukan hal yang sama untuk binari asli.

ldd tidak bekerja pada binari baik karena bekerja dengan mengatur beberapa variabel lingkungan khusus dan kemudian menjalankan program, membiarkan loader melakukan pekerjaan. strace juga tidak akan memberikan informasi yang berarti, karena tidak akan melaporkan lebih dari yang dilaporkan oleh kernel, dan seperti yang telah kita lihat, kernel tidak dapat melaporkan semua yang diketahuinya.

Di sini executable Anda yang diinstal ulang (smbd , transmission-daemon , dll) meminta pemuat yang tidak ada di sistem Anda. Jadi, umpan baru Anda juga tidak cocok untuk sistem Anda.

Terkait:Linux – Sesuaikan kecepatan kipas melalui Fancontrol sesuai dengan suhu hard disk (Hddtemp)?

Situasi ini sering muncul ketika Anda mencoba menjalankan biner untuk sistem yang benar (atau keluarga sistem) dan superarsitektur tetapi subarsitektur yang salah. Di sini Anda memiliki binari ELF pada sistem yang mengharapkan binari ELF, jadi kernel memuatnya dengan baik. Mereka adalah binari ARM yang berjalan pada prosesor ARM, jadi instruksinya masuk akal dan membawa program ke titik di mana ia dapat mencari pemuatnya. Tapi itu pemuat yang salah.

Sekarang saya mulai menebak-nebak, tapi saya curiga feed baru Anda adalah untuk ARM ABI yang salah. ABI adalah bahasa umum untuk membuat panggilan antar-prosedur, dan khususnya untuk memanggil fungsi perpustakaan. Pada beberapa arsitektur prosesor, ada beberapa kemungkinan pilihan ABI, dan Anda harus memilih satu dan menggunakannya secara konsisten. Ada dua ARM ABI dengan distribusi Linux di luar sana:arm-elf tradisional ABI, dan EABI yang lebih baru (arm-eabi ). Anda tidak dapat menggabungkan ABI pada sistem yang sama, jadi Anda perlu mencari sumber paket untuk ABI Anda (atau menginstal ulang sistem Anda untuk ABI yang berbeda).


Linux
  1. Tidak dapat membuat exec Tidak ada file atau direktori seperti itu [Fix]

  2. Python – Tidak Ada File Atau Direktori Seperti Itu Tapi Saya Bisa Melihatnya!?

  3. Jadikan Ls Bedakan Script Dari Biner Di Output?

  1. Tidak Dapat Menghapus File Pada Partisi Ntfs, Event Sebagai Root?

  2. Shopt:Tidak Ditemukan [Tidak Ada File Atau Direktori]

  3. Lihat file tabular seperti CSV dari baris perintah

  1. 'SDL.h tidak ada file atau direktori yang ditemukan' saat kompilasi

  2. Bash:Tidak ada file atau direktori seperti itu?

  3. sys/types.h:Tidak ada file atau direktori tersebut