2011-05-13 84 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核心文件格式

的更多信息: