试图在cortex-m3上加载与位置无关的代码
我有一个嵌入式应用程序,它将有一个引导程序,它将决定直接从内部闪存运行两个应用程序中的一个。我试图使这些应用程序位置独立,以便它们都可以编译为相同的基地址。没有操作系统,因此没有可用的动态链接器。到目前为止,我尝试使用-fpie选项(使用gcc)构建并没有太大的成功。函数调用似乎是正确的,但全局数据没有正确的地址。本地定义的全局数据似乎使其地址偏移了应用程序偏离其原始基址的数量。在其他文件中声明的全局数据具有完全错误的地址(如果我使用-fpic构建,则本地声明的全局数据和其他文件中的全局数据都是完全错误的)。我怀疑在我的应用程序启动时我需要对GOT部分进行一些操作,但我不确定。
没有找到相关结果
已邀请:
2 个回复
温拎凯玛
为陡土
的代码。此外,您应该检查二进制文件中的重定位表(例如,使用
)。 这是关于PIE的一个很好的演示(它是关于OpenBSD,但过程是相同的)。 http://www.openbsd.org/papers/nycbsdcon08-pie/或http://www.dcbsdcon.org/speakers/slides/miller_dcbsdcon2009.pdf 我想你不仅应该改变一个GOT,而且还要找到所有的重定位并去做。 基本上,ld.so对PIE二进制文件的处理与使用PIC处理动态库几乎相同,不是重定位库,而是重定位可执行映像本身。 您看到的“错误地址”是一个地方,其中实际值将通过重新定位解决来写入。对于i386 http://books.google.com/books?id=Id9cYsIdjIwC&pg=PA174,有重定位: R_386_GOTPC R_386_GOT32 R_386_GOTOFF R_386_RELATIVE 在代码可以访问全局数据之前,链接器应解决所有这些问题。 Readelf -r示例: 动态链接的
馅饼: