AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 423324
Accepted
Greg Nisbet
Greg Nisbet
Asked: 2018-02-11 20:19:13 +0800 CST2018-02-11 20:19:13 +0800 CST 2018-02-11 20:19:13 +0800 CST

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

  • 772

我正在尝试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当它报告解释器是空的时,究竟是在告诉我什么?

dynamic-linking exec
  • 2 2 个回答
  • 4888 Views

2 个回答

  • Voted
  1. Best Answer
    Michael Homer
    2018-02-11T20:56:10+08:002018-02-11T20:56:10+08:00

    perl-debugperl用于(例如)GDB,包含用于理解正在运行的进程或转储的符号perl。例如,给定一个perl script.pl使用 pid的正在运行的进程$PID,您可以使用:

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

    附加到它,并在那时做所有通常的 GDB 事情。它本身不是可运行的可执行文件,并且缺少启动所需的元素。

    这些符号是分开保存的,因为它们的大小是主可执行文件的两倍多,而且很少需要。在这种情况下,这些符号对调试有用perl,而不是调试 Perl 脚本,并且可能仅在您正在开发要链接的扩展时有用。

    我认为实际上不需要设置可执行位,但 Debian 不会从我看到的任何调试符号文件中删除它们,因此可能存在需要它的情况。file告诉您解释器是空的,因为它是空的,因为所有与调试信息无关的文件都丢失了。

    • 3
  2. thrig
    2018-02-11T20:57:03+08:002018-02-11T20:57:03+08:00

    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]]
    
    • 1

相关问题

  • 共享库次要版本管理

  • Bash Script exec 文件描述符返回“未找到”

  • 在 bash 中运行“exec echo some; echo test”是否永远不会打印“some test”?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve