基本情報技術者 2018年 秋期 午前(科目A) 問20
問題文
リンカの機能として、適切なものはどれか。
選択肢
ア:作成したプログラムをライブラリに登録する。
イ:実行に先立ってロードモジュールを主記憶にロードする。
ウ:相互参照の解決などを行い、複数の目的モジュールなどから一つのロードモジュールを生成する。(正解)
エ:プログラムの実行を監視し、ステップごとに実行結果を記録する。
リンカの機能として、適切なものはどれか。【午前2 解説】
要点まとめ
- 結論→リンカは相互参照の解決や再配置を行い、複数の目的モジュールを一つのロードモジュールにまとめる機能を持つ。
- 根拠→オブジェクトファイルの未解決シンボルを結びつけ、アドレス再配置を施して単一の実行可能なモジュールを生成するためである。
- 差がつくポイント→ロードは主記憶への配置、デバッグはステップ実行、ライブラリ登録はアーカイブ操作と区別して理解すると得点差がつく。
正解の理由
正解は ウ です。リンカは複数の目的モジュール(オブジェクトファイル)間の相互参照(未解決シンボル)の解決、再配置(relocation)、必要に応じてライブラリからの取り込みなどを行い、ひとつのロードモジュール(実行可能ファイルや共有ライブラリ)を生成します。これが問題文ウの説明そのものです。
よくある誤解
- 「ロード(主記憶に載せること)もリンカの仕事」と混同する受験者が多いが、ロードはOSのローダ(あるいは実行時のローダ)が行う処理である。
- 「ライブラリに登録する=リンカの機能」と誤解しやすいが、ライブラリ作成(アーカイブ)は ar のようなツールで行い、リンカはそれを参照して結合するだけである。
- 「実行監視やステップ実行がリンカの仕事」と思う人がいるが、これはデバッガ(例:gdb)の機能である。
解法ステップ
- 各選択肢が示す役割をキーワードで要約する(例:ライブラリ登録、ロード、相互参照解決、実行監視)。
- 「リンカ」の定義(オブジェクトファイル結合、シンボル解決、再配置)と照合する。
- 一致するものを選ぶ。該当しないものは別のツール(ローダ、アーカイバ、デバッガ)の機能であると切り分ける。
- 最終的に相互参照解決や再配置を行う選択肢を選ぶ(ウ)。
選択肢別の誤答解説
- ア: 作成したプログラムをライブラリに登録する。
誤り。ライブラリ(静的ライブラリ a ライブラリ等)への登録やアーカイブ作成は ar のようなアーカイバが行う操作であり、リンカはそのライブラリをリンク時に参照するだけです。 - イ: 実行に先立ってロードモジュールを主記憶にロードする。
誤り。主記憶へのロードはローダ(ロードプログラム)またはOSの実行時ローダが担当します。リンカはファイルを結合してロード可能なモジュールを作る段階までを担当します。 - ウ: 相互参照の解決などを行い、複数の目的モジュールなどから一つのロードモジュールを生成する。
正解。リンカの代表的な機能説明に一致します。シンボル解決、再配置、ライブラリ取り込み、出力ファイル生成を含みます。 - エ: プログラムの実行を監視し、ステップごとに実行結果を記録する。
誤り。これはデバッガ(デバッグツール)の機能であり、リンカの役割ではありません。
補足コラム
リンカは「静的リンク」と「動的リンク(共有ライブラリのリンク)」の双方に関与しますが、動的リンクでは実際のシンボル解決や再配置が実行時(ロード時または遅延)に行われることがあります。近年はリンク時最適化(LTO: Link Time Optimization)や不要コード除去など、リンカ段階で最適化を行う機能も一般的です。代表的なコマンド例:
# 複数オブジェクトファイルを結合して実行ファイルを生成(内部でリンカが呼ばれる) gcc main.o util.o -o myprog # ライブラリを作る(アーカイバ。リンカではない) ar rcs libmylib.a a.o b.o
また、リンカは再配置テーブルやシンボルテーブルを参照し、アドレスを書き換える作業を行います。共有ライブラリでは動的リンカ(ld.so 等)が実行時にこれを行います。
FAQ
Q1: リンカとローダの違いは何ですか?
A1: リンカはファイル同士の結合やシンボル解決、再配置を行い実行可能なモジュールを作るツールです。ローダはその生成物を主記憶へ配置してプログラムの実行を開始する役割を担います。
A1: リンカはファイル同士の結合やシンボル解決、再配置を行い実行可能なモジュールを作るツールです。ローダはその生成物を主記憶へ配置してプログラムの実行を開始する役割を担います。
Q2: 動的リンクでもリンカは関係ありますか?
A2: はい。動的リンクではリンク時に共有ライブラリへの参照情報を埋め込み、実際の解決は実行時(動的リンカ)で行われる場合があります。リンカは共有オブジェクトを適切に参照する情報を出力します。
A2: はい。動的リンクではリンク時に共有ライブラリへの参照情報を埋め込み、実際の解決は実行時(動的リンカ)で行われる場合があります。リンカは共有オブジェクトを適切に参照する情報を出力します。
Q3: ライブラリ登録はどうやって行うのですか?
A3: 静的ライブラリの作成は通常 ar などのアーカイバツールで行います。リンカはそのライブラリを入力として参照し、必要なシンボルだけを取り込むことができます。
A3: 静的ライブラリの作成は通常 ar などのアーカイバツールで行います。リンカはそのライブラリを入力として参照し、必要なシンボルだけを取り込むことができます。
関連キーワード: リンカ、ローダ、リンク、静的リンク、動的リンク、再配置、シンボル解決、オブジェクトファイル、ライブラリ、デバッガ

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

