2014-01-07 53 views
3

我製作的一個小程序包含很多小的位圖和聲音片段,我希望將它們包含到二進制文件本身中(它們需要存儲器映射)。在MS PE/COFF標準中,有關於如何包含具有良好文件系統層次結構的資源(.rsrc部分)的具體描述。我在Linux ELF規範中沒有找到類似的東西,因此我認爲可以自由地包含這些資源。將資源添加到ELF對象,分組在一個部分

我想要實現的是,我可以在每個資源的開頭只包含一個帶有符號名稱的ELF部分中的所有資源(以便我可以從我的C代碼中解決它們)。我現在正在做的是使用具有以下佈局的小NASM文件:

SECTION .rsrc 
    _resource_1: 
     incbin "../rsrc/file_name_1" 
    _resource_1_length: 
     dw $-resource_1 
    _resource_2: 
     incbin "../rsrc/file_name_2" 
    _resource_2_length: 
     dw $-resource_2 
    ... 

我可以很容易地組裝這可以用我的C代碼鏈接的ELF對象。但是,我不喜歡使用assembly,因爲這會使我的代碼與平臺相關。

什麼是實現相同結果的更好方法?

這個問題已經被問過計算器,但所提出的解決方案並不適用於我的情況:在C代碼十六進制數組是不是真的C/C++ with GCC: Statically add resource files to executable/library 包括資源:

  • 提出了相應的解決辦法因爲它將代碼和數據混合在一個部分中。 (此外,這也不實用,因爲一旦它們轉換爲陣列,我無法預覽資源)
  • 在每個資源上都使用objcopy --add-section,但每個資源都有它自己的部分(包括頭部和所有這些部分)。這似乎有點浪費,因爲我有大約120個文件(每個+/- 4K)。
+1

「__section」GCC關鍵字可以與提議的包含十六進制數組的解決方案一起使用。通過在構建環境中使「數組」文件依賴於它們的二進制「父母」,您仍然可以預覽文件。 –

回答

0

你錯了說,使用hexarrays混合數據和代碼,ELF文件默認,分裂他們特別是,如果你定義hexarray作爲一個常量數組,它會在.rodata結束。有關.rodata的更多詳細信息,請參閱an old post of mine

使用objcopy添加資源應該在目標文件中創建多個部分,但是這些部分應該全部合併到輸出可執行文件中,但是幾乎可以肯定會有一些額外的填充。 Another post on a related topic

如果您想從實際的二進制文件(比如說PNG)轉換爲ELF,您可以使用ldscripts,它允許您使用任意部分/符號構建ELF文件並從文件中讀取數據。您仍然需要自定義規則來構建您的ELF文件。

我真的很驚訝這種資源管理對於ELF並不常見,特別是對於許多小文件,它會很快提高文件系統的性能,因爲那樣你只有一個文件來映射而不是許多。

0

如果您的資源不太大,可以將它們轉換爲C/C++源代碼,例如,作爲unsigned char數組。然後你可以將它們作爲全局變量來訪問,並將它們編譯爲像普通源代碼那樣的鏈接。