通過巨集定義向二進位制執行碼寫入編譯資訊

2021-08-25 13:21:16 字數 1536 閱讀 9781

**:

很多程式設計師都遇到過這樣的問題:已經上線執行很長時間的系統出了問題,並且其中的很多程式經過了多次的修改和公升級,日誌中的資訊和現有的程式完全對不上號!怎樣才能檢視程式的資訊(例如版本號、編譯的時間等)、以確定程式的確切版本呢?很多的版本管理工具(例如cvs、svn)可以幫你管理原始碼的版本,但並不會在編譯的時候把編譯資訊寫到二進位制執行碼中去。因此,還是要通過其他手段來實現。

在這裡我提供了一種在可執行程式中寫入編譯資訊的辦法,希望對大家有幫助。

這個例子由兩個程式構成:test.c、version.c。其中version.c用於實現編譯資訊的記錄,只要在現有的**中加入該程式,而不需要對已有**作任何的修改,就能實現二進位制執行碼的版本資訊管理。

version.c

#include

/* 以下兩個巨集用於在編譯時通過巨集定義傳入編譯資訊

version被替換為const char version=」resivion: ***x」

buildtime被替換為 const char buildtime=」buildtime: yyyymmdd」

*/version;

buildtime;

void print_version()

void print_buildtime()

print_version()和print_buildtime()這兩個函式不是必須的,只是讓version.c看起來「更象個程式」,同時可以提供在外部程式中輸出編譯資訊的手段。

test.c

#include

int main()

在test.c中呼叫這兩個函式只是用於測試,正式版本的程式中可以用實際的**替換。

在makefile中新增以下的內容:

version="const char version=\"revision: 1.2.2\""

buildtime="const char buildtime=\"buildtime: `date +%y%m%d`\""

cflags=-c –g –dversion=」$version」 –dbuildtime=」$buildtime」

testversion: test.o version.o

cc –o $@ $?

.c.o :

$(cc) $(cflags) $<

如果你使用了版本管理工具,可以通過工具動態讀取版本(或修訂)資訊,將資訊賦值給version變數。你完全可以自己定義巨集定義的格式,例如將編譯的精確時間寫進去。

編譯後執行:

$testversion

revision: 1.2.2

buildtime: 20100402

$通過strings命令檢視:

$string testversion | grep revision

revision: 1.2.2

$strings testversion | grep buildtime

buildtime: 20100402

這個結果是我真正希望的!只要通過檢視二進位制執行碼中的字串,就可以確定程式的版本了!

二進位制檔案寫入

被二進位制檔案寫入困擾了2天之後終於寫出來 先把 貼上,明天補說明 imports system imports system.io imports system.text imports microsoft.visualbasic public sub a1 byval mystr as stri...

操作二進位制寫入二進

操作二進位制 寫入二進位制 1 宣告變數 sqlite3 stmt stat 2 把sql語句解析到stat結構中去 sqlite3 prepare 3 繫結替換 sqlite3 bind blob 4 儲存到資料庫 int result sqlite3 step 5 釋放stat結構 sqlite...

二進位製碼轉BCD碼

在微控制器裡面,如 顯示個溫度值,這時,要取乙個數的個位 十位 百位,可以用 和 求商和求餘 來解決。但是,在fpga裡面用求商和求餘將會非常消耗資源,這樣就必須用到二進位制轉bcd碼了,這裡介紹一種簡單的加3移位演算法。注 b代表二進位制,d代表十進位制,0x代表十六進製制,bcd 為bcd 碼,...