我有以下 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
看一下为 main() 生成的汇编代码。我想你会发现语句
uint32_t *a = __memory_info.flash_end;
没有生成任何代码,因为没有理由生成这个负载。
如果你改变:
extern memory_info_t __memory_info;
至:
extern volatile memory_info_t __memory_info;
它可能会吓到编译器不理会虚拟负载,但易失性的语义一开始很混乱,并随着时间的推移而衰退。