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

リンカでの弱いシンボル(weak symbol)の扱いとして正しいものはどれか。

  1. A弱いシンボルは、常にほかの定義より優先される
  2. B同じ名前の通常の(強い)定義があればそちらが使われ、なければ弱い定義が使われる
  3. C弱いシンボルを含むファイルは、リンクできない
答えと解説を見る

正解:B. 同じ名前の通常の(強い)定義があればそちらが使われ、なければ弱い定義が使われる

弱いシンボルは「ほかに定義がなければこれを使う」という予備の定義です。組込みのソフトウェアでは、割り込みハンドラの既定の処理を弱いシンボルで用意しておき、利用者が同じ名前の関数を書けば、それに差し替わるようにする使い方がよく見られます。強い定義どうしが重なると多重定義のエラーになりますが、弱い定義との重なりはエラーになりません。

  • A. 逆に、強い定義に負けます。
  • B. 正しい。初期値として差し替え可能な定義を用意できます。
  • C. 普通にリンクできます。
この分野を解く 分野ページへ

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

  1. C++のコンパイラが関数名に引数の型などの情報を付け加えてシンボル名を作る「名前修飾(マングリング)」の主な目的はどれか。
  2. Linuxのdlopen関数(WindowsのLoadLibraryに相当)の使い道として最も適切なものはどれか。
  3. 100個のプロセスが同じ共有ライブラリを使っているとき、物理メモリの使い方として正しいものはどれか。
  4. オブジェクトファイルを逆アセンブルすると、外部の関数printfを呼ぶ命令の飛び先が0のように仮の値になっていた。この値はいつ正しく埋められるか。
  5. 組込み向けの開発で使うリンカスクリプトの役割として正しいものはどれか。