Saya memiliki program yang dikompilasi, sebuah tagger untuk mengidentifikasi bagian-bagian teks, yang mengklaim itu tidak ada.
Ketika saya mencoba menjalankannya melalui baris perintah, saya mendapatkan ini:
user@place:/home/user/explicitRedactedPath$ ls tagger
tagger
user@place:/home/user/explicitRedactedPath$ ./tagger arg and other args
-bash: ./tagger: No such file or directory
Eksekusi ini harus dipanggil oleh skrip yang dibuat, yang merupakan bagaimana saya mengalami masalah ini. Apa alasan kesalahan ini muncul? Saya kehabisan ide tentang cara memperbaikinya.
Catatan:
- OS adalah Ubuntu
- Eksekusi itu disalin dari komputer lain
- File memang memiliki hak eksekusi (ia memberikan pesan yang tidak diizinkan tanpa mereka)
- Saya sudah mencoba menyalin file ke lokasi yang berbeda (masalah yang sama)
- Saya sudah mencoba mengganti file dengan salinan baru (masalah yang sama)
- File itu ada. Membuka dengan pico menunjukkan file dengan data biner.
linux
command-line
ubuntu
Craig Gidney
sumber
sumber
ls -l ./tagger
ldd ./tagger
file ./tagger
untuk mempelajari lebih lanjut tentang file.Jawaban:
Program ini dikompilasi untuk arsitektur yang tidak kompatibel, menghasilkan program yang tidak dapat dieksekusi. Pesan kesalahan yang menyatakan "tidak ada" alih-alih "tidak dapat dieksekusi" hanyalah pesan yang sangat menyesatkan.
Mengkompilasi ulang pada mesin target memperbaiki masalah.
sumber
Saya memiliki masalah yang sangat mirip dengan OP (
./lfm: Command not found.
ketika saya melihatnya dengan benar), dan beberapa jawaban di sini membantu saya mencari cara menjalankan executable saya pada sistem yang berbeda tanpa kompilasi ulang . Inilah cara saya menyarankan diri saya di masa lalu (jika saya pikir masa lalu-saya cukup pintar untuk mendengarkan perubahan):1) Verifikasi bahwa file tersebut bukan tautan yang rusak, bahwa ia memiliki izin yang dapat dieksekusi, dan bahwa Anda tidak mencoba menjalankan yang dapat dieksekusi 64-bit pada OS 32-bit (bagi saya,
file lfm
dikembalikanlfm: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
jadi 64-bit ; periksa outputuname -a
untukx86_64
di dalamnya, untuk memverifikasi OS adalah 64-bit, juga;i386
ataui686
berarti 32-bit) (gantilah nama program Anda denganlfm
contoh-contoh ini, tentu saja).2)
ldd lfm
mengembalikannot a dynamic executable
pesan aneh (daripada mencetak dependensi perpustakaan bersama), jadi cobalahreadelf -l ./lfm | grep ld-linux
untuk mencari tahu di mana executable mengharapkan untuk menemukan ld-linux, yang merupakan loader linux untuk perpustakaan yang terhubung secara dinamis (dalam kasus saya, ini dikembalikan[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
).3) Memeriksa direktori yang ditunjukkan oleh perintah sebelumnya menunjukkan bahwa file ld-linux yang ditunjukkan tidak ada; salin dari mesin program awalnya dikompilasi (atau sistem serupa, jika perlu) ke direktori itu.
4) Coba jalankan lagi program aslinya. (Bekerja untuk saya.) Juga,
ldd ./lfm
harus berfungsi sekarang (tetapi Anda selalu dapat menggunakanreadelf -d ./lfm
untuk melihat perpustakaan apa yang diperlukan, dan kemudian memverifikasi bahwa itu tersedia.)sumber
sudo apt-get install libc6:i386
Mungkin tagger adalah tautan lunak dan target tautan tidak ada di sana. Reproduksi seperti ini:
sumber
file
perintah lebih baik untuk ini daripada editor teks. Dalam contoh di atas, hasil keluarannyafile fff
adalahfff: broken symbolic link to 'ld'
Anda mungkin kehilangan pustaka bersama.
Lakukan 'ldd tagger' untuk melihat daftar perpustakaan yang diperlukan.
Jika salah satu dari mereka hilang, maka tidak akan ada jalan di sebelahnya.
sumber
Jika Anda tidak dapat mengkompilasi ulang, Anda dapat mempertimbangkan menggunakan statifier untuk memetakan yang dapat dieksekusi dinamis menjadi yang terhubung secara statis. Catatan, saya belum mencobanya secara pribadi.
sumber