æ¡å¤ã static link ã£ã¦ããã£ã¦ãªãããã§ããã¨ããããªã³ã«ã£ã¦ããã£ã¦ãªãããã§ããããã¦æ¡å¤ã¯ã¾ããã®ã§ãã以ä¸ã®ã¯ã¤ãºã«çããããã§ããããã
ã¯ã¤ãº1
$ nm main.o # int main() {} 0000000000000000 T main $ nm foo.a # void foo() { bar(); } void baz() {} foo.o: U bar 0000000000000010 T baz 0000000000000000 T foo $ nm bar.a # void bar() {} void baz() {} bar.o: 0000000000000000 T bar 0000000000000006 T baz $ gcc main.o foo.a bar.a
æå¾ã®ã³ãã³ãã§ãä½ãèµ·ãã¾ããï¼
- æ®éã«ãªã³ã¯ã§ãã
- undefined reference to `foo'
- undefined reference to `bar'
- multiple definition of `baz'
ã¯ã¤ãº2
$ nm main.o # int main() { foo(); } U foo 0000000000000000 T main $ gcc main.o foo.a bar.a
ã¯ã¤ãº1ã¨ã®éã㯠main.o ã ãã§ããæå¾ã®ã³ãã³ãã§ãä½ãèµ·ãã¾ããï¼
- æ®éã«ãªã³ã¯ã§ãã
- undefined reference to `foo'
- undefined reference to `bar'
- multiple definition of `baz'
ã¯ã¤ãº3
$ nm main.o # int main() { bar(); } U bar 0000000000000000 T main $ gcc main.o foo.a bar.a
ã¯ã¤ãº1,2ã¨ã®éã㯠main.o ã ãã§ããæå¾ã®ã³ãã³ãã§ãä½ãèµ·ãã¾ããï¼
- æ®éã«ãªã³ã¯ã§ãã
- undefined reference to `foo'
- undefined reference to `bar'
- multiple definition of `baz'
ã¯ã¤ãº4
$ nm main.o # int main() { bar(); } U bar 0000000000000000 T main $ nm foo.a # void foo() { bar(); } foo.o: U bar 0000000000000000 T foo $ nm bar.a # void bar() { foo(); } bar.o: 0000000000000000 T bar U foo $ gcc main.o foo.a bar.a
æå¾ã®ã³ãã³ãã§ãä½ãèµ·ãã¾ããï¼
- æ®éã«ãªã³ã¯ã§ãã
- undefined reference to `foo'
- undefined reference to `bar'
- multiple definition of `baz'
ã¯ã¤ãº5
$ nm main.o # int main() { foo(); } U foo 0000000000000000 T main $ gcc main.o foo.a bar.a
ã¯ã¤ãº4ã¨ã®éã㯠main.o ã ãã§ããæå¾ã®ã³ãã³ãã§ãä½ãèµ·ãã¾ããï¼
- æ®éã«ãªã³ã¯ã§ãã
- undefined reference to `foo'
- undefined reference to `bar'
- multiple definition of `baz'
ã¯ã¤ãº6-10 (飽ããã®ã§éãªåºé¡)
ã¯ã¤ãº1-5ã®ããããã®ã±ã¼ã¹ã«ã¤ãã¦ã
$ gcc main.o foo.o bar.o
ã¨ã㦠foo.a 㨠bar.a ã®ãããã« foo.o 㨠bar.o ããªã³ã¯ããå ´åãä½ãèµ·ãã¾ããï¼
ãã¾ã
ã¯ã¤ãº1-5ã«ã¤ãã¦ã
$ gcc foo.a main.o bar.a
ã
$ gcc foo.a bar.a main.o
ã«ããå ´åãããããæåãå¤ããã¾ããããªãã§ãããã 1-10 ã«æ£è§£ã§ãã人ã¯ãããæ£è§£ã§ããã¨æãããã®ã§ãã¾ãã¯ã¤ãºã«ããæå³ã¯ç¡ãæããªã®ã§ããã¾ãã§ãã
解ç
ãªã³ã«ã® .a ã .o ã«å¯¾ãã¦ã®æåã«ã¤ãã¦ç¥ã£ã¦ããã°ãã©ã¯ã«å ¨åæ£è§£ã§ããã¨æãã¾ããå ¨åæ£è§£ã§ããªããã°ãããã¤ãã£ã¦ã¦ãããã¾ã大差ç¡ãããã£ã¦ãªããã¨ããæãããã¾ãã
æ£è§£ã¯â¦
- ã¯ã¤ãº1: æ®éã«ãªã³ã¯ã§ãã
- ã¯ã¤ãº2: multiple definition of `baz'
- ã¯ã¤ãº3: æ®éã«ãªã³ã¯ã§ãã
- ã¯ã¤ãº4: undefined reference to `foo'
- ã¯ã¤ãº5: æ®éã«ãªã³ã¯ã§ãã
- ã¯ã¤ãº6: multiple definition of `baz'
- ã¯ã¤ãº7: multiple definition of `baz'
- ã¯ã¤ãº8: multiple definition of `baz'
- ã¯ã¤ãº9: æ®éã«ãªã³ã¯ã§ãã
- ã¯ã¤ãº10: æ®éã«ãªã³ã¯ã§ãã
ã§ããããã¼ä½æ ãåãããªæä½ã§æ¸ãã¦ããããããããã®ééã£ã¦ãã¨æ¥ãããããã確èªããâ¦
説æ
ã¾ãããªã³ã«ã®ã³ãã³ãã©ã¤ã³ã¯åºæ¬çã«å·¦ããå³ã«çºãã¦ããã¾ãã .o ãã¡ã¤ã«ãããã¨ããã®ä¸ã«ããå ¨ã¦ã®ã·ã³ãã«ããªã³ã¯ãã¾ããã¯ã¤ãº6-8ã¯ãã®çç±ã§åã« baz ã2ååºç¾ãã¦ãã¾ã£ã¦ãã¦ãã¯ã¤ãº9-10ã¯å¾ªç°åç §ããããã©ä¸¡æ¹ã¡ããã¨å®ç¾©ãã¦ãããã大ä¸å¤«ãã¨ãããã¨ã«ãªãã¾ãã
.a ã¯ç¥ããªã人ã«ã¯ããæå¤æ§ã®ããæåã示ãã¾ãã .o ãçºããæãæªå®ç¾©ã ã£ãã·ã³ãã«ã®ä¸è¦§ããªã³ã«ã¯è¦ãã¦ãã¾ãã .a ã«åºãããã¨ããã®ä¸ã®å .o ãçºãã¦ã¿ã¦ãæªå®ç¾©ã ã£ãã·ã³ãã«ã®å ¥ã£ã¦ã .o ãå ¨ã¦ãªã³ã¯ãã¾ãããã®éã .o ã«ã¤ãã§ã«å ¥ã£ã¦ããã使ç¨ããã¦ãªãã·ã³ãã«ãªããããªã³ã¯ããã¾ãã
ã¯ã¤ãº1ã§ã¯ã main.o ãè¦ã¦æªå®ç¾©ã·ã³ãã«ãç¡ãã®ã§ã foo.a 㨠bar.a ããã¯ä½ããªã³ã¯ãããã main ã ãã®ãã¤ããªãã§ãã¾ãã
ã¯ã¤ãº2ã§ã¯ã main.o ãè¦ã¦ foo ãæªå®ç¾©ãªã®ã§ã foo.o ããªã³ã¯ãã¾ãããã㨠bar ãæªå®ç¾©ãªã®ã§ã bar.o ããªã³ã¯ãã¾ãããã㦠baz ãå¤éå®ç¾©ã«ãªãã¾ãã
ã¯ã¤ãº3ã§ã¯ã main.o ãè¦ã¦ bar ãæªå®ç¾©ãªã®ã§ã bar.o ããªã³ã¯ãã¾ãã foo.a ã¯ã¹ã«ã¼ãããã®ã§ã main, bar, baz ãå®ç¾©ããããã¤ããªã«ãªãã¾ãã
ã¯ã¤ãº4,5 ã¯å¾ªç°åç §ã§ãã 4 ã®æ¹ã¯ main.o 㨠bar.o ã ããåã£ã¦ãã¦ãã¾ã£ã¦ foo ãæªå®ç¾©ã¨ãªãã 5 ã§ã¯ main.o => foo.o => bar.o ã¨èèå¼ã«åã£ã¦ããå¿ è¦ãã§ãã¦ãç¡äºãªã³ã¯ã§ãã¾ãã
循ç°åç §ã解決ããæ
æ®éãã¯ã¤ãº1-3ã®ãããªã±ã¼ã¹ã§æ©ããã¨ã¯ãã¾ãå¤ãã¯ãªãã¦ã4-5ã®ãããªå¾ªç°åç §ã§æ©ããã¨ãå¤ãã®ã§ã¯ãªããã¨æãã¾ããããã解決ããæ¹æ³ã¯ããã¤ãããã¾ããã¯ã¤ãº4ã®ã±ã¼ã¹ãä¾ã«ä½¿ãã¾ãã
$ nm main.o # int main() { bar(); } U bar 0000000000000000 T main $ nm foo.a # void foo() { bar(); } foo.o: U bar 0000000000000000 T foo $ nm bar.a # void bar() { foo(); } bar.o: 0000000000000000 T bar U foo $ gcc main.o foo.a bar.a bar.a(bar.o): In function `bar': bar.c:(.text+0xa): undefined reference to `foo' collect2: error: ld returned 1 exit status
ç´ äººãããæ¹æ³
ã¾ãããã使ããã¦ããã§ãããã undefined reference ãåºãªããªãã¾ã§ã²ããã .a ã足ãã¦ããã¨ããæã
$ gcc main.o foo.a bar.a foo.a
å人ããã¸ã§ã¯ãã¨ãã§ã¯å¥ã«ããã¨æãã¾ããããããããã§ãããããç¨åº¦å¤§ããè¦æ¨¡ã®éçºã§ã¯ãã®æ¹æ³ã§ã¯ã¹ã±ã¼ã«ããªããã§ãªããã¨æãã¾ãã
-u
ã·ã³ãã« foo ã¯æªå®ç¾©ãªãã ããã¨æ示çã«æãã¦ããæ¹æ³ããªã³ã«ãªãã·ã§ã³ -u ã§ãªã³ã«ã«æªå®ç¾©ãªã·ã³ãã«ãæãã¦ãããã¨ãã§ãã¾ãã -Wl ã使ã㨠gcc ã¯ãªã³ã«ã«ãªãã·ã§ã³ãä¼ãã¦ããã¾ãã
$ gcc main.o -Wl,-ufoo foo.a bar.a
foo.a 㨠bar.a ãã»ããã§ã©ã¤ãã©ãªã¨ãã¦æä¾ãã¦ãå ´åã§ãæ確ã«æ¾ãããã·ã³ãã«ãããã£ã¦ãå ´åã¯ããã®æ¹æ³ãä¸çªãªã³ã¯ã«ãããæéã¨ããå°ãªãã¦è¯ãã¨æããã¾ããä¾ãã° SDL_main ã®ãããªãã©ã¤ãã©ãªã¨ãã§ç¡ãå ´åã¯ã·ã³ãã«ã®ä¸è¦§ã管çããã®ãããã©ãããã¨æããã¾ãã
--start-group
æåã«æ¸ãããããªãã²ããã .a ã足ãã¦ãããã¨ããã®ãèªåçã«ãã£ã¦ããããªãã·ã§ã³ãããã¾ãã --start-group 㨠--end-group ãããã
$ gcc main.o -Wl,--start-group foo.a bar.a -Wl,--end-group
ã¨ããã¨ãæªå®ç¾©ã·ã³ãã«ããªããªãã¾ã§ã foo.a 㨠bar.a ã循ç°ãã¦ããã¾ããæã¯æ¿«ç¨ããã¨é ãã£ãããã§ãããä»ã§ã¯ãã¾ãæ°ã«ãªããªãã®ã§ã¯ãªãããªâ¦ã¨æãã¾ãã
--whole-archive
å°ãæ¯è²ãéããã®ã§ããããã® .a 㯠.o ã¿ãããªæãã§å ¨é¨ã·ã³ãã«æ¾ã£ã¦ãã¦ããããã¨æ示ãããªãã·ã§ã³ãããã¾ãã
$ gcc main.o -Wl,--whole-archive foo.a bar.a -Wl,--no-whole-archive
ãã ããã¾ããã®ç¨éã§ä½¿ããã¨ã¯ç¡ãã¨æãã¾ãã
ããããã®ã¯ã shared object ãä½ãæã«ä½¿ãã±ã¼ã¹ã§ã¯ãªããã¨æãã¾ãããã£ãã® foo.a ãã foo.so ãä½ããã¨ãèãã¾ãã
$ gcc foo.a -shared -o foo.so $ nm -D foo.so w _ITM_deregisterTMCloneTable w _ITM_registerTMCloneTable w _Jv_RegisterClasses 0000000000200830 B __bss_start w __cxa_finalize w __gmon_start__ 0000000000200830 D _edata 0000000000200838 B _end 00000000000005e8 T _fini 00000000000004a8 T _init
大å¤ã§ãã foo ãå ¥ã£ã¦ã¾ãããããã¯åºæ¬ã«ã¼ã«ãæãåºãã¨ç°¡åã§ã foo.a ãçºããæã«ãç¹ã«æªå®ç¾©ãªã·ã³ãã«ãç¡ãã®ã§ foo.a ãã¹ã«ã¼ãããã¨ããã ãã®è©±ã§ãã
ããããããã® .a ã«å ¥ã£ã¦ãã·ã³ãã«å ¨é¨å ¥ã£ã¦ã .so ä½ã£ã¦ããã¼ã¨ããæã« --whole-archive ã¯ä¾¿å©ã§ã
$ gcc -Wl,--whole-archive foo.a -Wl,--no-whole-archive -shared -o foo.so $ nm -D foo.so | grep foo 0000000000000685 T foo
ãªã©ã¨ãç¡äºå ¥ã£ã¦ã¾ããã
shared object
ã¯ã¾ãå²ã¨ã¿ããªãæ³åãããããªæåãããã¨ãããããªã³ã«ã®æ®µéã§ã¯é£ãããªãã¦ããã¼ãã®å´ã§ããé£ããæãã§ããã
libc.a
libc.a ã«å ¥ã£ã¦ã .o ãã1é¢æ°ã«ã¤ãã²ã¨ã¤ããã¿ãããªç¶æ ãªã®ã¯ã static link ããæã®ãã¤ããªãµã¤ãºãæå°ã«ãããããã¨ãããããªãã¨ãäºæ³ã§ãã¾ããâ¦