- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:コンパイラ、その周辺の質問)
コンパイラ、オブジェクトファイル、ライブラリについての疑問
このQ&Aのポイント
- C言語を勉強している中で、コンパイラの仕組みやオブジェクトファイル、ライブラリについて疑問があります。具体的には、プログラムをコンパイルすると機械語に翻訳されオブジェクトファイルが作られ、それがリンクされて実行ファイルが作られるという仕組みや、printf()などの関数がどのようにオブジェクトファイルと結合されるのかについてわかりません。また、自作の関数をライブラリに登録する方法も知りたいです。
- C言語の勉強中に気になる点があります。具体的には、プログラムをコンパイルするとオブジェクトファイルが作られ、それがリンクされて実行ファイルが作られるという仕組みや、printf()などの関数がどのようにオブジェクトファイルと結合されるのかについて理解できていません。また、自作の関数をライブラリに登録する方法も知りたいです。
- C言語の勉強中につまづいていることがあります。具体的には、プログラムをコンパイルするとオブジェクトファイルが作られ、それがリンクされて実行ファイルが作られるという仕組みや、printf()などの関数がどのようにオブジェクトファイルと結合されるのかについて理解が不十分です。また、自作の関数をライブラリに登録する方法も知りたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
細かい点はOSによって差がありますが、UNIX系での概略を。 コンパイル時点ではprintfなどの関数がどのアドレスに配置されるか決定されていません。つまりジャンプ先が未定のままオブジェクトファイルが作成されます。このままではリンク作業ができないので、オブジェクトファイルにはなんという名前の関数や外部変数のアドレスをどこそこに書き込めという表も格納されています。 一方、静的リンク用のライブラリは基本的にはオブジェクトモジュールを並べただけのものです。あとの検索がしやすいように関数名などからどのオブジェクトかがわかるような表を用意するのが普通ですが。 リンカはオブジェクトファイルを読み、ライブラリからprintfを含むモジュールを検索します。ライブラリ内の個々のモジュールもリンカにとってみればオブジェクトファイルなので、いってみればオブジェクトファイルがたくさん与えられたのと同じことです。 リンカはすべてのオブジェクトファイルを並べ、ここで各関数や外部変数のアドレスが決まります。この決定後、各オブジェクトファイルには先に言った表が含まれているので、それにしたがってアドレスを書き込んでいきます。 これでようやくロードモジュールの完成です。 VC++はよく知りませんが、検索したら参考URLのようなページが出てきました。参考になりますでしょうか?
お礼
返信送れてすいません。 ありがとうございました。やっとわかった気がします。