ELF核心文件格式

18

除了查看GDB源代码,我在哪里可以找到有关创建核心文件所使用的格式的文档?

ELF 规范留下了核心文件格式的开放性,因此我认为这应该是GDB规范的一部分!遗憾的是,我没有在GNU的GDB文档中找到任何相关帮助。

这是我正在尝试做的事情:将虚拟地址映射到组成运行进程的可执行文件/库中的函数名称。为了做到这一点,我首先想从核心文件中找出从虚拟地址空间到可执行文件/库名称的映射,然后深入相关文件以获取符号信息。

现在,“readelf -a core”告诉我,核心文件中几乎所有的段都是“load”类型--我猜这些是来自所有参与文件的 .text 和 .bss/.data 段,以及一个栈段。除了这些加载段外,还有一个注释段,但它似乎并不包含映射信息。那么如何在核心文件中存储有关段对应的文件的信息呢?这些“load”段是否按特定方式格式化以包括文件信息?


你能详细说明一下你所说的“核心文件格式”是什么意思吗?你是指gcc生成的目标代码格式还是最终可执行文件的格式,如果是后者,那应该是ELF格式,还是其他什么格式? - greatwolf
1
这个问题的更新答案在这里 - evaitl
5个回答

19

核心转储文件格式使用ELF格式,但未在ELF标准中进行描述。据我所知,目前还没有权威的参考资料。

那么,关于哪个文件段对应的信息是如何存储在核心文件中的呢?

ELF notes 中包含了许多额外的信息。您可以使用readelf -n命令来查看它们。

CORE/NT_FILE note 定义了内存地址范围和文件(+偏移量)之间的关联:

Page size: 1
             Start                 End         Page Offset
0x0000000000400000  0x000000000049d000  0x0000000000000000
    /usr/bin/xchat
0x000000000069c000  0x00000000006a0000  0x000000000009c000
    /usr/bin/xchat
0x00007f2490885000  0x00007f24908a1000  0x0000000000000000
    /usr/share/icons/gnome/icon-theme.cache
0x00007f24908a1000  0x00007f24908bd000  0x0000000000000000
    /usr/share/icons/gnome/icon-theme.cache
0x00007f24908bd000  0x00007f2490eb0000  0x0000000000000000
    /usr/share/fonts/opentype/ipafont-gothic/ipag.ttf
[...]

每个线程应该有一个 CORE/NT_PRSTATUS 笔记,其中包含线程的寄存器(包括堆栈指针)。您可能可以从中推断出堆栈的位置。

关于 ELF 核心文件格式的更多信息:


4

核心转储是进程崩溃时的内存映像。它包括程序段、堆栈、堆和其他数据。为了理解内容,仍需要原始程序:符号表和其他数据使内存映像中的原始地址和结构有意义。


3

关于生成核心文件的进程的其他信息存储在一个ELF注释部分中,尽管以操作系统特定的方式进行。例如,请参阅 core(5)手册页 以获得有关NetBSD的信息。


2

解决您的问题的更简单的方法可能是从/proc/$pid/maps中解析文本,以确定给定虚拟地址映射到哪个文件。然后,您可以解析相应的文件。

Kenshoto的开源VDB(调试器)使用了这种方法,如果您能够阅读Python,则这是一个很好的例子。


2

不仅仅是 gdb,还包括被 gdbbinutils等程序使用的bfd库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接