2014-11-02 93 views
0

我需要從可執行文件中獲取段的起始和結束,例如使用objdump命令(文本,數據,bss)。我需要獲取有關我從中調用的文件的信息(程序應檢索有關其自身的信息)。我怎樣才能做到這一點。 另外我試圖獲得堆棧段的開始和結束地址。我試圖得到第一個和最後一個局部變量的地址,但是這隻會顯示完整棧的一部分。我如何獲得完整堆棧的地址?如何從可執行文件中獲取段地址並查找堆棧地址

我將不勝感激任何幫助。 Thx提前。

+0

你爲什麼要問?做什麼的? – 2014-11-02 16:41:18

回答

0

objdump -h executablename應使您能夠獲取文本,數據,bss等部分的詳細信息。如果你想要所有部分的內容,那麼你必須使用-s選項。如果你想要所有的信息,那麼你可能需要使用-x選項(這將有堆棧信息)。

堆棧幀檢索取決於體系結構的類型。獲取當前堆棧幀信息的選項可以通過gdb加載並執行info frameframe at的地址應爲BP(Base pointer),它是當前棧幀的起點。 SP應包含堆棧幀的結束點。 locals at的地址應包含局部變量的起始地址。

幾乎沒有可以爲內核啓用的配置。啓用CONFIG_DEBUG_STACK_USAGE是監視內核堆棧使用情況的一個選項。諸如CONFIG_DEBUG_STACKOVERFLOW之類的選項可以啓用跟蹤堆棧。

0

如果從程序運行本身的角度來看,我會閱讀/proc/self/maps文件(或/proc/self/smaps)。請參閱proc(5)。讀取這些僞文件很快(不涉及磁盤IO),但需要按順序讀取它們(如使用pipe(7)-s)並快速關閉它們(換句話說,不要在沒有重新讀取它們的情況下重新讀取它們)open(2) - 他們)。

如果你想包含在一些ELF可執行文件的靜態信息(見elf(5))使用readelf(1) & objdump(1)命令或一些ELF讀庫像libelf

注意,堆棧段的概念變得模糊與最新的內核,libcs和多線程應用程序。另見GCC split stacks的能力。

此外,大多數Linux系統都啓用ASLR,因此堆棧地址會因運行相同程序的進程而異。

1

我需要從可執行文件中獲取片段的開始和結束,例如使用大小命令(文本,數據,bss)。

.text.data.bss部分,不。文件中的段可能不存在,但段必須是(僅在運行時才需要段)。

我該怎麼做。

研究/usr/include/elf.h,和許多resources可在網上。每個ELF文件以Elf{32,64}_Ehdr開頭,其中包含.e_phoff.e_phnum。使用這些成員,您可以找到並解碼段表。您可以使用.e_shoff.e_shnum來類似查找節表(如果存在)。

我也試圖讓啓動和堆棧段的結束地址

您不能:堆棧開始不包含在二進制文件,但內核的過程中動態地確定啓動時間。此外,棧的結束是正在運行的程序的動態屬性,並且取決於程序在做什麼以及ulimit設置。