リンカ・ローダと実行形式

OSのないマイコンで、電源を入れた直後に起動コードがmainを呼ぶ前に行う処理として正しいものはどれか。

  1. A.textの機械語をすべてRAMからフラッシュへ書き戻す
  2. BRAMの内容を読み出し、前回の電源断のときの変数の値を復元する
  3. C.dataの初期値をフラッシュからRAMへコピーし、.bssの領域を0で埋める
答えと解説を見る

正解:C. .dataの初期値をフラッシュからRAMへコピーし、.bssの領域を0で埋める

電源を切るとRAMの内容は消えるので、初期値のある変数の値は書き換えられないフラッシュに保存しておき、起動コードがRAM上の変数の場所へコピーします。初期値のない変数の領域(.bss)は0で埋めます。リンカスクリプトでは、.dataについて「フラッシュに置く番地」と「実行時にRAMで使う番地」を別々に指定します。これらを終えて初めて、C言語の約束どおりの状態でmainを始められます。

  • A. 書き戻しは行いません。
  • B. ふつうのRAMの内容は電源を切ると消えます。
  • C. 正しい。C言語の初期値の約束を守るための処理です。
この分野を解く 分野ページへ

リンカ・ローダと実行形式のほかの問題

  1. ELFのファイルにおける「セクション」と「セグメント」の違いとして正しいものはどれか。
  2. メモリのページに「書き込み可能」と「実行可能」を同時には許さない(W^X、書き込みと実行の分離)ことで防ぎやすくなる攻撃はどれか。
  3. Linuxの共有ライブラリで、libfoo.so.1の「.1」のようなsonameのバージョン番号を上げるのは、一般にどのようなときか。
  4. Linuxでlddコマンドを実行ファイルに使うと分かることはどれか。
  5. 主なOSで使われる実行ファイルの形式の組み合わせとして正しいものはどれか。