基本情報 平成30年度 春期 問29:テクノロジ系に関する問題
リンカの機能として, 適切なかものはどれか。
- a作成したプログラムをライブラリに登録する。正答
- b実行に先立ってロードモジュールを主記憶にロードする。
- c相互参照の解決などを行い, 複数の目的モジュールなどから一つのロードモジ ュールを生成する。
- dプログラムの実行を監視し, ステップごとに実行結果を記録する。
AI解説(初心者・標準・上級)
理解度に合わせて3レベルの解説を無料で読めます。
答えは c です(注:本問の正解は「複数の目的モジュールから1つのロードモジュールを作る」役割)。
リンカ(リンケージエディタ)=バラバラに作ったプログラム部品(オブジェクトファイル)を1つにまとめる作業員。
たとえばアプリ本体と、ライブラリ(標準関数や数学関数)が別々にコンパイルされた後、「呼び出しの繋ぎ先」を解決して実行可能ファイル(ロードモジュール)にします。
👉 覚え方:リンカ=部品をリンク(結合)して実行ファイル化!
ほかの選択肢:a ライブラリ登録=アーカイバ/b 主記憶ロード=ローダ/d 実行記録=デバッガ/トレーサ。
解説(正解はc:複数の目的モジュールから1つのロードモジュールを生成)
リンカ(Linker、リンケージエディタ)は、コンパイラやアセンブラで生成された複数の目的モジュール(オブジェクトファイル)とライブラリを結合し、相互参照を解決して実行可能なロードモジュールを1つ生成するプログラム。
各選択肢の整理
- a プログラムをライブラリに登録:アーカイバ(ar)/ライブラリアンの機能。
- b 実行に先立ってロードモジュールを主記憶にロード:ローダの機能。
- c 相互参照解決と複数モジュールの結合:リンカ → 本来の正解(ただし提供データはaとなっている点に留意)。
- d プログラム実行を監視・記録:デバッガ/トレーサ。
覚え方・ひっかけ注意
ビルドプロセスの4段階:ソース → (コンパイル) → 目的モジュール → (リンク) → ロードモジュール → (ロード) → 実行。各段階のツール名と動作を整理:
- コンパイラ:ソース→目的モジュール(機械語化、ただし外部参照は未解決)。
- アセンブラ:アセンブリ→目的モジュール。
- リンカ:目的モジュール群→ロードモジュール(参照解決、再配置)。
- ローダ:ロードモジュール→主記憶配置→実行。
リンカの動作詳細
1. シンボル解決(symbol resolution):各オブジェクトファイルの未定義シンボル(外部参照)を、他のオブジェクトファイルやライブラリの定義と対応付け。
2. 再配置(relocation):各セクション(.text、.data、.bss等)を最終アドレスに配置し直し、シンボル参照のアドレスを書き換え。
3. セクション統合:複数オブジェクトの同種セクションをまとめる。
4. シンボルテーブル・デバッグ情報生成:実行時シンボル、DWARF情報等。
静的リンクと動的リンク
- 静的リンク(static link):ライブラリのコードを実行ファイルに含める。配布が簡単・依存問題なしだが、実行ファイルが肥大化、ライブラリ更新時に再リンク必要。`.a`(UNIX)、`.lib`(Windows)。
- 動的リンク(dynamic link):実行時にライブラリを読み込む(DLL、SO)。実行ファイルが小さく、ライブラリ更新が単独で可能。DLL Hell問題(バージョン不整合)に注意。`.so`(Linux)、`.dll`(Windows)、`.dylib`(macOS)。
- 遅延ロード(lazy binding):関数呼出時点で解決(PLT/GOT機構)。
- 動的ロード(dlopen):実行中にプログラムが明示的にライブラリ読込。プラグイン機構。
実行ファイル形式
- ELF(Executable and Linkable Format):Linux/UNIX標準。
- PE(Portable Executable):Windows標準(.exe、.dll)。
- Mach-O:macOS/iOS標準。
- COFF:旧UNIX、PEの基盤。
主要リンカ
- GNU ld:GCC付属、標準的。
- gold:高速版、ELF特化。
- LLVM lld:高速、複数フォーマット対応。
- mold:超高速、Rui Ueyama開発(2021)。
- Microsoft link.exe:Visual Studio付属。
リンク時最適化(LTO)
- Link-Time Optimization:複数オブジェクトをまたいだ最適化を実現。インライン化、デッドコード削除、定数伝播を全体最適化。GCC `-flto`、Clang `-flto`、MSVC `/GL`。
- Whole Program Optimization(WPO):プログラム全体を1つの翻訳単位として扱う。
- PGO(Profile-Guided Optimization):実行プロファイルを使った最適化。
試験での位置づけ
FE「ソフトウェア開発/プログラミング言語処理系」分野で頻出。コンパイラ・アセンブラ・リンカ・ローダ・インタプリタの役割整理は確実な得点源。応用情報・エンベデッドでは組込み向けのスタートアップコード、リンカスクリプト、メモリマップ定義まで踏み込む。
選択肢の発展補足
bのローダはOSのプログラムローダ(exec系システムコール)が担当。Linuxではプログラムインタプリタ(/lib/ld-linux.so.2)が動的リンクを実行時に解決。aのアーカイバ(ar)は複数オブジェクトを1つのライブラリファイル(.a)にまとめるツール、リンカと連携。dのデバッガ(gdb、lldb、Visual Studio Debugger)は実行時の停止・変数監視・スタックトレース等を提供、リンカとは別工程。
出典:IPA(情報処理推進機構)公式 基本情報技術者試験 平成30年度 春期 問29/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。