質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

Q&A

解決済

2回答

8580閲覧

シンボル解決とは何のことですか?

strike1217

総合スコア651

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

0グッド

1クリップ

投稿2016/09/17 11:27

たぶんリンカの役割であると思うのですが、シンボル解決とは何でしょうか??
何をしているのですか??

以下のurlを見てもよくわかりません。
http://qiita.com/saikoro-steak/items/e5089a2b33b52d5410bd

「関数名や変数名をどのようにアドレスに配置していくか」ということかなぁ・・・と思ったのですが・・

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

プログラムがある特定の関数を呼び出したり、特定の変数の値を参照したりする時には、その対象の関数だったり変数だったりのコンピューター上のメモリアドレスがどこにあるのか、を知っている必要があります。
どこにいるのかわからない奴を呼びつけたり、どこにあるのか分からない箱に何か入れたりは出来ませんので。
で、プログラムというのは通常、複数の.cだったり.cppだったりのファイルで構成される訳ですが、ある.cファイルから別の.cファイルに書かれている関数を呼びたい場合には、その呼び出し側の.cファイルでも、対象の関数のある.cファイルの、その関数がどこのアドレスにあるのかを知る必要があります。
ところで.c等をコンパイルする際には通常、1ファイルずつコンパイルされる為、ある.cファイルが別の.cファイルの関数のアドレスをコンパイル時点で知る方法はありません。
そこで、コンパイル時には呼びたい関数なり呼びたい変数なりの「名前」を記録しておきます。これをシンボルと呼びます。
そして全ての.cファイルのコンパイルが終った後、呼びたい関数などが実際にメモリ上のどこに配置されるのかが決定され、それからその関数を呼びたがっていたプログラムに、この関数はアドレスどこですよ、この変数はアドレスどこですよ、と教えてあげるわけです。
これがシンボル解決です。
だらだらと書いてしまいましたがわかったでしょうか?

投稿2016/09/17 11:42

drednote

総合スコア336

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/09/18 01:15

わかりました。 とてもわかりやすいです。 ありがとうございます。
guest

0

drednote さんの回答に補足ですが、「その関数を呼びたがっていたプログラムに、この関数はアドレスどこですよ、この変数はアドレスどこですよ、と教えてあげるわけです。 」のところは、具体的には、マシン語命令のオペランドに具体的な数値を書き込む処理になります。

ソースコード→(コンパイラ)→オブジェクトファイル→(リンカ)→実行可能ファイル

という手順を踏むわけですが、オブジェクトファイルの段階では命令列は生成されていますが、そのオペランド(
ex. jump 命令が参照する飛び先アドレス)については、まだ決定できないもの(オブジェクトファイルに定義が含まれていない関数など)が含まれているわけです。リンクして、オブジェクトファイルの配置(実行可能ファイルが実行される際の各命令が配置される論理アドレスの値)わかった段階で、命令列のオペランド部分に具体的なメモリ上のアドレスが書き込まれるわけです。
ただし、以上はスタティックリンク部分の話しで、ダイナミックリンクに関しては、また別のロジック(ダイナミックリンカ)が動作します。

投稿2016/09/17 13:49

mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/09/18 01:17

ダイナミックリンカというものがあるのですか! ありがとうございます。 お詳しいですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問