我试图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
在两个 perls 上运行时,我看到调试 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
当它报告解释器为空时到底在告诉我什么?
答案1
perl-debugperl
与(例如)GDB 一起使用,包含用于理解正在运行的进程或其他perl
.例如,给定一个正在运行的进程perl script.pl
pid $PID
,您可以使用:
$ gdb /usr/lib/debug/usr/bin/perl $PID
附加到它,然后执行所有常见的 GDB 操作。它本身不是一个可运行的可执行文件,并且缺乏启动所需的元素。
这些符号是单独保存的,因为它们的大小是主可执行文件的两倍以上,而且很少需要。在这种情况下,这些符号对于调试很有用perl
,而不是调试 Perl 脚本,并且可能仅在您正在开发要链接的扩展时才有用。
我认为实际上不需要设置可执行位,但 Debian 不会从我看到的任何调试符号文件中删除它们,因此可能在某些情况下需要它。file
告诉您解释器是空的,因为它是空的,因为所有与调试信息无关的文件都丢失了。
答案2
file
正在调用 ELF 工具,注意到该文件是 ELF 格式;解释器是什么并没有得到很好的记录elf(5)
PT_INTERP The array element specifies the location and size of a
null-terminated pathname to invoke as an interpreter.
This segment type is meaningful only for executable files
...
.interp This section holds the pathname of a program interpreter.
对于带有interpreter /lib64/ld-linux-x86-64.so.2
解释器的文件,我们可以查找文档......
$ man -k ld-linux
ld.so (8) - enlazador/cargador dinámico
ld-linux (8) - dynamic linker/loader
ld-linux.so (8) - dynamic linker/loader
信息丰富的ld.so(8)
页面告诉我们:
The programs ld.so and ld-linux.so* find and load the shared libraries
needed by a program, prepare the program to run, and then run it.
此外,您不一定需要该.interp
部分,因为可以运行:
/lib/ld-linux.so.* [OPTIONS] [PROGRAM [ARGUMENTS]]