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

C++のコンパイラが関数名に引数の型などの情報を付け加えてシンボル名を作る「名前修飾(マングリング)」の主な目的はどれか。

  1. A関数名を読めなくして、プログラムを盗まれないようにする
  2. B関数名を短くして、実行ファイルを小さくする
  3. C同じ名前で引数の型が違う関数(オーバーロード)や名前空間を、リンカが区別できるようにする
答えと解説を見る

正解:C. 同じ名前で引数の型が違う関数(オーバーロード)や名前空間を、リンカが区別できるようにする

リンカはシンボルを名前の文字列だけで照合します。C++では「print(int)」と「print(double)」のように同じ名前の関数を作れるので、そのままでは区別できません。そこでコンパイラは「_Z5printi」のように引数の型などを名前に埋め込みます。C言語の関数は修飾されないので、C++からCの関数を呼ぶときは「extern "C"」を付けて修飾をやめさせます。

  • A. 保護のためのものではありません。
  • B. むしろ名前は長くなります。
  • C. 正しい。リンカは名前だけで照合するからです。
この分野を解く 分野ページへ

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

  1. Linuxのdlopen関数(WindowsのLoadLibraryに相当)の使い道として最も適切なものはどれか。
  2. 100個のプロセスが同じ共有ライブラリを使っているとき、物理メモリの使い方として正しいものはどれか。
  3. オブジェクトファイルを逆アセンブルすると、外部の関数printfを呼ぶ命令の飛び先が0のように仮の値になっていた。この値はいつ正しく埋められるか。
  4. 組込み向けの開発で使うリンカスクリプトの役割として正しいものはどれか。
  5. OSのないマイコンで、電源を入れた直後に起動コードがmainを呼ぶ前に行う処理として正しいものはどれか。