C標準ではは実際にはではありませんが、これがどのようにカバーで動作するかを指定しています。以下の説明は非常に一般的な実装方法です。コードを保持している単一の翻訳単位で
:
int main() { fun(); }
コンパイルされているから入手可能な情報(まだリンクされていない)オブジェクトファイルは基本的に次のとおりです。
symbol status value
------ ------ -----
main defined pointer to main within object
fun needed zero
それためですを知っています。main
は、fun
に関する情報はありませんが、後で見つける必要があります。したがって、オブジェクトファイルを読み取ると、当然、fun
の未知の値が返されます。もちろん
、あなたは、このような別の翻訳単位のように、同様fun
を定義するためにいくつかのコードが必要になります。
void fun(void) { puts("Hello, world."); }
は、以下の情報につながるこのをコンパイル:
symbol status value
------ ------ -----
fun defined pointer to fun within object
puts needed zero
これらを結びつけるのは、のリンクステージです。 オブジェクトファイル(およびCランタイムライブラリputs
などの他の依存関係のオブジェクト/ライブラリファイル)も一緒にバインドし、未定義シンボルを使用するすべてのコードを調整します。
これで、すべてのシンボルがわかっており、すべての参照が解決された実行可能ファイル形式になります。
オブジェクトファイルで 'readelf'を呼び出していますか?シンボル 'fun'がリンカによってまだ解決されていないときは? –
はい私はオブジェクトファイル上のreadelfを呼び出しましたオブジェクトファイルはリンカによって作成されていません..Linkerはそのオブジェクトファイルをリンクするだけですので上記のコードのオブジェクトファイルを作成でき、私の質問に示されているようにreadelfの結果を得ます – Akshay
オブジェクトファイルはありませんそれらは基本的に単一の[*翻訳単位*](https://en.wikipedia.org/wiki/Translation_unit_(プログラミング))を表します。他の場所で定義されたシンボルは解決できません。そのため、そのような関数の値はゼロです。 –