2013-07-24 23 views
4

真的有兩個問題圍繞使用--add部分。簡單的就是標題。根據我的閱讀,我一直無法弄清楚如何執行--add-section。如何使用OBJCOPY的--add-section開關?

要使用添加部分,我必須傳遞部分名稱。如果我使用現有的部分名稱,程序將以「無法添加部分'.data':格式錯誤的文件作爲響應。」也許我只需要傳遞另一個參數。如果我使用新的部分名稱,我寧願這樣做,但我會收到警告:「分配的部分」.blob「不在分段中。」

現在,我已經獲得了我的功能,因爲我需要它來處理「不在段」警告。我想知道是否有合法的方法將此Blob放入可執行文件中。我會鏈接它,但這並不容易,因爲我要添加的數據是從可執行文件本身的內容生成的。

第二個問題真的是我關心的。考慮到在鏈接完成之後無法計算blob,是否有辦法執行以下操作:

  1. 鏈接ELF文件
  2. 生成ELF文件和其他數據
  3. 添加的blob ELF文件的blob,使其在運行時加載到正確的位置在內存

    objcopy --add-section .blob=blob.o \ --set-section-flags .blob=alloc,contents,load,readonly \ --change-section-address .blob=ADDRESS \ program.elf program.blobbed.elf

我很樂意在ELF文件中添加一個節和/或段作爲鏈接的一部分,並在其中插入此blob。我不知道該怎麼做。

我已經想到我可以通過第二個鏈接完成這個壯舉,但objcopy會更乾淨。

  1. 鏈接ELF文件
  2. 生成ELF文件和其他數據
  3. 重新鏈接ELF文件的blob包括新blob.o

UPDATE:這最後一個策略可能是可行的只要重鏈接不會改變由第一個鏈接產生的程序部分中的某些內容。它並不是第一次嘗試,但它可能可以解決它。因此,希望使用--add-section來添加這個blob,而不是通過第二個鏈接。

回答

0

不是專門回答你的問題,但我曾用於這種事情的一種方法是鏈接一個佔位符塊,然後在之後補充正確的值。

我知道這不是你想要做的,但它是一個非常簡單和可靠的方法來做到這一點。並且具有作爲工具鏈/平臺不可知論的主要優點。

+0

我考慮過這種方法,因爲我確實知道塊的大小。但是,這個佔位符blob的存在會改變第一個鏈接的結果,我依賴於這種情況不會發生。 blob的要點是將完整性檢查數據附加到轉儲二進制文件的末尾。虛擬blob的存在使得棘手,但不是不可能的。我正在尋找更清潔的方法。 – user2600958

+0

@ user2600958你最終的解決方案是什麼? –

1

您可以添加該部分,用NUL填充它,然後計算您的blob。然後將該blob修補到這一部分。之後,當您檢查ELF的完整性時,請按照該部分充滿NUL並再次計算blob。最後,比較存儲在節中的計算出的blob和blob。