我正在制作一个引导程序并让它能够自行更新。此过程涉及将二进制文件复制到新位置,跳转到它,并使用它在原始位置刷新新的引导加载程序。这是使用ARM GCC工具链为Eclipse中的M4处理器开发的。
为此,我已经收集到我需要编译为位置独立代码(PIC)。
我已经四处寻找并找到了这篇优秀的文章,所以当我添加" -fPIC"到ARM GCC编译器调用我希望看到关于GOT和PLT丢失的链接器错误 https://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/
在我的链接描述文件中,我将这些位置添加到.data部分,如下所示:
.data : AT(__DATA_ROM)
{
. = ALIGN(4);
__DATA_RAM = .;
__data_start__ = .; /* Create a global symbol at data start. */
*(.got*) /* .got and .plt for position independent code */
*(.data) /* .data sections */
*(.data*) /* .data* sections */
KEEP(*(.jcr*))
. = ALIGN(4);
__data_end__ = .; /* Define a global symbol at data end. */
} > m_data
但是,此代码无法从ROM复制到RAM。
我的下一个想法是,我的链接器可能需要知道它是链接PIC可执行文件。为了找到答案,我添加了#34; - pic-executable"到LD链接器脚本调用。但是,链接器现在为" interp"," dyn"," rel.dyn"生成部分。和"哈希"。我也尝试将它们放入数据部分,但是出现了以下错误:
GCC-臂-NONE-EABI-4_9 / bin中/../ LIB / GCC /臂-NONE-EABI / 4.9.3 /../../../../臂-NONE-EABI /斌/ ld.exe: 找不到输出部分.hash
GCC-臂-NONE-EABI-4_9 / bin中/../ LIB / GCC /臂-NONE-EABI / 4.9.3 /../../../../臂-NONE-EABI /斌/ ld.exe: 最终链接失败:关于输出的不可代表部分
我认为这意味着编译器实际上没有填充" .hash"任何部分,所以链接失败。
我是否正确地解决了这个问题?还有什么我需要添加来让编译器去做吗?任何帮助将不胜感激。
答案 0 :(得分:0)
引导代码并重新定位涉及许多谨慎的步骤以及RAM,SPI和其他必要外设的配置初始化。
我知道U-Boot会执行您要实现的序列。因此,更好的开始是通过u-boot documentation和源,处理器或感兴趣的板的机器特定文件夹。
答案 1 :(得分:0)
就其价值而言,我和NXP的技术支持团队都无法获得其S32DS IDE来编译真正独立于位置的代码。
到目前为止,我们有两个引导加载程序-一个是针对位置A编译的引导程序,另一个是针对位置B的中间程序。更新都需要这两个程序。
答案 2 :(得分:0)
TI使用Tivaware引导程序进行此操作。您可以使用链接器gnu ld欺骗来做到这一点:
.text 0x20000000 : AT (0x00000000)
{
_text = .;
KEEP(*(.isr_vector))
*(.text*)
*(.rodata*)
_etext = .;
}
将练习代码从0x0的Flash复制到0x2000_0000的SRAM留给读者。