2013-03-13 65 views
1

我使用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

  1. 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」編譯的標準庫對我來說仍然是一個問題


+0

爲什麼你需要動態加載它? – stdcall 2013-03-14 18:49:35

+0

@Mellowcandle沒有實際需要。只是想殺了我的業餘時間。我已經實現了一個簡單的循環調度程序,現在我想爲它添加一個簡單的動態加載功能。 – Pony279 2013-03-15 03:44:45

+0

也許我應該嘗試arm-linux-gcc :-(而不是用arm-none-eabi來構建「-pie」鏈接選項,或者我應該放棄我的想法並獲得嵌入式Linux開發平臺。 – Pony279 2013-03-15 06:41:01

回答

1

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

因此,您必須使用-fPIC重新編譯標準庫(libstdC++,libgcc_ *,libc,libm和all),並將您的項目與它們相鏈接。

如果您依賴預構建的編譯器包,那麼您在微控制器領域大部分都不參與遊戲。如果你自己構建你的編譯器(順便說一下,不是太難,而是一個高級/專家任務),你就是在忙碌中。

也可以使用編譯器自己編譯stdandard庫。你將需要庫的來源,弄清楚,編譯器包構建系統是如何構建它們的,你必須模仿它。也許這裏有一些專家,他們可以通過這種方式爲您提供建議。

相關問題