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
沒有留言:
張貼留言