カスタマーサポートセンター

FAQ~よくある質問~ | FAQマスタ詳細表示

FAQ詳細情報

ID 10810976
FAQカテゴリ(大) リンカ
最終更新日 2016-03-27

質問内容

同じ名前のセクションを別の region に分割して配置しましたが、配置されたセクションのアドレスを知るには?

回答内容

問題

同じセクション名の .o ファイルを別の region に配置すると、アセンブラ/Cソースで配置したアドレスやサイズを知ることができなくなります。

place in ROM1_region { ro section MYSEG_init object data1.o };
place in ROM2_region { ro section MYSEG_init object data2.o };

 

-- Cソース --

#pragma section = "MYSEG_init"
char *rom1_start = __section_begin("MYSEG_init"); // ?

 

回答

いったん下記のように、別々にブロックを定義してから、それぞれのブロックの配置アドレス、サイズを求めてください。

define block ROM1_block { ro section MYSEG_init object data1.o }; 
define block ROM2_block { ro section MYSEG_init object data2.o };

"ROM1":place in ROM1_region { block ROM1_block };
"ROM2":place in ROM2_region { block ROM2_block };

 

++++ テストコード

#include <intrinsics.h>
#include <stddef.h>
#include <stdio.h>

#pragma section = "ROM1_block"
#pragma section = "ROM2_block"

int main()
{
    size_t rom1_size = __section_size("ROM1_block");
    char *rom1_start = __section_begin("ROM1_block");
    char *rom1_end   = __section_end("ROM1_block");

    size_t rom2_size = __section_size("ROM2_block");
    char *rom2_start = __section_begin("ROM2_block");
    char *rom2_end   = __section_end("ROM2_block");

    printf("ROM1: 0x%08x - 0x%08x (%zu)\n",  rom1_start, rom1_end, rom1_size);
    printf("ROM2: 0x%08x - 0x%08x (%zu)\n",  rom2_start, rom2_end, rom2_size);

    return 0;
}

 

++++ printf 出力 

  ROM1: 0x00010000 - 0x0001006c (108)
  ROM2: 0x00020000 - 0x0002006c (108)

参考資料URL