鏈結完成之後,會生成可執行格式的檔案。常見可執行格式有exe和elf。這些可執行格式一般依賴於動態共享庫,由作業系統載入並替換符號,然後執行。換言之,exe/elf格式的可執行檔案,由作業系統執行,即執行流程的起點是作業系統。
然而這並不是軟體執行的起點,軟體執行的起點是系統上電後,cpu讀取並執行的第一條指令。如何生成cpu執行的可執行格式的程式呢?
一. cpu執行的可執行格式
其實很簡單,cpu執行的可執行格式,即是一條條指令的機器碼組成的程式。這個程式固化在硬碟的啟動扇區,或者燒寫在flash中。位於cpu位址區間的位址0即0x0000_0000處。
cpu執行的可執行格式也不是一成不變,一定從位址0讀取第一條指令開始執行的。如mpc56xx即是查詢boot sector,然後從中提取要執行的**的位址(reset vector)。還有的cpu會從boot sector中找到棧位址並賦值給sp暫存器。
二.objcopy
link command file或者link description script或者linker script控制鏈結器生成的可執行程式中各個段的分布。如之前的flash.lcf,也是按照cpu的需要生成的可執行格式:
其中__bam_bootarea即是boot sector。不過遺憾的是,鏈結生成的是elf格式的可執行檔案。
但也可以想到,如果要通過這個elf格式的可執行檔案,生成cpu執行的可執行格式,即可以燒錄flash的image映象,距離也不遠了。
所需要的工具是objcopy, 只需要這一步即可。
elf和image映象(cpu上電執行的可執行格式)的區別在**呢?
image映象檔案偏移量0處是與cpu約定好的格式,要麼是復位中斷向量,要麼是boot sector;而elf偏移量0處是elf檔案頭。
elf檔案開頭:
映象檔案開頭:
elf中包含除錯資訊,符號資訊,庫引用資訊等;image映象檔案一般是靜態鏈結,不依賴動態共享庫,誰來幫他查詢這些符號呢?
其他等等。
三.反其道而行之
flash中儲存的是cpu執行的可執行格式的映象,這是objcopy生成之後,燒錄進flash中的。
那麼把flash拆下來通過燒錄器讀取其中的內容,即是cpu執行的可執行格式的映象檔案。執行生成這個映象檔案的逆過程,即先objcopy恢復成elf格式(可能資訊丟失不可逆,無法成功),然後再反彙編即可看到**的內容。實際上,映象檔案可以直接被反彙編。可以做的事情有哪些,就可以想象了。
可執行檔案格式
測試平台 在windows下使用gcc編譯c檔案。gcc的幾個用法 每一步單獨處理 gcc e main.c o main.i 將main.c預處理 gcc s main.i o main.s 將預處理的main.i檔案轉換成彙編檔案main.s gcc c main.s o main.o 將彙編檔...
可執行檔案 ELF 格式
elf executable and linking format 是一種物件檔案的格式,用於定義不同型別的物件檔案 object files 中都放了什麼東西 以及都以什麼樣的格式去放這些東西。它自最早在 system v 系統上出現後,被 unix 世界所廣泛接受,作為預設的二進位制檔案格式來使...
python 執行可執行程式
python do exe.pyw coding utf 8 import os exe dir c program files q dir exe file q dir.exe def do cmd dir,file if os.access dir,os.f ok os.chdir dir if...