編譯 可執行格式,誰執行?

2022-10-11 11:48:11 字數 1617 閱讀 9805

鏈結完成之後,會生成可執行格式的檔案。常見可執行格式有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...