我有一个嵌入式应用程序,它将有一个引导程序,它将决定直接从内部闪存运行两个应用程序中的一个.我试图使这些应用程序位置独立,以便它们都可以编译为相同的基地址.没有操作系统,因此没有可用的动态
链接器.到目前为止,我尝试使用-fpie选项(使用gcc)构建并没有太大的成功.
函数调用似乎是正确的,但全局数据没有正确的地址.本地定义的全局数据似乎使其地址偏移了应用程序偏离其原始基址的
数量.在其他
文件中声明的全局数据具有完全
错误的地址(如果我使用-fpic构建,则本地声明的全局数据和其他
文件中的全局数据都是完全
错误的).我怀疑在我的应用程序启动时我需要对GOT部分进行一些操作,但我不确定.
我终于搞定了.看起来我需要做以下事情:
所有
代码都需要符合-fpic(之前我在尝试-fpie)
我还需要修改链接器脚本.我强迫GOT进入sram部分,它位于flash中的动态部分之后.如果GOT部分位于闪存中动态部分之前,看起来一切正常.不知道为什么这很重要,但它似乎解决了所有问题 – 在此之前,好像代码没有正确定位GOT,因为GOT存储了正确的值但是我所有变量的地址都不正确.