2012-02-02 45 views
2

我正在設計一些跨平臺工具,並且我想存儲一些只讀數據,一種資源數據(圖像或字符串或「由......製造」)信息或文件版本信息)。存儲只讀數據混合程序集和C++

我正在嘗試編碼該工具,「純c」或「C++」。

我想使用匯編器來存儲資源數據,因此,數據可以直接從程序或共享庫文件中讀取,不需要執行

在執行時,還可以通過程序自身讀取數據。

當編譯代碼時,數據將只寫入一次。

我發現了2種可能的方式來做到這一點。

(1)內聯彙編。將asm指令直接添加到「純c」或「C++」文件中,像Borland,MS,GNU這樣的幾個編譯器就有這種形式。 (2)在獨立的文件中生成代碼和彙編代碼,並使用編譯器工具(如鏈接器,編譯器或編譯器)來編譯全部彙編代碼。

我不想存儲彙編指令,只有數據。

我的目標是x86-32位處理器,Windows,Linux & BSD,但是,如果可能的話,可以擴展到其他平臺或體系結構。

我知道Windows使用不同的文件格式,如PE或COFF或ELF二進制文件。

任何其他或替代的想法? 任何建議,手冊,鏈接如何做到這一點?

謝謝。

+0

這個答案可能有你想要的信息:http://stackoverflow.com/a/4158997/12711一種方法只適用於GCC工具鏈,但另一種方法適用於任何C編譯器。爲了讓一個共享庫讀取數據,你需要有一些方法來獲得指向共享庫的數據的指針(如果這對你來說可行,通過函數很容易實現)。 – 2012-02-02 01:32:46

回答

2

它可能有點難看,但你可以做的一件事情應該是相對便攜的:將數據的全部內容作爲char數組存儲,以幻燈片序列開始和結束。可能帶有校驗和。

例如

char data[]={ 
    't','h','e','_','s','t','a','r','t',0, 
    // resource data here 
    .... 
    't','h','e','_','e','n','d',0, 
    // maybe a checksum here 
    ... 
}; 

在我熟悉的,這些字節將連續存儲在文件中(你可以掃描簽名加載的資源)所有平臺。當然,程序運行時數據在內存中是連續的(並且可以作爲「數據」訪問)。

如果這樣的事情不是一個選項,你可能需要更多地瞭解你的操作系統的可執行文件格式。

+0

使用開始標記和完成標記。第三種替代但實用的方法。我會考慮一下。謝謝。 – umlcat 2012-02-02 01:41:26

2

這樣做的一種方法是將要存儲的數據追加到編譯後的二進制文件的末尾(可能是在編譯後的步驟中),並在數據後直接存儲大小爲32位或64位整數。

然後獲取數據了,在你的代碼,open()的二進制文件,尋求結束,讀取尺寸,然後向後讀,直到你得到的所有數據。

簡單和相當便攜。

+1

+1。這就是大多數單文件安裝程序的工作原理。 – 2012-02-02 11:25:06

+0

我也會檢查這個選擇。謝謝。 – umlcat 2012-02-03 05:47:09