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.