我有以下ELF符号(在部件文件中定义):
Disassembly of section .memory_info:
10000bb8 <__memory_info>:
10000bb8: 10000bd4 ldrdne r0, [r0], -r4
10000bbc: 20000000 andcs r0, r0, r0
10000bc0: 00000000 andeq r0, r0, r0
10000bc4: 20000000 andcs r0, r0, r0
10000bc8: 00000000 andeq r0, r0, r0
10000bcc: 20000000 andcs r0, r0, r0
10000bd0: 000000a8 andeq r0, r0, r8, lsr #1
字符串
我想在C中把这个值读成结构。
我试着用下面的方法来做:
typedef struct {
void *flash_end;
void *ram_text_begin;
void *ram_text_size;
void *ram_data_begin;
void *ram_data_size;
void *ram_bss_begin;
void *ram_bss_size;
} memory_info_t;
int main() {
extern memory_info_t __memory_info;
uint32_t *a = __memory_info.flash_end;
asm("bkpt #0");
}
型
但是根据gdb的断点上的实际值不是我所期望的:
(gdb) print a
$1 = (uint32_t *) 0xffffffff
型
2条答案
按热度按时间d6kp6zgx1#
看一下main()生成的汇编代码,我想你会发现
uint32_t *a = __memory_info.flash_end;
语句没有生成任何代码,因为没有理由生成这个加载。如果您更改:
extern memory_info_t __memory_info;
个收件人:
extern volatile memory_info_t __memory_info;
个它可能会吓到编译器,让它不去理会虚拟加载,但是 volatile 的语义开始时很混乱,并且随着时间的推移而衰退。
aiazj4mn2#
经过一番研究,我找到了一个解决方案。我使用openocd将ELF图像加载到闪存中。我发现openocd显然不会加载没有段的部分。所以我在.memory_info部分添加了SHF_ALLOC标志,以自动将其分配给段。
之前:
字符串
之后:
型
而且很有效