GCC链接器描述文件强制符号位于特定地址

gcc linker description file force symbol to be at specific address

本文关键字:符号 于特定 地址 链接 描述 文件 GCC      更新时间:2023-10-16

我有一个关于gcc链接器描述文件的非常具体的问题。我有一个嵌入式项目,必须确保,主要符号或主要符号的地址存在于特定地址(Elf文件)。

原因是,我有一个微控制器,它上面有一个引导加载程序。这个引导加载程序应该在启动后调用主例程。因此,我必须提供启动后跳转到的地址。

是否有一种方法使用链接器描述文件来强制符号始终在表的顶部或输入地址,或者我甚至可以以某种方式获得符号的地址以将其写回特定位置?

提前谢谢。

当然有办法。您最好的选择是为您的函数使用一个节:

int start(void) __attribute__((section(".start")));
int start(void)
{
}
然后在链接器脚本中:
SECTIONS
{
    . = 0x1234; // <---- put here your address
    .start : 
    {
        *(.start)
    }
}

或者类似的东西(我已经很长时间没有使用这个了)

如果您已经有一个链接器控制文件(我假设您正在使用gcc工具链),那么您只需要将包含main()函数的对象文件放入第一部分(并将其留在Makefile之外)。

下面是一个例子:

MEMORY
{
   rom (RX) : ORIGIN = START_ADDRESS, LENGTH = 0x0010000
}
SECTIONS
{
    .text :
    {
        main.o (.text) /* this is the program entry point */
        *(.text)
    }
    .data :
    {
        . = ALIGN(4);
        *(.data)
    }
 }

(这是简化了一点,但我认为你明白了)。.text部分从START_ADDRESS开始,只要您确保您的main。O位于这里( main()是其中的第一个函数),您设置。