リンカスクリプトとは?組み込みC言語のメモリ配置の仕組みをわかりやすく解説

目次

メモリ領域解説シリーズ

本記事は「メモリ領域解説」シリーズの1つです。

メモリ領域解説シリーズの全体像はこちら

組み込み開発では、プログラムや変数が
ROMやRAMのどこに配置されるかが決まっています。

メモリ領域の全体像

この配置(メモリマップ)を決めているのが
リンカスクリプト です。

例えば

・textはROMに配置
・dataはRAMに配置
・bssはRAMに配置
・stackの位置

といった情報をリンカスクリプトで定義します。

この記事ではリンカスクリプトの役割を
初心者向けにわかりやすく解説します。

ROM・FLASH・RAMの違いについてはこちらの記事で解説しています。

メモリ領域の全体像についてはこちらの記事で解説しています。

初心者さん

メモリマップって誰が決めてるんですか?

エンジニアくん

リンカスクリプトだね。

初心者さん

リンカって何でしたっけ?

エンジニアくん

複数のオブジェクトファイルを
1つにまとめるツールだね。

初心者さん

そのとき配置も決めるんですね。

エンジニアくん

そう、どこに置くかを
リンカスクリプトで指定するんだ。

リンカスクリプトとは?

リンカスクリプトとは
メモリ配置を決める設定ファイル です。

コンパイル後、リンカは

・関数
・グローバル変数
・constデータ

を1つの実行ファイルにまとめます。

そのとき

「どこに配置するか」

を指示するのがリンカスクリプトです。

リンカスクリプトの役割

リンカスクリプトは主に次を決めます

・ROMの開始アドレス
・RAMの開始アドレス
・textの配置
・dataの配置
・bssの配置
・stack位置
・heap位置

つまり

メモリマップそのもの を決定します。

メモリマップについてはこちらの記事で解説しています。


リンカスクリプトのイメージ

例えば次のように定義します

ROM 0x08000000
RAM 0x20000000

text → ROM
data → RAM
bss  → RAM

するとメモリマップは

ROM

text
rodata
data初期値

RAM

data
bss
heap
stack

となります。


なぜリンカスクリプトが必要?

組み込みではメモリ構成が固定だからです。

例えば

ROM 512KB
RAM 128KB

のように決まっています。

そのため

・ROMにコードを配置
・RAMに変数を配置

を明示的に指定する必要があります。

PCではこれをOSがやりますが
組み込みでは自分で決めます。

それがリンカスクリプトです。


スタートアップコードとの関係

スタートアップコードは

dataコピー
bss初期化

を行います。

このとき

・ROMのdata位置
・RAMのdata位置

を参照します。

このアドレスは
リンカスクリプトで決まっています。

スタートアップコードについてはこちらの記事で解説しています。


まとめ

リンカスクリプトとは

・メモリ配置を決める設定
・text / data / bss の位置を決定
・メモリマップを作る
・スタートアップコードが参照

組み込み開発では重要な要素です。

この記事が参考になった方へ

メモリ領域については他の記事でも解説しています。

メモリ領域解説シリーズの全体像はこちら

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

お問い合わせはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする


目次