我正在尝试perl
在 Ubuntu 16.04 上运行调试库提供的可执行文件,但由于某种原因,该文件“不可执行”,即使它似乎与我的架构匹配。
perl
Ubuntu 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-debug
perl
用于(例如)GDB,包含用于理解正在运行的进程或转储的符号perl
。例如,给定一个perl script.pl
使用 pid的正在运行的进程$PID
,您可以使用:附加到它,并在那时做所有通常的 GDB 事情。它本身不是可运行的可执行文件,并且缺少启动所需的元素。
这些符号是分开保存的,因为它们的大小是主可执行文件的两倍多,而且很少需要。在这种情况下,这些符号对调试有用
perl
,而不是调试 Perl 脚本,并且可能仅在您正在开发要链接的扩展时有用。我认为实际上不需要设置可执行位,但 Debian 不会从我看到的任何调试符号文件中删除它们,因此可能存在需要它的情况。
file
告诉您解释器是空的,因为它是空的,因为所有与调试信息无关的文件都丢失了。file
正在调用 ELF 工具并注意到该文件为 ELF 格式;解释器是什么并没有很好地记录在elf(5)
给定
interpreter /lib64/ld-linux-x86-64.so.2
带有解释器的文件,我们可以查找文档...信息非常丰富的
ld.so(8)
页面告诉我们:此外,您不一定需要该
.interp
部分,因为可以运行: