Mengapa seorang executable mengatakan itu tidak ada ketika saya mencoba menjalankannya?

6

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.
Craig Gidney
sumber
2
Mungkin lebih baik ditanyakan di ubuntu.stackexchange.com
Oded
1
Cobals -l ./tagger
Mark Ransom
doldd ./tagger
nos
@MarkRansom ls -ld ./tagger return -rwxr-xr-x 1 pengguna 28938 2010-09-28 15:56 ./tagger
Craig Gidney
1
@ Strilanc Entah 'tagger' adalah symlink ke sesuatu yang tidak ada, Atau Anda telah membuat itu dapat dieksekusi pada sistem lama, dan sistem Anda yang lain tidak lagi dapat mengidentifikasi format itu, atau exe adalah program yang terhubung secara statis yang dimaksudkan untuk arsitektur lain. Jalankan `` ls -l. / Tagger` dan file ./taggeruntuk mempelajari lebih lanjut tentang file.
no

Jawaban:

7

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.

Craig Gidney
sumber
4

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 lfmdikembalikan lfm: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not strippedjadi 64-bit ; periksa output uname -auntuk x86_64di dalamnya, untuk memverifikasi OS adalah 64-bit, juga; i386atau i686berarti 32-bit) (gantilah nama program Anda dengan lfmcontoh-contoh ini, tentu saja).

2) ldd lfmmengembalikan not a dynamic executablepesan aneh (daripada mencetak dependensi perpustakaan bersama), jadi cobalah readelf -l ./lfm | grep ld-linuxuntuk 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 ./lfmharus berfungsi sekarang (tetapi Anda selalu dapat menggunakan readelf -d ./lfmuntuk melihat perpustakaan apa yang diperlukan, dan kemudian memverifikasi bahwa itu tersedia.)

pengguna858789
sumber
Ini saran yang bagus. Jika Anda menggunakan Ubuntu, Anda dapat melakukan pencarian konten paket di packages.ubuntu.com untuk mengetahui paket dan arsitektur yang berisi file yang diperlukan, dan kemudian instal paket. Dalam kasus saya, saya membutuhkan ld-linux 32-bit yang saya instalsudo apt-get install libc6:i386
Tom Shaw
1

Mungkin tagger adalah tautan lunak dan target tautan tidak ada di sana. Reproduksi seperti ini:

$ cp /usr/bin/ld .
$ ln -s ld fff
$ rm ld
$ ./fff
zsh: no such file or directory: ./fff
fschmitt
sumber
Perintah "pico tagger" membuka file (seperti data biner), jadi itu bukan tautan lunak yang sudah basi. Mengedit pertanyaan untuk mencerminkan hal ini.
Craig Gidney
2
@ Strilanc, fileperintah lebih baik untuk ini daripada editor teks. Dalam contoh di atas, hasil keluarannya file fffadalahfff: broken symbolic link to 'ld'
jonescb
file tagger memberikan "tagger: ELF 32-bit LSB yang dapat dieksekusi, Intel 80386, versi 1 (SYSV), terhubung secara dinamis (menggunakan lib bersama), untuk GNU / Linux 2.0.0, tidak dilucuti". Ini mengejutkan, karena LDD mengatakan itu bukan eksekusi dinamis. Pada titik ini saya percaya itu adalah masalah arsitektur yang tidak cocok dan saya harus mengkompilasi ulang pada mesin target.
Craig Gidney
4
ldd mengatakan ini bukan executable terkait dinamis karena executable dikompilasi pada mesin yang sangat lama, menggunakan linker dinamis yang berbeda dari sistem yang Anda coba jalankan. yaitu kesalahan sebenarnya adalah /lib/ld-linux.so.1 (atau versi lain yang tidak Anda miliki) tidak dapat ditemukan.
no
@ Strilanc: Jika Anda menggunakan mesin x86_64, maka itulah jawabannya. Ini adalah output yang agak menyesatkan ...
Daenyth
0

Anda mungkin kehilangan pustaka bersama.

Lakukan 'ldd tagger' untuk melihat daftar perpustakaan yang diperlukan.

% ldd /bin/zsh                                                                                   
libcap.so.2 => /lib/libcap.so.2 (0x00007f50ce8db000)
libdl.so.2 => /lib/libdl.so.2 (0x00007f50ce6d7000)
libm.so.6 => /lib/libm.so.6 (0x00007f50ce201000)
libc.so.6 => /lib/libc.so.6 (0x00007f50cdea0000)
libattr.so.1 => /lib/libattr.so.1 (0x00007f50cdc9b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f50ceaf8000)

Jika salah satu dari mereka hilang, maka tidak akan ada jalan di sebelahnya.

Kristof Provost
sumber
0

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.

M. Tibbits
sumber