我正在使用codesourcery g++ lite(基于gcc4.7.2版本)为stm32(Cortex-m3)编程。我希望动态加载可执行文件。
我知道我有两个选择:
1.可重定位的elf,需要一个elf解析器。
2. 具有全局偏移寄存器的位置无关代码(PIC)
我更喜欢带有全局偏移寄存器的PIC,因为它似乎更容易实现,而且我不熟悉elf或任何elf库。此外,使用一些工具可以轻松地从 elf 文件生成 .bin 文件。
我尝试使用“-msingle-pic-base -fpic”编译选项和“-pie”链接选项构建我的程序,但后来出现链接错误:
...路径...ld.exe:...路径...thumb2\libstdc++.a(pure.o):重定位
R_ARM_THM_MOVW_ABS_NC 不能用于“本地符号”
制作一个共享对象;使用 -fPIC 重新编译
我不太明白错误消息。看来默认的标准 c/c++ 库不能符合我的选择,我需要获取库的源代码并根据自己的目的进行重建。
So,
1.任何人都可以向我提供有关如何使用独立于位置的可执行文件的任何有用信息/链接吗?
2.有了-msingle-pic-base选项,我不再需要太关心GOT和ld脚本了,对吧?
注意:如果没有“-pie”链接选项,我可以构建程序。但是当调用c++虚拟函数时(当我使用IDE(keil)的模拟器来调试我的程序时),程序失败。我不明白发生了什么以及我错过了什么。
-------------------------------------------------- --------------------
--添加20130314
- 与-ms单图片库选项,我就不用再太关心GOT和ld脚本了,对吧?
从我的实验来看,寄存器(r9 在我的程序中使用)应指向 got.plt 部分的开头。删除“-pie”选项,链接就会成功,(正确设置r9)然后C++虚函数调用成功。不过,我仍然认为“-pie”选项很重要,这可能会确保当前的标准库是位置无关的。有人能为我解释一下吗?
-------------------------------------------------- --------------------
-- 添加20130315
我从ARM的网站上看了一下关于ABI的文档。但这没有什么帮助,因为它们并不针对特定平台。似乎有一个EABI的概念(我使用的是sourcery的arm-none-eabi版本),但我在arm的网站上找不到任何关于“EABI”的文档。我无法从 sourcery 和 gcc 中找到有关此主题的文档。PIC 有不止一种实现,那么在非 eabi 情况下使用哪一种源 g++ 呢?我认为“-msingle-pic-base”、“-fpie”、“-pie”选项的行为记录很少 !
-------------------------------------------------- --------------------
从反汇编代码中,我刚刚发现,在“-msingle-pic-base”中,r9应该指向“.got”部分的基地址,.got部分中的指针是绝对指针变量的寻址与文章中的描述类似:共享库中的位置无关代码 (PIC) http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/。所以我仍然需要修改加载时的“.got”部分。我不知道我的程序中使用的“.got.plt”部分是什么。看来函数调用正在使用 PC 相对寻址。
如何使用“-pie”进行构建或如何链接使用“-fpic”编译的标准库对我来说仍然是一个问题.
该错误消息告诉您重新编译 libstdc++ 库,该库是在构建 gcc 编译器时最常构建的。
因此,您必须使用 -fPIC 重新编译标准库(libstdc++、libgcc_*、libc、libm 等)并将您的项目链接到它们。
如果您依赖预构建的编译器包,那么您基本上就退出了微控制器世界。如果您自己构建编译器(顺便说一下,这并不是太困难,而是一项高级/专家任务),那么您就可以开始了。
也可以使用您拥有的编译器自行编译标准标准库。您将需要库的来源并弄清楚编译器包构建系统如何构建它们,并且您必须模仿这一点。也许这里有一些专家可以在这方面为您提供建议。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)