2010-10-01 187 views
6

我的嵌入式項目有一個後處理步驟,用閃存的(某些部分)的CRC替換可執行文件中的值。這一步只能在鏈接之後完成,因爲這是CRC映像的第一次機會。在過去,文件格式是COFF,並且我創建了一個自定義工具來完成修補。簡單修改elf文件的工具?

開發工具已經切換到ELF,所以我需要重新實現CRC修補程序。在我做之前,我想我會尋找一個現有的工具來做到這一點。編譯器基於gcc,但我看不到可以完成這項工作的任何組合ldnmreadelf。谷歌搜索尚未取得豐碩成果。

我現在的工具使用nm找到要打補丁的地址,並用地址,期望值(以防止覆蓋錯誤的數據)和新的CRC值調用修補程序。 CRC是根據可執行文件的「十六進制」格式計算的(我也打補丁),幸運的是我不必重做那部分。

我可以實現這與libelf和自定義代碼再次,但在我之前,它已經存在?

有沒有更好的方法來完成我的目標,即將可執行文件的CRC放入可執行文件中,以便可用於應用程序?

回答

4

如果我理解你想要正確地做什麼,我覺得有以下將工作:

  • nm給你,你要修補的位置運行的虛擬地址;
  • readelf -S爲您提供了運行時虛擬地址和文件中每個部分開頭的偏移量;
  • 將兩者拼接在一起(例如,用您最喜歡的腳本語言的幾行)將文件內的偏移量打補丁。
+0

這是一個很棒的建議,+1。我會試一試。 – 2010-10-02 01:15:52

0

我不確定這是否可行,但您可能可以安排它,以便將目標文件中的CRC位置設置爲外部符號的地址X。然後,通過鏈接一個elf文件,最後的鏈接步驟可以滿足該外部符號,該elf文件什麼也不做,只是指定的地址是您計算的CRC。

這仍然是非常hacky,我不確定它是否容易實現(因爲它是如此濫用的工具)。

+0

是的,我還沒有想出如何使這項工作,因爲鏈接不會完成丟失的符號,我需要鏈接完成,所以我可以計算CRC。 – 2010-10-01 21:17:13

+0

我在想這可能不是問題,但它似乎即使在重新鏈接構建的可執行文件(所有依賴關係符合該文件文件)時,ld會重新組織並破壞事情。有幾種程序可以將序列號填充到固件映像中。也許有一個小精靈的圖像,你可以爲此重新調整。 – nategoose 2010-10-01 21:46:10