顯示具有 elf 標籤的文章。 顯示所有文章
顯示具有 elf 標籤的文章。 顯示所有文章

2012年2月14日 星期二

elf中的header跟section header

從wikipedia借來一張圖
整個elf檔案包裝大致上類似這樣,如果稍微寫過一些解析圖片或者特定檔案格式的人都知道,file header就是用來儲存跟這個檔案有關的資訊,比方說jpg裡面就會有些圖片大小,壓縮方式跟比例等等的資訊。上圖片中ELF header存有的資訊可以用elfread -h來觀察
很多資訊網路上可以找到,在/usr/include/elf.h上也有定義相對應的結構(c struct),在此就不說了,先提到program header table是optional,在圖片中248 (bytes into files)上,可以看到它是0 bytes。

  • 第一個紅色框框得知section header table相對於檔案的位移(offset),方便直接移動到那處讀取每個section的section header,因為section header是包含許多重要屬性,因為知道有那些section對ld是很重要的
  • 第二個紅色框框可以看到這個檔案包含了多少個sectioin


接著用readelf -S來讀取每個section的資訊
這部分的資料可以從header section table裡面取得,有興趣一樣可以在/usr/include/elf.h上找到對應的結構,其中也包含了各種重要的屬性

參考資料:
http://blog.chinaunix.net/space.php?uid=20547746&do=blog&id=1647100
http://beye.sourceforge.net/en/beye.html

用objdump指令觀察ELF檔案

objdump是個用來觀察object code的好幫手,雖然readelf可以取代他大部分的工作,首先先有個code

很簡單的code,基本學過C望文生義

程式大致上可以分為兩部分,執行的資料跟處理資料的程式碼。obdump參數h表示要列出sections,object code由許多sections所組成,其中.txt這個section是處理資料的程式碼,.data與.bss是資料的section,還有其他給ld用的區段 size指令可以看出各個section的大小

s這個參數表示要使用16進位表示法顯示出object code中的各個區段,可以看到一些read only的資料室蠻明顯的,但是.txt基本上不是人看得,最後可以觀察到.comment這個section是可以省略掉的資訊

d這個參數讓object code可以反組譯成assemble code,方便我們觀察程式,有些時候只能拿到library的時候,就只能從這裡挖到一些資料了,雖然可讀性沒有C好,但是至少比binary code強

最後x參數可以所是列出了所有資訊,不只包含了h這個參數,還列出了許多symbol table跟一些需要重新定位label資訊
這裡觀察到兩個有趣的地方,兩個變數被寫進了不同的區段,有初始化的m被寫入了.data內,沒有的則被寫入了.bss,printf不見了,其實被取代成了puts,這是compiler優化的結果,puts在處理只有字串的資訊比printf有效率,UND表示尚未定義在這個object code中

參考資料:
http://www.jollen.org/EmbeddedLinux/Executable_Linking_Format.html
http://www.jollen.org/blog/2007/03/elf_program_loading_1_segment.html
http://www.jollen.org/blog/2007/03/elf_program_loading_2_pht.html
http://www.study-area.org/cyril/opentools/opentools/x909.html