gpt4 book ai didi

c - 如何防止隐式链接描述文件更改部分的 LMA

转载 作者:行者123 更新时间:2023-12-01 08:13:02 24 4
gpt4 key购买 nike

我正在为软件使用模块化构建系统,而不是在 ARM 嵌入式目标和普通 X86 (linux) 机器上运行。我正在使用 GNU 工具链进行编译,因此使用 ld 进行链接。

其中一个模块使用链接脚本技巧来组装“已注册”对象的数组。这些对象是用这样的宏创建的:

#define RegObject(name, arg1, arg2, etc) \
static TRegObject name \
__attribute__((section ("regobj_table"), used)) = \
{ arg1, arg2, etc }

该模块还添加了一个 implicit linker script到链接步骤,看起来像这样:

SECTIONS
{
.data : ALIGN(4)
{
regobj_table_start = .;
KEEP(*(regobj_table))
regobj_table_end = .;
}
}

代码使用 regobj_table_startregobj_table_end 符号来查找已注册的对象。此解决方案适用于 native (Linux) 编译目标。

但这不适用于 ARM 目标。原因是我有一个针对目标的自定义默认链接描述文件(它是一个微型微 Controller ,在没有操作系统的情况下运行),它为 .data 部分定义了加载内存地址。这是因为该部分存储在闪存中,但一旦微 Controller 启动,它就会被复制到 RAM 中。链接描述文件的相关部分如下所示:

MEMORY
{
ROM (rx) : ORIGIN = 0x00000000, LENGTH = 512k
RAM (rwx) : ORIGIN = 0x40000000, LENGTH = 32k
}

SECTIONS
{
/* ... other stuff ... */

.data :
{
_data = .;
*(.data)
*(.data.*)
} >RAM AT>ROM

/* ... even more stuff ... */
}

这会将 .data 部分的 VMA 设置为 0x4000000 范围内的某个位置,并将 LMA 设置在 0x00000000 范围内。

问题是,当隐式链接器脚本被添加到ld 的命令行时,它只是忘记了 LMA,它再次变得等于 VMA .我正在拼命寻找一种方法来告诉 ld 在加载隐式链接描述文件时不要触及 LMA。

最佳答案

尝试使用 INSERT AFTER ... 作为最后一行。这会将您的脚本插入到默认脚本中。

关于c - 如何防止隐式链接描述文件更改部分的 LMA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14880585/

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