6

核心转储上的维基百科页面说

在类 Unix 系统中,核心转储通常使用标准的可执行映像格式:

a.out in older versions of Unix,
ELF in modern Linux, System V, Solaris, and BSD systems,
Mach-O in OS X, etc.

这是否意味着核心转储本身可以执行?如果不是,为什么不呢?

编辑:由于@WumpusQ.Wumbleycoredump_filter在评论中提到了 a ,也许上面的问题应该是:可以生成核心转储以使其自身可执行吗?

4

3 回答 3

7

在较旧的 unix 变体中,默认情况下在核心转储中包含文本和数据,但它也以 a.out 格式而不是 ELF 格式给出。今天的默认行为(在 Linux 中肯定,不是 100% 确定 BSD 变体、Solaris 等)是在没有文本部分的情况下以 ELF 格式进行核心转储,但可以更改该行为。
但是,在任何情况下都不能在没有帮助的情况下直接执行核心转储。原因是一个简单的核心文件缺少两件事。一个是入口点,另一个是将 CPU 状态恢复到转储发生时或之前的状态的代码(默认情况下也缺少文本部分)。
在 AIX 中曾经有一个名为 undump 的实用程序,但我不知道它发生了什么。它不存在于我所知道的任何标准 Linux 发行版中。如上所述(@WumpusQ),上面评论中提到的 Linux 也有类似项目的尝试,但是这个项目并不完整,不会将 CPU 状态恢复到原始状态。但是,在某些特定的调试情况下,它仍然足够好。
还值得一提的是,还有其他 ELF 格式的文件也不能执行,它们不是核心文件。比如对象文件(编译器输出)和.so(共享对象)文件。这些在运行以解析外部地址之前需要一个链接阶段。

于 2013-08-16T12:42:31.893 回答
1

我将这个问题通过电子邮件发送给该undump实用程序的创建者,以表彰他的专业知识,并得到以下回复:

正如那里的一些答案所提到的,可以通过设置 coredump_filter 来包含代码部分,但这不是 Linux 的默认设置(而且我不完全确定 BSD 变体和 Solaris)。如果各个代码段都保存在原始核心转储中,那么为了创建新的可执行文件,确实没有任何遗漏。但是,它确实需要对原始核心文件进行一些更改(例如包括一个入口点并将该入口点指向将恢复 CPU 寄存器的代码)。如果以这种方式修改核心文件,它将成为可执行文件,您将能够运行它。不幸的是,有些状态不会被保存,因此新的可执行文件将无法直接运行。打开文件,套接字,点,etc 不会打开,甚至可能指向其他 FD(这可能会导致各种奇怪的事情)。但是,对于大多数调试任务(例如从 gdb 运行小函数)来说,这很可能就足够了(这样您就不会得到“未运行可执行文件”的东西)。

于 2013-08-16T13:19:13.980 回答
0

正如其他人所说,我认为没有原始二进制文件就无法执行核心转储文件。

如果您有兴趣调试二进制文件(并且它包含调试符号,换句话说它没有被剥离),那么您可以运行gdb binary core.

在 gdb 中,您可以使用bt命令(回溯)在应用程序崩溃时获取堆栈跟踪。

于 2013-08-19T11:54:40.957 回答