相关疑难解决方法(0)

如何从C获取ld链接程序脚本中定义的变量的值

我正在编写一个程序来运行裸机。我正在尝试从自定义链接描述文件中获取变量以在C中使用,这是我尝试过的。

从C:

extern unsigned long* __START_OF_PROG_MEMORY;
volatile unsigned long *StartOfProgram = (unsigned long*) (&__START_OF_PROG_MEMORY);
Run Code Online (Sandbox Code Playgroud)

链接描述文件:

SECTIONS
{
    . = 0x80000;
    PROVIDE(__START_OF_PROG_MEMORY = .);
    .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) }
    .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) }
    PROVIDE(_data = .);
    .data : { *(.data .data.* .gnu.linkonce.d*) }
    .bss (NOLOAD) : {
        . = ALIGN(16);
        __bss_start = .;
        *(.bss .bss.*)
        *(COMMON)
        __bss_end = .;
    }
    _end = .;
    PROVIDE(__END_OF_PROG_MEMORY = .);

   /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) }
} …
Run Code Online (Sandbox Code Playgroud)

c linker gcc

5
推荐指数
2
解决办法
1663
查看次数

是否在 C 中访问链接描述文件变量未定义行为的“值”?

GNU ld(链接器脚本)手册第3.5.5源代码参考有一些关于如何访问 C 源代码中的链接器脚本“变量”(实际上只是整数地址)的非常重要的信息。我用了这个信息。广泛使用链接器脚本变量,我在这里写了这个答案:How to get value of variable defined in ld linker script from C

然而,很容易做错,并尝试访问链接描述文件变量的(错误地)而不是它的地址,因为这有点深奥。手册(上面的链接)说:

这意味着,你不能访问 链接脚本定义符号的-它没有价值-所有你能做的就是访问的地址链接脚本定义的符号。

因此,当您在源代码中使用链接描述文件定义的符号时,您应该始终获取该符号的地址,并且永远不要尝试使用其 value

问题:那么,如果您确实尝试访问链接描述文件变量的value,这是“未定义的行为”吗?

快速复习:

想象一下在链接脚本(例如:STM32F103RBTx_FLASH.ld)中你有:

/* Specify the memory areas */
MEMORY
{
    FLASH (rx)      : ORIGIN = 0x8000000,  LENGTH = 128K
    RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 20K
}

/* Some custom variables (addresses) I intend to access …
Run Code Online (Sandbox Code Playgroud)

c linker ld linker-scripts binutils

5
推荐指数
1
解决办法
2453
查看次数

标签 统计

c ×2

linker ×2

binutils ×1

gcc ×1

ld ×1

linker-scripts ×1