如何使用 crt0.o 在我的裸机 C 程序中设置 .bss 和 .data?

Mul*_*ync 5 c embedded crt bare-metal cortex-m

我成功地编写了一个在我的 STM32F4 上运行的裸机 C 程序。没什么特别的,只是通常的led-blinky-program。在这个项目中,我编写了初始化例程,用于清除该.bss部分并.data自己初始化该部分。

这并不复杂。在链接器脚本中,我只是指示链接器创建一些标记.dataand.bss部分的开始和结束的符号。

.data 0x20001000 :
    ALIGN(4)
    {
        __etext = LOADADDR(.data);
        __data_start__ = ADDR(.data) ;
        *(.data*) ;
        __data_end__ = ADDR(.data) + SIZEOF(.data) ;
    } >RAM AT>ROM


.bss :
    ALIGN(4)
    {
        __bss_start__ = ADDR(.bss) ;
        *(.bss*) ;
        __bss_end__ = ADDR(.bss) + SIZEOF(.bss) ;
    } >RAM
Run Code Online (Sandbox Code Playgroud)

然后我在我的代码中使用了这些符号:

extern unsigned int __etext;
extern unsigned int __data_start__;
extern unsigned int __data_end__;
extern unsigned int __bss_start__;
extern unsigned int __bss_end__;


void Reset_Handler()
{
    unsigned int * src;
    unsigned int * dest;

    src = &__etext;
    dest = &__data_start__;

    /* copy .data */
    while (dest < &__data_end__)
        *(dest++) = *(src++);

    /* Zero bss.  */
    for (dest = &__bss_start__; dest < &__bss_end__; dest++)
        *dest = 0;
}
Run Code Online (Sandbox Code Playgroud)

现在我想将crt0用于设置.bss.data. (我听说设置东西是 的主要目的crt0。)

我怎样才能做到这一点?在链接描述文件中定义符号和在代码中使用 的基本原理是否相同?


TL; 博士

如何使用crt0我的.bss.data部分设置?

use*_*249 1

一般来说,在链接器命令文件/脚本中......

发布的脚本有一些问题。

建议类似于以下内容。(使用实际的原点和长度参数)(请注意,.text、.data、.bss 不是创建的唯一部分。还有更多部分,应适当列出)

您应该查看http://www.math.utah.edu/docs/info/ld_3.html#SEC18 了解链接器命令文件的详细信息和示例

/* this is a very simple memory layout */
/* usually there are separate memory items */
/* for each memory mapped peripheral */
/* external RAM, etc etc etc */
MEMORY {
    rom : ORIGIN = 0, LENGTH = 256K
    ram : ORIGIN = 0x40000000, LENGTH = 4M
}

SECTIONS {
    rom :0 (NOLOAD) BLOCK(4) {
    }

    ram : {
        .text : BLOCK(4) {
        .textStart = .;
        *(.text)
        .textEnd = .;
        }

        .bss : BLOCK(4) {
        .bssStart = .;
        *(.bss)
        .bssEnd = .;
        }

        .data : BLOCK(4) {
        .dataStart = .;
        *(.data)
        .dataEnd = .;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)