我有以下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中的这个值作为 struct 读取.

我试着用以下方式来做:

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的说法,On断点的实际值不是我预期的:

(gdb) print a
$1 = (uint32_t *) 0xffffffff

推荐答案

经过一番研究,我找到了一个解决办法.我使用Openocd将ELF图像加载到闪存中.我发现Openocd显然不会加载没有段的节.因此,我将SHF_ALLOC标志添加到.Memory_INFO部分,以自动将其分配给段.

之前:

.section .memory_info

之后:

.section .memory_info, "a"

而且它起作用了.

C++相关问答推荐

try 使用sigqueue函数将指向 struct 体的指针数据传递到信号处理程序,使用siginfo_t struct 体从一个进程传递到另一个进程

如何将FileFilter添加到FileDialog GTK 4

ATmega328P USART发送字符重复打印

返回一个包含数组的 struct

为什么复合文字(C99)的返回会生成更多的汇编代码?

*p[num]和(*p)num的区别

难以理解Makefile隐含规则

如何在C中使printf不刷新标准输出?

预先分配虚拟地址空间的区域

如何在C++中处理按键

如何读取文件并将内容保存在字符串中?(在C语言中,没有崩溃或核心转储错误)

生产者消费者计数器意外输出的C代码

如何摆脱-WIMPLICIT-Function-声明

为什么我无法访问C语言中的文件

从Raku nativecall调用时精度不同

如何在C中计算包含递增和递减运算符的逻辑表达式?

execve 不给出which命令的输出

函数指针作为函数参数 - 应该使用 const 吗?

为什么写入关闭管道会返回成功

是否可以在多字 C 类型中的任何位置混合存储和类型限定符?