回答編集履歴

1

リンクの例を追加

2017/06/19 13:03

投稿

mit0223
mit0223

スコア3401

test CHANGED
@@ -15,3 +15,77 @@
15
15
 
16
16
 
17
17
  内部シンボルに関してはコンパイラが名前解決を行うので、オブジェクトになった段階で名前解決は必要ありません。アドレスがリンク時に決定するようなものであれば、リロケーション情報からリンカがアドレスを埋めます。これがいわゆる再配置処理です。
18
+
19
+
20
+
21
+ 例を示します。
22
+
23
+ ```C
24
+
25
+ #include <stdio.h>
26
+
27
+ extern int i;
28
+
29
+ extern b();
30
+
31
+ static x = 3;
32
+
33
+
34
+
35
+ int main(){
36
+
37
+ b(); /* リンク時解決 */
38
+
39
+ i = i + x; /* iはリンク時解決、 x はコンパイル時解決 */
40
+
41
+ printf("i=%d\n", i); /* printf は実行時解決 */
42
+
43
+ }
44
+
45
+ ```
46
+
47
+ ```C
48
+
49
+ int i = 10;
50
+
51
+
52
+
53
+ void b() {
54
+
55
+ i= i+4;
56
+
57
+ }
58
+
59
+ ```
60
+
61
+
62
+
63
+ こういう2つのプログラムをコンパイルしてリンクすると、
64
+
65
+ リンカは i と b のシンボルを解決し、 printf がダイナミックリンクできるように
66
+
67
+ シンボルテーブルや PLT など(以前の質問・回答で議論したもの)を生成します。
68
+
69
+ xはコンパイル時(アセンブラで)解決されるので、リンカの仕事にはなりません。
70
+
71
+
72
+
73
+ 上記プログラムが a.c, b.c である場合、以下のようにしてコンパイル・リンクできます。
74
+
75
+ ```
76
+
77
+ cc -c a.c
78
+
79
+ cc -c b.c
80
+
81
+ cc a.o b.o
82
+
83
+ ```
84
+
85
+ 最後の行がリンカの呼び出しですが、printf はデフォルトでシェアードオブジェクトで
86
+
87
+ 提供されているため、ダイナミックリンクになります。
88
+
89
+ つまり、a.o と b.o はスタティックにリンクされますが、 printf は実行時にダイナミックに
90
+
91
+ リンクされます。私がダイナミックリンク用のリンクと呼んだのはこのような場合です。