我需要從可執行文件中獲取段的起始和結束,例如使用objdump
命令(文本,數據,bss)。我需要獲取有關我從中調用的文件的信息(程序應檢索有關其自身的信息)。我怎樣才能做到這一點。 另外我試圖獲得堆棧段的開始和結束地址。我試圖得到第一個和最後一個局部變量的地址,但是這隻會顯示完整棧的一部分。我如何獲得完整堆棧的地址?如何從可執行文件中獲取段地址並查找堆棧地址
我將不勝感激任何幫助。 Thx提前。
我需要從可執行文件中獲取段的起始和結束,例如使用objdump
命令(文本,數據,bss)。我需要獲取有關我從中調用的文件的信息(程序應檢索有關其自身的信息)。我怎樣才能做到這一點。 另外我試圖獲得堆棧段的開始和結束地址。我試圖得到第一個和最後一個局部變量的地址,但是這隻會顯示完整棧的一部分。我如何獲得完整堆棧的地址?如何從可執行文件中獲取段地址並查找堆棧地址
我將不勝感激任何幫助。 Thx提前。
objdump -h executablename
應使您能夠獲取文本,數據,bss等部分的詳細信息。如果你想要所有部分的內容,那麼你必須使用-s
選項。如果你想要所有的信息,那麼你可能需要使用-x
選項(這將有堆棧信息)。
堆棧幀檢索取決於體系結構的類型。獲取當前堆棧幀信息的選項可以通過gdb加載並執行info frame
。 frame at
的地址應爲BP(Base pointer),它是當前棧幀的起點。 SP應包含堆棧幀的結束點。 locals at
的地址應包含局部變量的起始地址。
幾乎沒有可以爲內核啓用的配置。啓用CONFIG_DEBUG_STACK_USAGE是監視內核堆棧使用情況的一個選項。諸如CONFIG_DEBUG_STACKOVERFLOW之類的選項可以啓用跟蹤堆棧。
如果從程序運行本身的角度來看,我會閱讀/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,因此堆棧地址會因運行相同程序的進程而異。
我需要從可執行文件中獲取片段的開始和結束,例如使用大小命令(文本,數據,bss)。
的.text
,.data
和.bss
是部分,不段。文件中的段可能不存在,但段必須是(僅在運行時才需要段)。
我該怎麼做。
研究/usr/include/elf.h
,和許多resources可在網上。每個ELF
文件以Elf{32,64}_Ehdr
開頭,其中包含.e_phoff
和.e_phnum
。使用這些成員,您可以找到並解碼段表。您可以使用.e_shoff
和.e_shnum
來類似查找節表(如果存在)。
我也試圖讓啓動和堆棧段的結束地址
您不能:堆棧開始不包含在二進制文件,但內核的過程中動態地確定啓動時間。此外,棧的結束是正在運行的程序的動態屬性,並且取決於程序在做什麼以及ulimit
設置。
你爲什麼要問?做什麼的? – 2014-11-02 16:41:18