2011-05-13 81 views
12

通过GDB源码挖掘的缺点,我在哪里可以找到有关用于创建核心文件的格式的文档?ELF核心文件格式

ELF规范保留了核心文件格式,所以我猜这应该是GDB规范的一部分!可悲的是,我从GNU的gdb文档中找不到这方面的任何帮助。

下面是我想要做的:将虚拟地址映射到包含正在运行的进程的可执行文件/库中的函数名称。为此,我首先想从核心文件中找出映射从虚拟地址空间到可执行文件/库的名称,然后挖掘相关文件以获取符号信息。

现在“readelf -a core”告诉我几乎核心文件中的所有段都是'load'类型的 - 我猜这些是所有的.text和.bss/.data段参与的文件,以及一个堆栈段。除了这些加载段以外,还有一个音符段,但似乎并不包含地图。那么存储在核心文件中的关于哪个段对应的文件的信息如何?这些“加载”细分以特定方式格式化以包含文件信息?

+0

你能否解释一下你的意思是 '核心文件格式' 什么位?你指的是gcc生成的目标代码格式还是最终可执行文件的格式,在这种情况下,它将是ELF还是其他的? – greatwolf 2011-05-13 01:41:39

+1

这个问题的更新的答案是[这里](http://stackoverflow.com/a/38427225/5058676)。 – evaitl 2016-07-19 20:25:31

回答

2

与其说gdb通过gdbbinutils使用的bfd库等

3

核心转储是该过程的存储器内的图像时,它坠毁。它包括程序段,堆栈,堆和其他数据。您仍然需要原始程序来理解内容:符号表和其他数据使内存映像中的原始地址和结构有意义。

2

有关生成核心文件的进程的其他信息存储在ELF note部分,尽管采用特定于操作系统的方式。例如,请参阅core(5) manual pageNetBSD

2

更简单的解决方案可能是解析/ proc/$ pid/maps中的文本以确定给定虚拟地址映射到的文件。然后你可以解析相应的文件。

Kenshoto的开源VDB(调试器)使用这种方法,如果你可以读取python这是一个很好的例子。

6

核心转储文件格式使用ELF格式,但在ELF标准中没有描述。 AFAIK,对此没有权威的参考。

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

ELF注释中包含大量额外信息。您可以使用readelf -n来查看它们。

核/ NT_FILE笔记定义存储器地址范围和文件之间的关联(+偏移量):

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核心文件格式

的更多信息: