我使用codesourcery g ++ lite(基於gcc4.7.2版本)爲stm32(Cortex-m3)編程。我希望動態加載可執行文件。 我知道我有兩個選項可用:
1.可重定位的精靈,需要一個精靈分析器。
2.位置獨立代碼(PIC)與全局偏移寄存器手臂位置獨立可執行文件(-pie)(cortex-m3)
我更喜歡全局偏移寄存器的PIC,因爲它看起來更容易實現,我不熟悉精靈或任何精靈庫。另外,用一些工具從elf文件生成.bin文件也很容易。
我試圖建立我的程序與 「-msingle-PIC-基地-fpic」 編譯選項和 「-pie」 鏈接選項,但後來我得到一個鏈接錯誤:
...path...ld.exe: ...path...thumb2\libstdc++.a(pure.o): relocation R_ARM_THM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC
我不太明白錯誤信息。看起來默認的標準c/C++庫不能與我的選項一起使用,我需要獲取庫的源代碼並重建以達到我自己的目的。
所以,
1.任何人都可以提供任何有用的信息/鏈接如何使用與位置無關的可執行文件?
2.使用-msingle-pic-base選項,我不需要太在意GOT和ld腳本太多,對吧?
注意:如果沒有「-pie」鏈接選項,我可以構建程序。但是當調用C++虛函數時(當我使用IDE(keil)的模擬器來調試我的程序時)程序失敗。我不明白髮生了什麼事以及我錯過了什麼。
------------------------------------------ ----------------------------
- 增加20130314
- with the -msingle-pic-base option, I don't need to care too much about the GOT and ld script anymore, right?
從我的實驗,寄存器(R9在我的程序中使用)應該指向got.plt部分的開頭。刪除「-pie」選項,鏈接成功,(正確設置r9),則C++虛函數調用成功。但是,我仍然認爲「-pie」選項很重要,這可以確保當前標準庫的位置無關。任何人都可以爲我解釋這個嗎?
------------------------------------------- ---------------------------
- 已添加20130315
我從ARM網站上查看了ABI上的文檔。但它沒有什麼幫助,因爲它們沒有針對特定的平臺。似乎有一個EABI的概念(我正在使用sourcery的arm-none-eabi版本),但是我從arm網站上找不到有關「EABI」的任何文檔。我從Sourcery和gcc都找不到關於這個主題的文檔。 PIC有多種實現方式,那麼哪一種是非EABI情況下使用的sourcery g ++?我認爲「-msingle-pic-base」,「-fpie」,「-pie」選項的行爲是如此糟糕的記錄!
----------------------------------------------- ------------------------
從解開程序代碼中,我發現了這個問題:「-msingle-pic-base」, r9應該指向「.got」部分的基地址,.got部分中的指針是絕對指針,變量的尋址類似於文章中的描述:Position Independent Code (PIC) in shared libraries。所以我仍然需要修改加載時的「.got」部分。 我不知道什麼是我的程序中使用的「.got.plt」部分。看來,函數調用正在使用PC相對尋址。
如何使用「-pie」構建或如何鏈接使用「-fpic」編譯的標準庫對我來說仍然是一個問題。
爲什麼你需要動態加載它? – stdcall 2013-03-14 18:49:35
@Mellowcandle沒有實際需要。只是想殺了我的業餘時間。我已經實現了一個簡單的循環調度程序,現在我想爲它添加一個簡單的動態加載功能。 – Pony279 2013-03-15 03:44:45
也許我應該嘗試arm-linux-gcc :-(而不是用arm-none-eabi來構建「-pie」鏈接選項,或者我應該放棄我的想法並獲得嵌入式Linux開發平臺。 – Pony279 2013-03-15 06:41:01