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

核心转储维基百科页面说

在类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 ,可能上面的问题应该是: 可以生成一个核心转储,使其可以自行执行?

Solutions Collecting From Web of "核心转储本身是可执行的吗?"

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

有两种类型的核心转储:系统核心转储和进程核心转储。 它们在许多方面有所不同,例如它们的创建方式和分析方法。

在大多数情况下,导致应用程序崩溃的信号是SIGSEGV(分段违例)或SIGBUS。

类似的信号触发核心转储..也许调用它..

我把这个问题通过电子邮件发送给了他的专业知识,并获得了以下回复:

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

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

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

在gdb里面,你可以使用bt命令(回溯)在应用程序崩溃时获取堆栈跟踪信息。