‘file’报告的解释器指的是什么?

‘file’报告的解释器指的是什么?

我试图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在两个 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.plpid $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]]

相关内容