gpt4 book ai didi

c - 如何为 GCC 代码指定手动重定位?

转载 作者:行者123 更新时间:2023-12-02 04:07:13 26 4
gpt4 key购买 nike

我在嵌入式系统(xtensa 处理器)中遇到这样的情况,我需要手动覆盖一个符号,但该符号恰好位于另一个符号的中间。当我尝试使用-Wl,--wrap=symbol时它不会起作用,因为符号不是它自己的东西。

我需要做的是指定(最好是在 GCC .S 中,尽管 .c 也可以)代码的结束位置。虽然实际的符号将被编译器随机定位在某个地方,但我将是 memcpy将代码放到正确的位置。

40101388 <replacement_user_vect>:
40101388: 13d100 wsr.excsave1 a0
4010138b: 002020 esync
4010138e: 011fc5 call0 4010258c <_UserExceptionVector_1>

我的问题是 GCC 创建具有相对跳转的程序集,假设代码位于闪存中的位置,而最终位置将固定在中断 vector 中。我如何告诉 GCC/GNU“将代码放在您想要的任何地方,但是,相信我,它实际上会从{这里}执行”

尽管我的代码位于 0x40101388(GCC 决定),但它最终会驻留在 0x40100050 处并执行。如何通过告诉 GCC“将代码放在此处”来欺骗 GCC,但假装它位于“此处”

编辑:我能够解决这个问题,事实证明,我需要修改的函数单独保存在链接器脚本中。我可以在链接器脚本中将其切换出来。虽然我仍然很想知道答案,但我现在有一个解决方法。

最佳答案

在链接描述文件中,每个输出节都有两个关联的地址:VMA 和 LMA——代码链接的地址和代码加载的地址。

将需要重定位的代码放入单独的部分,使用所需的 VMA 和 LMA 将输出部分添加到链接器脚本中,并在其中放置与代码部分名称匹配的输入部分。

例如以下C代码

void f(void) __attribute__((section(".relocatable1.text")))
{
...
}

extern char _relocatable1_lma[];
extern char _relocatable1_vma_start[];
extern char _relocatable1_vma_end[];

void relocatable1_copy(void)
{
memcpy(_relocatable1_vma_start, _relocatable1_lma,
_relocatable1_vma_end - _relocatable1_vma_start);
}

与以下 ld 脚本一起,将 VMA 替换为所需的目标代码位置

SECTIONS {
...
.some_section : { ... }
.relocatable1 VMA : AT(LOADADDR(.some_section) + SIZEOF(.some_section)) {
_relocatable1_vma_start = . ;
*(.relocatable1.literal .relocatable1.text) ;
_relocatable1_vma_end = . ;
}
_relocatable1_lma = LOADADDR(.relocatable1) ;
...
}

应该做你想做的事。

关于c - 如何为 GCC 代码指定手动重定位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38908184/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com