質問: スタティックリンクの手順は、 1、セクションのマージ 2、再配置 3、シンボル解決 という順番に行われると思います。 ダイナミックリンクの場合、実行時にリンクされると思いますが**コンパイルされる段階のリンクでは、何が行われているのでしょうか**? ちょっと言葉が分かりにくいんですが・・・ えーーとっ・・・つまり アセンブルが終了した後ですね。 実行ファイルを生成するとき、スタティックリンクでは、上記の3つをすべて順番に処理するはずです。 では、ダイナミックリンクの時は、リンクの段階で何をしているのでしょうか? 私が見た本では、セクションのマージだけを行っている・・・ような事が書いてあったのですが・・・ では、ダイナミックリンカローダが起動した後に、再配置とシンボル解決が行なわれているんですかね? 手順も再配置 → シンボル解決という順番になっているんですかね? 2、シンボル解決は、**外部の**ライブラリとのシンボルを解決するためのものですよね? (例えば、printf()など) 内部のシンボルは、アセンブルの段階でアドレスと紐付けているのでしょうか? その場合、シンボルテーブルには、アセンブルの段階で解決出来なかったシンボルの情報のみが乗っていることになりますよね? しかし、よく考えるとリンカの段階でアドレスを付けるんですよね? アセンブルの段階で各命令や各シンボルにアドレスを付ける作業って含まれるのでしょうか? リンカってすごいですね!!魔法のプログラムみたいですね! どなたか教えてください。 [追記] スタティックリンクの場合、オブジェクトファイルの中に含まれていたリローケーション情報、シンボルテーブルはリンク終了後に削除されるようですが、ダイナミックリンクの場合でも同じくダイナミックリンカローダーによるリンク終了後これらの情報は削除されるのでしょうか? 実行の直前ですね。
回答: わかった部分だけを書きます。 再配置 → シンボル解決でスタティックと同じようですね。 セクションのマージの方は確認出来なかったのですが、readelf -S a.out, readelf -l a.out とやるとオブジェクトファイルと実行ファイルのセクションに差が出ていました。 おそらく、アセンブリが終了次第セクションのマージからセグメントの生成が行われているものと思われます。 nmコマンドによるシンボルテーブルの確認をしました。 シンボルテーブルはスタティックリンク、ダイナミックリンク、オブジェクトファイルそれぞれ残っていました。 ダイナミックリンクされた実行ファイルやオブジェクトファイルにはシンボルテーブルが残っているのは納得いくのですが、スタティックな実行ファイルになぜシンボルテーブルが残っているんですかね? 「追記」 よーく見てみると、スタティックリンクによるシンボルテーブルはどれも外部のライブラリのシンボルでした。