gdb 调试显示错误“不是可执行格式:无法识别文件格式”

逆向工程 调试
2021-06-27 14:52:07
[root@localhost Relay]# file RelayD
RelayD: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), stripped

[root@localhost Relay]# ./start
: no process killed
./start: line 2:  2066 Segmentation fault      ./RelayD start --daemon
: command not found
[root@localhost Relay]# gdb RelayD
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-92.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
"/home/Relay/RelayD": not in executable format: File format not recognized
(gdb) run
Starting program:
No executable file specified.
Use the "file" or "exec-file" command.

如何调试这个文件?我试图运行 gdb 来调试文件,结果显示:不在可执行文件中。当我尝试运行 bin 文件时,程序显示段错误。

1个回答

看来您可能正在寻找:

gdb --args ./RelayD start --daemon

(尽管--daemon如果这是可选的,您可能想避免)。

但是,上面的(shell)命令等效于:

gdb ./RelayD

... 紧接着(在 GDB 提示符下):

run start --daemon

请注意在这两种情况下我如何根据脚本行传递参数以及我如何传递相对路径而不仅仅是可执行文件的名称。

这里可能还有另一个问题,但很难说,而且您没有明确提及您所使用的发行版。但是,对于您的系统,您可能需要启用多库支持 [1],以便您的 x86-64 操作系统可以运行 x86-32 二进制文件(该RelayDELF 文件),并且您可能必须安装一些必须按顺序安装的软件包让 GDB 支持这种情况。另一种方法是运行一个 32 位容器(如果我没记错的话,它仍然需要 multilib)并在其中使用 32 位 GDB 进行准备和调试,或者使用 32 位 VM 来完成调试。但据我所知,大多数发行版都支持在 64 位主机系统上调试 32 位二进制文​​件的场景。因此,这可能是安装一些额外软件包的问题。

哦,最后但并非最不重要的一点是,您可能会丢失 32 位可执行文件所需的某些共享对象(库)。使用readelf或者lddRelayD了解更多信息。

[1]yum groupinstall "Compatibility Libraries"应该可以解决问题,前提multilib_policy=all是您已设置yum.conf并且您确实按照您提供的 GDB 输出的建议在 RHEL(或 CentOS 或 Scientific Linux)上运行。另外,还要确保yum.conf含有exclude = *.i?86排除被认为是32位软件包(exactarch=1也可能有不良影响,所以请咨询man yum.conf)。您还可以通过搜索列表来挑选您自己的兼容性库yum search compat|grep ^compat-