核心转储本身是可执行的吗?

时间:2013-08-05 06:13:42

标签: linux unix executable coredump executable-format

Core dump上的维基百科页面

  

在类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.Wumbley在评论中提到coredump_filter,或许上面的问题应该是:可以生成一个核心转储,使其可以自行执行?

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

我通过电子邮件将此问题通过电子邮件发送给了undump实用程序的创建者,并获得了以下回复:

  

正如在那里的一些答案中所提到的,可以包括   代码部分通过设置coredump_filter,但它不是   Linux的默认值(而且我对BSD变体和。不完全确定   Solaris)上。如果各种代码部分保存在原始代码中   core-dump,为了创造新的东西,确实没有什么遗漏   可执行文件。但是,它确实需要对原始版本进行一些更改   核心文件(例如包括入口点和指向该条目   指向将恢复CPU寄存器的代码。如果核心文件是   以这种方式修改它将成为可执行文件,你将能够   运行它。不幸的是,有些州不会这样做   保存,以便新的可执行文件无法直接运行。打开   文件,套接字,点子等不会是开放的,甚至可能指向   到其他FD(这可能会导致各种奇怪的事情)。然而,   它很可能足以满足大多数调试任务,例如运行   来自gdb的小功能(这样你就不会得到一个"没有运行一个   可执行"内容)。

答案 2 :(得分:0)

正如其他人所说,我不认为你可以在没有原始二进制文件的情况下执行核心转储文件。

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

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