GNU/Linux >> Belajar Linux >  >> Linux

Apa yang Dirujuk oleh Penerjemah yang Dilaporkan Oleh `file`?

Saya mencoba menjalankan perl dapat dieksekusi disediakan oleh perpustakaan debug di Ubuntu 16.04, tetapi untuk beberapa alasan file “tidak dapat dieksekusi” meskipun tampaknya cocok untuk arsitektur saya.

perl executable yang dikirimkan dengan Ubuntu 16.04 dilucuti

$ nm /usr/bin/perl
nm: /usr/bin/perl: no symbols

perl-debug paket menyediakan perl di bawah /usr/lib/debug yang tidak dilucuti.

$ nm /usr/lib/debug/usr/bin/perl | head
                 U [email protected]@GLIBC_2.2.5
0000000000589020 r AboveLatin1_invlist
                 U [email protected]@GLIBC_2.2.5
                 U [email protected]@GLIBC_2.2.5
000000000058e002 r a_hash.16944
                 U [email protected]@GLIBC_2.2.5
000000000058e010 r an_array.16943
00000000005795c0 r ASCII_invlist
0000000000543430 T ASCII_TO_NEED
                 U [email protected]@GLIBC_2.2.5

Namun, ketika Anda mencoba menjalankannya, exec* gagal dan bash memberi Anda pesan yang bagus:

$ /usr/lib/debug/usr/bin/perl
bash: /usr/lib/debug/usr/bin/perl: cannot execute binary file: Exec format error

Ketika saya menjalankan file pada dua perl, saya melihat bahwa perl debug ditandai sebagai "memiliki juru bahasa kosong" di mana perl biasa memiliki beberapa objek bersama ld. Mungkin ada hubungan dengan tautan ld , tapi saya tidak tahu apa itu.

$ file /usr/bin/perl
/usr/bin/perl: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=e6106890a64a3316b2adfc04bbf202f13f82b5bb, stripped
$ file /usr/lib/debug/usr/bin/perl
/usr/lib/debug/usr/bin/perl: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter *empty*, for GNU/Linux 2.6.32, BuildID[sha1]=e6106890a64a3316b2adfc04bbf202f13f82b5bb, not stripped

Apa sebenarnya file memberi tahu saya ketika dilaporkan bahwa penerjemah kosong?

Jawaban yang Diterima:

Perl-debug perl adalah untuk digunakan dengan (misalnya) GDB, berisi simbol untuk memahami proses yang sedang berjalan atau membuang perl lainnya . Misalnya, diberikan proses yang berjalan perl script.pl dengan pid $PID , Anda dapat menggunakan:

$ gdb /usr/lib/debug/usr/bin/perl $PID

untuk melampirkannya, dan melakukan semua hal GDB yang biasa pada saat itu. Ini bukan executable runnable sendiri dan tidak memiliki elemen yang diperlukan untuk diluncurkan.

Simbol disimpan secara terpisah karena lebih dari dua kali ukuran executable utama dan sangat jarang dibutuhkan. Dalam hal ini, simbol berguna untuk men-debug perl , daripada men-debug skrip Perl, dan mungkin hanya berguna jika Anda mengembangkan ekstensi untuk ditautkan.

Saya tidak berpikir pengaturan bit yang dapat dieksekusi sebenarnya diperlukan, tetapi Debian tidak menghapusnya dari file simbol debug yang saya lihat sehingga mungkin ada beberapa situasi yang membutuhkannya. file memberi tahu Anda bahwa penerjemah kosong karena semua file yang tidak terkait dengan informasi debug hilang.

Terkait:Bagaimana cara mencetak semua baris setelah kecocokan hingga akhir file?
Linux
  1. Apa Arti Atribut 's' Dalam Izin File ??

  2. Apa tujuan dari file .bashrc di Linux?

  3. Apa yang dilakukan panggilan sistem brk()?

  1. Apa itu file .pid dan apa isinya?

  2. Bagaimana rm bekerja? Apa yang rm lakukan?

  3. Apa itu `S_ISREG()`, dan apa fungsinya?

  1. Apa yang dilakukan izin eksekusi?

  2. Apa arti 'rc' di `.bashrc`, dll.?

  3. Apa arti titik setelah bit izin file?