从C中的外部ELF符号中阅读值

ozxc1zmp  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(150)

我有以下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

d6kp6zgx

d6kp6zgx1#

看一下main()生成的汇编代码,我想你会发现uint32_t *a = __memory_info.flash_end;语句没有生成任何代码,因为没有理由生成这个加载。
如果您更改:
extern memory_info_t __memory_info;
收件人:
extern volatile memory_info_t __memory_info;
它可能会吓到编译器,让它不去理会虚拟加载,但是 volatile 的语义开始时很混乱,并且随着时间的推移而衰退。

aiazj4mn

aiazj4mn2#

经过一番研究,我找到了一个解决方案。我使用openocd将ELF图像加载到闪存中。我发现openocd显然不会加载没有段的部分。所以我在.memory_info部分添加了SHF_ALLOC标志,以自动将其分配给段。
之前:

.section .memory_info

字符串
之后:

.section .memory_info, "a"


而且很有效

相关问题