簡體   English   中英

手臂(cortex-m3)的位置獨立可執行文件(-pie)

[英]position independent executable (-pie) for arm(cortex-m3)

我正在使用代碼源g ++ lite(基於gcc4.7.2版本)為stm32(Cortex-m3)進行編程。 而且我希望可執行文件能夠動態加載。 我知道我有兩種選擇:
1.可重定位的elf,它需要一個elf解析器。
2.具有全局偏移寄存器的位置獨立代碼(PIC)

我更喜歡帶有全局偏移寄存器的PIC,因為它似乎更易於實現,而且我對elf或任何elf庫都不熟悉。 同樣,使用一些工具從elf文件中生成.bin文件也很容易。

我嘗試使用“ -msingle-pic-base -fpic”編譯選項和“ -pie”鏈接選項構建程序,但隨后出現鏈接錯誤:

... path ... ld.exe:... path ... thumb2 \\ libstdc ++。a(pure.o):在創建共享庫時,不能使用針對“本地符號”的重定位R_ARM_THM_MOVW_ABS_NC; 用-fPIC重新編譯

我不太了解錯誤消息。 似乎默認的標准c / c ++庫不能與我的選項一起使用,我需要獲取該庫的源並出於自己的目的進行重建。
所以,
1.誰能為我提供有關如何使用與位置無關的可執行文件的有用信息/鏈接?
2.使用-msingle-pic-base選項,我不再需要太在意GOT和ld腳本,對嗎?

注意:如果沒有“ -pie”鏈接選項,則可以構建程序。 但是,當調用c ++虛擬函數時(當我使用IDE(keil)的模擬器調試程序時),程序失敗。 我不明白發生了什么,我一直想念什么。



-------------------------------------------------- --------------------
-增加20130314

  1. 使用-msingle-pic-base選項,我不再需要太在意GOT和ld腳本,對嗎?

根據我的實驗, 寄存器(在我的程序中使用了r9)應指向got.plt節的開頭 刪除“ -pie”選項,鏈接將成功(正確設置r9),然后成功調用c ++虛函數。 但是,我仍然認為“ -pie”選項很重要,這可以確保當前的標准庫與位置無關。 誰能為我解釋一下?



-------------------------------------------------- --------------------
-增加20130315
我查看了ARM網站上ABI上的文檔。 但這沒有什么幫助,因為它們沒有針對特定的平台。 似乎有EABI的概念(我使用的是Sourcery的arm-none-eabi版本),但是我無法從arm的網站上找到有關“ EABI”的任何文檔。 我從源頭和gcc都找不到關於此主題的文檔。 PIC的實現不止一種,因此在無eabi情況下,源g ++使用的是哪種? 我認為“ -msingle-pic-base”,“-fpie”,“-pie”選項的行為記錄得很差
-------------------------------------------------- ---------------------
從反匯編代碼中,我剛剛發現,在“ -msingle-pic-base”的情況下,r9應該指向“ .got”部分的基地址,.got部分中的指針是絕對指針。變量的尋址與文章中的描述相似: 共享庫中的位置獨立代碼(PIC) 因此,我仍然需要在加載時修改“ .got”部分。 我不知道程序中使用的“ .got.plt”部分是什么。 似乎函數調用使用的是PC相對尋址。
對於我來說,如何使用“ -pie”進行構建或如何鏈接使用“ -fpic”編譯的標准庫仍然是一個問題

該錯誤消息告訴您在構建gcc編譯器時重新編譯最常用的libstdc ++庫。

因此,您必須使用-fPIC重新編譯標准庫(libstdc ++,libgcc _ *,libc,libm以及所有庫),然后將項目鏈接到它們。

如果您依賴於預先構建的編譯器軟件包,那么您在微控制器世界中通常是不合時宜的。 如果您自己構建編譯器(順便說一句,這不太困難,但是是高級/專家任務),那么您就在旅途中。

也可以使用自己的編譯器自己編譯標准庫。 您將需要庫的來源並弄清楚編譯器軟件包的構建系統如何構建它們,並且您必須對此進行模仿。 也許這里有一些專家,可以通過這種方式為您提供建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM