从C中的ELF符号读取值

问题描述 投票:0回答:1

我有以下 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
c elf
1个回答
0
投票

看一下为 main() 生成的汇编代码。我想你会发现语句

    uint32_t *a = __memory_info.flash_end;
没有生成任何代码,因为没有理由生成这个负载。

如果你改变:

extern memory_info_t __memory_info;

至:

extern volatile memory_info_t __memory_info;

它可能会吓到编译器不理会虚拟负载,但易失性的语义一开始很混乱,并随着时间的推移而衰退。

© www.soinside.com 2019 - 2024. All rights reserved.