gccでCのソースコードから、リンカスクリプトで定義するセクションのアドレスを参照する手順を調べました。
gccでBSS領域のクリアをするコードを書く場合に、セクションの開始アドレスと終了アドレスを参照する必要があります。
gccでセクションのアドレスを参照する
リンカスクリプトの例
BSSの最初と最後にラベルを配置します。 .はカレント位置のアドレスを示します。
MEMORY
{
ROM(rxai) : ORIGIN = 0, LENGTH = 64k
RAM(wxai) : ORIGIN = 0x00ffe000, LENGTH = 4k
}
SECTIONS
{
.text : {} > ROM
.rodata : {} > ROM
.data : {} > RAM
. = ALIGN(4);
__bss_start = .;
.bss : {} > RAM
__bss_end = .;
}
Cのソースコードから、上記の__bss_start と __bss_endのアドレスを参照したい場合はこのように書きます。
extern const void * __bss_start;
extern const void * __bss_end;
void clear_bss(void)
{
/* clear BSS */
memset( &__bss_start, 0x00, (size_t) (&__bss_end - &__bss_start));
}
コンパイル時にリンカスクリプトを指定します
arm-eabi-none-gcc -o target.elf -Ttarget.ld main.c
- リンカスクリプトにある名前でextern const のポインタ変数を定義する
- ポインタ変数のアドレスを参照するコードを書く。
- リンカがリンク時にポインタ変数の名前からアドレスを解決してくれる。
参考
- How do you get the start and end addresses of a custom ELF section in C (gcc)?
- http://stackoverflow.com/questions/16552710/how-do-you-get-the-start-and-end-addresses-of-a-custom-elf-section-in-c-gcc
- この質問の回答のコードではexternが不足しているので注意