基本情報技術者 2016年 春期 午前(科目A) 問20
問題文
リンカの機能として、適切なものはどれか。
選択肢
ア:作成したプログラムをライブラリに登録する。
イ:実行に先立ってロードモジュールを主記憶にロードする。
ウ:相互参照の解決などを行い、複数の目的モジュールなどから一つのロードモジュールを生成する。(正解)
エ:プログラムの実行を監視し、ステップごとに実行結果を記録する。
🔒 解説は解答すると表示されます
リンカの機能【午前解説】
正解の理由
選択肢のうち、ウ は「相互参照の解決などを行い、複数の目的モジュールなどから一つのロードモジュールを生成する」と述べており、これはリンカ(linker, link editor)の定義そのものです。
リンカは複数のオブジェクトファイル(目的モジュール)やライブラリの参照を結び、シンボル解決(どの関数や変数がどのアドレスにあるかを決定)と再配置(relocation)を行って、最終的にロード可能または実行可能な単一のモジュール(ロードモジュール/実行ファイル)を生成します。これにより、コンパイル単位をまたいだ関数呼び出しや外部変数参照が正しく動作するようになります。
リンカは複数のオブジェクトファイル(目的モジュール)やライブラリの参照を結び、シンボル解決(どの関数や変数がどのアドレスにあるかを決定)と再配置(relocation)を行って、最終的にロード可能または実行可能な単一のモジュール(ロードモジュール/実行ファイル)を生成します。これにより、コンパイル単位をまたいだ関数呼び出しや外部変数参照が正しく動作するようになります。
解法ステップ
- 問題文を読み、「リンカの機能」を問うていることを確認する。キーワードは「相互参照」「ロードモジュール」「目的モジュール」。
- 各選択肢のキーワードと役割を対応付ける:ライブラリ登録=アーカイブ管理、主記憶にロード=ローダ、実行監視=デバッガ。
- リンカの基本機能(シンボル解決・再配置・結合)を満たす選択肢を選ぶ。
- 動的リンク(実行時)と静的リンク(リンク時)の違いも頭に入れておくと迷わない。
選択肢別の誤答解説
- ア: 作成したプログラムをライブラリに登録する。
→ これはライブラリ管理(アーカイブ作成や登録)の説明であり、リンカの主機能ではありません。リンカはライブラリから必要なオブジェクトを引き出して結合する側です。 - イ: 実行に先立ってロードモジュールを主記憶にロードする。
→ これはローダ(loader)の仕事です。ローダは実行可能ファイルを主記憶に配置して実行開始する役割を持ちます。 - ウ: 相互参照の解決などを行い、複数の目的モジュールなどから一つのロードモジュールを生成する。
→ 正解。リンカの定義に一致します。シンボル解決、再配置、結合を行ってロード可能なモジュールを生成します。 - エ: プログラムの実行を監視し、ステップごとに実行結果を記録する。
→ これはデバッガ(デバッガ/トレースツール)の仕事で、ステップ実行やブレークポイント、実行結果のトレースを行います。
よくある誤解
- 「主記憶にロードするのもリンカ」と考える誤解:主記憶への配置はローダ(loader)の仕事であり、リンカはファイル内でのアドレスや参照関係を解決する処理です。
- 「ライブラリに登録するのがリンカ」と思い込む誤解:ライブラリへの追加・管理はライブラリ管理ツール(アーカイブユーティリティ等)の役割であって、リンカはライブラリから必要なモジュールを取り出して結合する側です。
- 動的リンクと静的リンクを混同する誤解:動的リンキングは実行時のリンク処理(ランタイムローダ/ダイナミックリンカ)が関わる点を区別して理解する必要があります。
補足コラム
リンカの処理は大きく分けて以下を含みます。
- シンボル解決:未定義シンボル(外部参照)を定義側シンボルに結びつける。
- 再配置(relocation):目的コード内の相対/絶対アドレスを最終アドレスに修正する。
- 結合:複数のオブジェクトファイルとライブラリを一つの出力ファイルにまとめる。
静的リンクでは上記がリンク時に完了し、実行ファイルに全て組み込まれます。動的リンク(共有ライブラリ)は実行時に一部の解決や再配置を行う場合があり、動的ローダ(例:ld.so)が関与します。Unix系では ld がリンカ、ld.so がランタイムローダとしての役割を担います。
簡単なコマンド例(Unix系):
# コンパイルとリンク(静的リンクの場合)
gcc main.c util.c -o myprog
# 明示的にリンカを呼ぶ例
gcc -c main.c # main.o を生成
gcc -c util.c # util.o を生成
ld main.o util.o -o myprog
FAQ
Q1: リンカとローダの違いは何ですか?
A1: リンカはファイルレベルでシンボル解決と再配置を行い単一のロード可能ファイルを作る処理、ローダはそのファイルを主記憶に読み込んで実行を開始する処理です。
A1: リンカはファイルレベルでシンボル解決と再配置を行い単一のロード可能ファイルを作る処理、ローダはそのファイルを主記憶に読み込んで実行を開始する処理です。
Q2: 静的リンクと動的リンクはどちらがリンカの仕事ですか?
A2: 静的リンクの大部分はリンク時(リンカ)に行われます。動的リンクは実行時にランタイムリンカ/ローダが関与して一部の結合や再配置を行います。
A2: 静的リンクの大部分はリンク時(リンカ)に行われます。動的リンクは実行時にランタイムリンカ/ローダが関与して一部の結合や再配置を行います。
Q3: 「ライブラリに登録する」は誰の仕事ですか?
A3: ライブラリの作成・登録はアーカイブユーティリティ(例:ar)やライブラリ管理ツールの仕事であり、リンカはそのライブラリを参照して必要なオブジェクトを取り出す側です。
A3: ライブラリの作成・登録はアーカイブユーティリティ(例:ar)やライブラリ管理ツールの仕事であり、リンカはそのライブラリを参照して必要なオブジェクトを取り出す側です。
Q4: リンカが複数定義を見つけたらどうなる?
A4: 設定やリンク順に依存しますが、通常はエラー(multiple definition)になったり、特定の定義に優先権が与えられたりします。リンカがどの定義を採用するかはリンカの仕様やオプションによります。
A4: 設定やリンク順に依存しますが、通常はエラー(multiple definition)になったり、特定の定義に優先権が与えられたりします。リンカがどの定義を採用するかはリンカの仕様やオプションによります。
関連キーワード: リンカ、ローダ、シンボル解決、リロケーション、静的リンク、動的リンク、ライブラリ、デバッガ

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

