Dynamic-Linking

file 報告的解釋器指的是什麼?

  • February 11, 2018

我正在嘗試perl在 Ubuntu 16.04 上執行調試庫提供的執行檔,但由於某種原因,該文件“不可執行”,即使它似乎與我的架構匹配。

perlUbuntu 16.04 附帶的執行檔被剝離

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

perl-debug包裝提供了一個perl/usr/lib/debug剝離的底部。

$ nm /usr/lib/debug/usr/bin/perl | head
                U abort@@GLIBC_2.2.5
0000000000589020 r AboveLatin1_invlist
                U accept@@GLIBC_2.2.5
                U access@@GLIBC_2.2.5
000000000058e002 r a_hash.16944
                U alarm@@GLIBC_2.2.5
000000000058e010 r an_array.16943
00000000005795c0 r ASCII_invlist
0000000000543430 T ASCII_TO_NEED
                U atan2@@GLIBC_2.2.5

但是,當您嘗試執行它時,它會exec*失敗並bash給您一個很好的消息:

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

但是,當我file在兩個 perl 上執行時,我看到調試 perl 被標記為“有一個空的解釋器”,其中正常 perl 有一些 ld 共享對象。它可能與連結器有某種關係ld,但我不知道它是什麼。

$ 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

file當它報告解釋器是空的時,究竟是在告訴我什麼?

perl-debugperl用於(例如)GDB,包含用於理解正在執行的程序或轉儲的符號perl。例如,給定一個perl script.pl使用 pid的正在執行的程序$PID,您可以使用:

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

附加到它,並在那時做所有通常的 GDB 事情。它本身不是可執行的執行檔,並且缺少啟動所需的元素。

這些符號是分開保存的,因為它們的大小是主執行檔的兩倍多,而且很少需要。在這種情況下,這些符號對調試很有用,而不是調試 Perl 腳本,並且可能僅在您正在開發要連結的擴展時有用。perl

我認為實際上不需要設置可執行位,但 Debian 不會從我看到的任何調試符號文件中刪除它們,因此可能存在需要它的情況。file告訴您解釋器是空的,因為它是空的,因為所有與調試資訊無關的文件都失去了。

引用自:https://unix.stackexchange.com/questions/423324