我有一个关于gcc链接器描述文件的非常具体的问题。我有一个嵌入式项目,必须确保主符号或主符号的地址出现在特定地址(Elf文件)。
原因是,我有一个微控制器,上面有一个bootloader。此引导加载程序应在引导后调用主例程。出于这个原因,我必须在启动后提供跳转到的地址。
是否有一种方法可以使用链接描述文件强制符号始终位于表格顶部或输入地址,或者我甚至可以通过某种方式获取符号的地址以将其写回特定位置?
提前谢谢。答案 0 :(得分:10)
当然有办法。您最好的选择是使用仅适用于您的功能的部分:
int start(void) __attribute__((section(".start")));
int start(void)
{
}
然后在链接器脚本中:
SECTIONS
{
. = 0x1234; // <---- put here your address
.start :
{
*(.start)
}
}
或类似的东西(自从我使用它以来已经很长时间了。)
答案 1 :(得分:0)
如果您已经有一个链接器控制文件(我假设您使用的是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()是其中的第一个函数),你就被设置了。