David Drysdale ã
ãªã³ã«ãŒã®åå¿è
åãã¬ã€ã ïŒ
http://www.lurklurk.org/linkers/linkers.html ïŒã
ãã®èšäºã®ç®çã¯ãCããã³C ++ããã°ã©ããŒããªã³ã«ã®æ¬è³ªãçè§£ã§ããããã«ããããšã§ãã é廿°å¹Žã«ããã£ãŠãç§ã¯ãããå€ãã®ååã«èª¬æããæçµçã«ãã®è³æãçŽã«ç§»ããããã¢ã¯ã»ã¹ããããããããšã«ããŸããïŒãããã£ãŠãå床説æããå¿
èŠã¯ãããŸããã§ããïŒã [2009幎3æã®æŽæ°ïŒWindowsã®ã¬ã€ã¢ãŠãæ©èœã«é¢ããè¿œå æ
å ±ãšããã詳现ãª1å®çŸ©ã«ãŒã«ã远å ãããŸããã
ç§ãå©ããæ±ããããå
žåçãªäŸã¯ã次ã®ã¬ã€ã¢ãŠããšã©ãŒã§ãã
g++ -o test1 test1a.o test1b.o test1a.o(.text+0x18): In function `main': : undefined reference to `findmax(int, int)' collect2: ld returned 1 exit status
ããªãã®åå¿ããããããexternâ Câãå¿ããããªãããã®èšäºã§äžããããŠãããã¹ãŠãç¥ã£ãŠããã§ãããã
å
容
å®çŸ©ïŒCãã¡ã€ã«ã«ã¯äœãå«ãŸããŠããŸããïŒ
ãã®ç« ã§ã¯ãCãã¡ã€ã«ã®ããŸããŸãªã³ã³ããŒãã³ãã«ã€ããŠç°¡åã«èª¬æããŸãã
以äžã®
ãªã¹ãã®ãã¹ãŠãçã«ããªã£ãŠããå Žåã¯ããã®ç« ãã¹ãããããŠ
次ã®ç« ã«é²ãã§ãã ããã
ãŸãã宣èšãšå®çŸ©ã®éããçè§£ããå¿
èŠããããŸãã
å®çŸ©ã¯ ãååãå®è£
ã«é¢é£ä»ã
ãŸããå®è£
ã¯ãã³ãŒããŸãã¯ããŒã¿ã®ããããã§ãã
- 倿°ã®å®çŸ©ã«ãããã³ã³ãã€ã©ã¯ã¡ã¢ãªã®ç¹å®ã®é åãäºçŽããå Žåã«ãã£ãŠã¯ç¹å®ã®ç¹å®ã®å€ã«èšå®ããŸãã
- 颿°å®çŸ©ã«ãããã³ã³ãã€ã©ã¯ãã®é¢æ°ã®ã³ãŒããçæããŸã
ãã®å®£èšã¯ã颿°ãŸãã¯å€æ°ã®å®çŸ©ïŒç¹å®ã®ååãæã€ïŒãããã°ã©ã å
ã®å¥ã®å Žæãããããå¥ã®Cãã¡ã€ã«ã«ååšããããšãã³ã³ãã€ã©ãŒã«äŒããŸãã ïŒå®çŸ©ã¯ã¢ããŠã³ã¹ã§ãããããšã«æ³šæããŠãã ãã-å®éãããã¯ããã°ã©ã ã®ä»ã®å ŽæãçŸåšã®ãã®ãšäžèŽããã¢ããŠã³ã¹ã§ãïŒã
倿°ã«ã¯2çš®é¡ã®å®çŸ©ããããŸãã
- ããã°ã©ã ã®ã©ã€ããµã€ã¯ã«å
šäœã«ããã£ãŠååšãïŒãéçå²ãåœãŠãïŒãããŸããŸãªæ©èœã§äœ¿çšå¯èœãªã°ããŒãã«å€æ° ã
- ããã€ãã®å®è¡å¯èœé¢æ°ïŒãããŒã«ã«ãã±ãŒã·ã§ã³ãïŒã®å¶éå
ã«ã®ã¿ååšãããã®é¢æ°èªäœå
ã§ã®ã¿ã¢ã¯ã»ã¹å¯èœãªããŒã«ã«å€æ° ã
ããã«ãã䜿çšå¯èœããšããçšèªã¯ããå®çŸ©æã«å€æ°ã«é¢é£ä»ããããååã§åç
§ã§ããããšçè§£ããå¿
èŠããããŸãã
åããŠã§ã¯æããã§ã¯ãªãç¹å¥ãªã±ãŒã¹ãããã€ããããŸãã
- éçããŒã«ã«å€æ°ã¯ãåã颿°å
ã§ã®ã¿è¡šç€ºãããå Žåã§ããããã°ã©ã ã®åç¶æéäžã«ååšãããããå®éã«ã¯ã°ããŒãã«ã§ãã
- éçã°ããŒãã«å€æ°ãã°ããŒãã«ã§ãããå¯äžã®éãã¯ã倿°ãå®çŸ©ãããŠããåããã¡ã€ã«å
ã§ã®ã¿äœ¿çšã§ããããšã§ãã
颿°ãéçãšããŠå®çŸ©ããããšã«ããããã®é¢æ°ã«ååã§ã¢ã¯ã»ã¹ã§ããå Žæã®æ°ãåçŽã«æžãããšã«æ³šæããŠãã ããã
ã°ããŒãã«å€æ°ãšããŒã«ã«å€æ°ã§ã¯ãåæåããã倿°ãšåæåãããŠããªã倿°ãåºå¥ã§ããŸãã ã¡ã¢ãªå
ã®å€æ°çšã«äºçŽãããã¹ããŒã¹ãç¹å®ã®å€ã§æºãããããã©ããã
æåŸã«ã
malloc
ãŸãã¯
new
ã䜿çšããŠåçã«å²ãåœãŠãããæ
å ±ãã¡ã¢ãªã«ä¿åã§ããŸãã ãã®å Žåãå²ãåœãŠãããã¡ã¢ãªã«ååã§ã¢ã¯ã»ã¹ããããšã¯ã§ããªãããããã€ã³ã¿-ååã®ãªãã¡ã¢ãªé åã®ã¢ãã¬ã¹ãå«ãååä»ã倿°ã䜿çšããå¿
èŠããããŸãã ãã®ã¡ã¢ãªé åã¯ã
free
ãŸãã¯
delete
ã䜿çšããŠè§£æŸããããšãã§ããŸãã ãã®å Žåããåçå²ãåœãŠããæ±ã£ãŠããŸãã
èŠçŽãããšïŒ
| ã³ãŒã | ããŒã¿ |
| | ã°ããŒãã« | ããŒã«ã« | ãã€ããã㯠|
| | ã€ãã·ã¢ ãªã·ã ãã¹ã«ãŒã | ééå§ ãªã·ã ãã¹ã«ãŒã | ã€ãã·ã¢ ãªã·ã ãã¹ã«ãŒã | ééå§ ãªã·ã ãã¹ã«ãŒã | |
çºè¡š æ laz | int fn(int x); | extern int x; | extern int x; | N / a | N / a | N / a |
å®çŸ©ãã æ laz | int fn(int x) { ... } | int x = 1; ïŒã¹ã³ãŒã -ãã¡ã€ã«ïŒ | int x; ïŒã¹ã³ãŒã-ãã¡ã€ã«ïŒ | int x = 1; ïŒã¹ã³ãŒã-æ©èœïŒ | int x; ïŒã¹ã³ãŒã-æ©èœïŒ | int* p = malloc(sizeof(int)); |
ããããæãç°¡åãªåŠç¿æ¹æ³ã¯ããµã³ãã«ããã°ã©ã ãèŠãã ãã§ãã
int x_global_uninit; int x_global_init = 1; static int y_global_uninit; static int y_global_init = 2; extern int z_global; int fn_a(int x, int y); static int fn_b(int x) { return x+1; } int fn_c(int x_local) { int y_local_uninit; int y_local_init = 3; x_global_uninit = fn_a(x_local, x_global_init); y_local_uninit = fn_a(x_local, y_local_init); y_local_uninit += fn_b(z_global); return (x_global_uninit + y_local_uninit); }
Cã³ã³ãã€ã©ãè¡ãããš
Cã³ã³ãã€ã©ã®ä»äºã¯ãããã¹ãïŒéåžžïŒã人éãèªãã圢åŒã«å€æããŠãã³ã³ãã¥ãŒã¿ãŒãçè§£ã§ãããã®ã«ããããšã§ãã åºåã§ãã³ã³ãã€ã©ã¯
ãªããžã§ã¯ããã¡ã€ã«ãçæã
ãŸã ã UNIXãã©ãããã©ãŒã ã§ã¯ããããã®ãã¡ã€ã«ã«ã¯éåžžãæ¥å°ŸèŸ.oãä»ããŠããŸãã Windowsã§ã¯ãæ¥å°ŸèŸ.objã ãªããžã§ã¯ããã¡ã€ã«ã®å
容ã¯ãæ¬è³ªçã«2ã€ã®ãã®ã§ãã
- Cãã¡ã€ã«ã®é¢æ°å®çŸ©ã«å¯Ÿå¿ãã ã³ãŒã
- Cãã¡ã€ã«ã®ã°ããŒãã«å€æ°ã®å®çŸ©ã«å¯Ÿå¿ããããŒã¿ ïŒåæåãããã°ããŒãã«å€æ°ã®å Žåã倿°ã®åæå€ããªããžã§ã¯ããã¡ã€ã«ã«ä¿åããå¿
èŠããããŸãïŒã
ãã®å Žåãã³ãŒããšããŒã¿ã«ã¯ååãé¢é£ä»ããããŸããå®çŸ©ã«é¢é£ä»ããããŠãã颿°ãŸãã¯å€æ°ã®ååã§ãã
ãªããžã§ã¯ãã³ãŒãã¯ãããã°ã©ããŒã«ãã£ãŠæžãããCåœä»€ã«å¯Ÿå¿ããïŒé©åã«æ§æãããïŒæ©æ¢°åœä»€ã®ã·ãŒã±ã³ã¹ã§ãããããã¯ãã¹ãŠ
if
ãš
while
ããã³
goto
ãããã§ãã ãããã®åªæã¯ç¹å®ã®çš®é¡ã®æ
å ±ãæäœããå¿
èŠããããæ
å ±ã¯ã©ããã«ããå¿
èŠããããŸã-ãã®ããã«ã¯å€æ°ãå¿
èŠã§ãã ã³ãŒãã¯ä»ã®ã³ãŒãïŒç¹ã«ãããã°ã©ã å
ã®ä»ã®C颿°ïŒãåç
§ããå ŽåããããŸãã
ã³ãŒãã倿°ãŸãã¯é¢æ°ãåç
§ããå Žåã¯ãã€ã§ããã³ã³ãã€ã©
㯠ã以åã«ãã®å€æ°ãŸãã¯é¢æ°ã®
宣èšãèŠãå Žåã«ã®ã¿ãããèš±å¯ããŸãã ã¢ããŠã³ã¹ã¯ãå®çŸ©ãããã°ã©ã ã®ä»ã®å Žæã«ååšãããšããçŽæã§ãã
ãªã³ã«ã®ä»äºã¯ãããã®çŽæãæ€èšŒããããšã§ãã ããããã³ã³ãã€ã©ã¯ãªããžã§ã¯ããã¡ã€ã«ãçæãããšãã«ãããã®ãã¹ãŠã®çŽæãã©ãããŸããïŒ
åºæ¬çã«ãã³ã³ãã€ã©ã¯ç©ºã®ã¹ããŒã¹ãæ®ããŸãã 空ã®å ŽæïŒãªã³ã¯ïŒã«ã¯ååããããŸããããã®ååã«å¯Ÿå¿ããå€ã¯ãŸã ããã£ãŠããŸããã
ããã«ããã
äžèšã®
ããã°ã©ã ã«å¯Ÿå¿ãããªããžã§ã¯ããã¡ã€ã«ã次ã®ããã«è¡šç€ºã§ããŸãã

ãªããžã§ã¯ããã¡ã€ã«ã®è§£æ
ãããŸã§ã®ãšããããã¹ãŠãé«ãã¬ãã«ã§æ€èšããŠããŸããã ãã ãããããå®éã«ã©ã®ããã«æ©èœããããèŠããšäŸ¿å©ã§ãã äž»ãªããŒã«ã¯
nm
ã³ãã³ãã§ãUNIXãã©ãããã©ãŒã äžã®ãªããžã§ã¯ããã¡ã€ã«ã®ã·ã³ãã«ã«é¢ããæ
å ±ãæäŸããŸãã Windowsã®å Žåã
/symbols
ãªãã·ã§ã³ãæå®ãã
dumpbin
ã³ãã³ãã¯ã»ãŒåçã§ãã
nm.exe
ãå«ã
Windowsçšã«ç§»æ€ããã GNU binutilsããŒã«ããããŸãã
äžèšã®äŸããååŸãããªããžã§ã¯ããã¡ã€ã«ã«å¯ŸããŠ
nm
çæãããã®ãèŠãŠã¿ãŸãããã
Symbols from c_parts.o: Name Value Class Type Size Line Section fn_a | | U | NOTYPE| | |*UND* z_global | | U | NOTYPE| | |*UND* fn_b |00000000| t | FUNC|00000009| |.text x_global_init |00000000| D | OBJECT|00000004| |.data y_global_uninit |00000000| b | OBJECT|00000004| |.bss x_global_uninit |00000004| C | OBJECT|00000004| |*COM* y_global_init |00000004| d | OBJECT|00000004| |.data fn_c |00000009| T | FUNC|00000055| |.text
çµæã¯ãã©ãããã©ãŒã ã«ãã£ãŠå€å°ç°ãªãããã«èŠããå ŽåããããŸãïŒé¢é£æ
å ±ã«ã€ããŠã¯
man
åãåãããŠãã ããïŒããéèŠãªæ
å ±ã¯åæåã®ã¯ã©ã¹ãšãã®ãµã€ãºïŒååšããå ŽåïŒã§ãã ã¯ã©ã¹ã«ã¯ããŸããŸãªæå³ããããŸãã
- ã¯ã©ã¹Uã¯ãåè¿°ã®ã空ã®ã¹ããŒã¹ããšåããããŸããªåç
§ã瀺ããŸãã ãã®ã¯ã©ã¹ã«ã¯ã
fn_a
ãšz_global
2ã€ã®ãªããžã§ã¯ãããããŸãã ïŒ nm
ããŒãžã§ã³ã«ãã£ãŠã¯ããã®å Žå*UND*
ãŸãã¯UNDEF
ã«ãªãã»ã¯ã·ã§ã³ãåºåãããå ŽåããããŸããïŒ - ã¯ã©ã¹tããã³Tã¯ãå®çŸ©ãããŠããã³ãŒãã瀺ããŸãã tãšTã®éãã¯ã颿°ããã¡ã€ã«å
ã§ããŒã«ã«ïŒ t ïŒãããã§ãªããïŒ T ïŒãã€ãŸã 颿°ã
static
ãšããŠå®£èšããããã©ããã ç¹°ãè¿ããŸãããäžéšã®ã·ã¹ãã ã§ã¯ã .text
ãªã©ã®ã»ã¯ã·ã§ã³ã衚瀺ãããå ŽåããããŸãã
- ã¯ã©ã¹dããã³Dã«ã¯ãåæåãããã°ããŒãã«å€æ°ãå«ãŸããŸãã ããã«ãéç倿°ã¯ã¯ã©ã¹dã«å±ããŸãã ã»ã¯ã·ã§ã³æ
å ±ãååšããå Žåãããã¯.dataã«ãªããŸãã
- åæåãããŠããªãã°ããŒãã«å€æ°ã«ã€ããŠã¯ãéçãªå Žåã¯bã ãããã§ãªãå Žåã¯BãŸãã¯CãååŸããŸãã ãã®å Žåã®ã»ã¯ã·ã§ã³ã¯ããããã.bssãŸãã¯* COM *ã§ãã
ãœãŒã¹Cã³ãŒãã®äžéšã§ã¯ãªãæåã衚瀺ã§ããŸãã éåžžã¯ã³ã³ãã€ã©ã®å
éšã¡ã«ããºã ã®äžéšã§ãããããããã«æ³šæãéäžããããšã¯ãããŸããããããã£ãŠãããã°ã©ã ã¯åŸã§ã³ã³ãã€ã«ã§ããŸãã
ãªã³ã«ã®æ©èœïŒããŒã1
åã«ã颿°ãŸãã¯å€æ°ã®å®£èšã¯ã³ã³ãã€ã©ãŒãžã®çŽæã§ãããããã°ã©ã ã®ä»ã®ã©ããã«ãã®é¢æ°ãŸãã¯å€æ°ã®å®çŸ©ãããããªã³ã«ãŒã®ä»äºã¯ãã®çŽæãããããšã§ãããšè¿°ã¹ãŸããã
ãªããžã§ã¯ããã¡ã€ã«ã®å³ãèŠããšããã®ããã»ã¹ãã空ã®ã¹ããŒã¹ãåããããšèª¬æã§ã
ãŸã ã
äžèšã®äŸã«å ããŠãå¥ã®Cãã¡ã€ã«ãèæ
®ããäŸã䜿çšããŠããã説æããŸãã
int z_global = 11; static int y_global_init = 2; extern int x_global_init; int fn_a(int x, int y) { return(x+y); } int main(int argc, char *argv) { const char *message = "Hello, world"; return fn_a(11,12); }

äž¡æ¹ã®å³ã«åºã¥ããŠããã¹ãŠã®ãã€ã³ããæ¥ç¶ã§ããããšãããããŸãïŒæ¥ç¶ãããŠããªãå Žåããªã³ã«ãŒã¯ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããŸãïŒã ãã¹ãŠã®ãã®ã«ã¯ç¬èªã®å Žæãããããã¹ãŠã®å Žæã«ã¯ç¬èªã®å ŽæããããŸãã ãŸãããªã³ã«ãŒã¯ãããã«ç€ºãããã«ãã¹ãŠã®ç©ºã®ã¹ããŒã¹ãåããããšãã§ããŸãïŒUNIXã·ã¹ãã ã§ã¯ãéåžžããªã³ã¯ããã»ã¹ã¯
ld
ã³ãã³ãã«ãã£ãŠåŒã³åºãããŸãïŒã
ãªããžã§ã¯ããã¡ã€ã«ãšåæ§ã«ã
nm
ã䜿çšããŠæçµçãªå®è¡å¯èœãã¡ã€ã«ã調ã¹ãããšãã§ããŸãã
Symbols from sample1.exe: Name Value Class Type Size Line Section _Jv_RegisterClasses | | w | NOTYPE| | |*UND* __gmon_start__ | | w | NOTYPE| | |*UND* __libc_start_main@@GLIBC_2.0 | U | FUNC|000001ad| |*UND* _init |08048254| T | FUNC| | |.init _start |080482c0| T | FUNC| | |.text __do_global_dtors_aux|080482f0| t | FUNC| | |.text frame_dummy |08048320| t | FUNC| | |.text fn_b |08048348| t | FUNC|00000009| |.text fn_c |08048351| T | FUNC|00000055| |.text fn_a |080483a8| T | FUNC|0000000b| |.text main |080483b3| T | FUNC|0000002c| |.text __libc_csu_fini |080483e0| T | FUNC|00000005| |.text __libc_csu_init |080483f0| T | FUNC|00000055| |.text __do_global_ctors_aux|08048450| t | FUNC| | |.text _fini |08048478| T | FUNC| | |.fini _fp_hw |08048494| R | OBJECT|00000004| |.rodata _IO_stdin_used |08048498| R | OBJECT|00000004| |.rodata __FRAME_END__ |080484ac| r | OBJECT| | |.eh_frame __CTOR_LIST__ |080494b0| d | OBJECT| | |.ctors __init_array_end |080494b0| d | NOTYPE| | |.ctors __init_array_start |080494b0| d | NOTYPE| | |.ctors __CTOR_END__ |080494b4| d | OBJECT| | |.ctors __DTOR_LIST__ |080494b8| d | OBJECT| | |.dtors __DTOR_END__ |080494bc| d | OBJECT| | |.dtors __JCR_END__ |080494c0| d | OBJECT| | |.jcr __JCR_LIST__ |080494c0| d | OBJECT| | |.jcr _DYNAMIC |080494c4| d | OBJECT| | |.dynamic _GLOBAL_OFFSET_TABLE_|08049598| d | OBJECT| | |.got.plt __data_start |080495ac| D | NOTYPE| | |.data data_start |080495ac| W | NOTYPE| | |.data __dso_handle |080495b0| D | OBJECT| | |.data p.5826 |080495b4| d | OBJECT| | |.data x_global_init |080495b8| D | OBJECT|00000004| |.data y_global_init |080495bc| d | OBJECT|00000004| |.data z_global |080495c0| D | OBJECT|00000004| |.data y_global_init |080495c4| d | OBJECT|00000004| |.data __bss_start |080495c8| A | NOTYPE| | |*ABS* _edata |080495c8| A | NOTYPE| | |*ABS* completed.5828 |080495c8| b | OBJECT|00000001| |.bss y_global_uninit |080495cc| b | OBJECT|00000004| |.bss x_global_uninit |080495d0| B | OBJECT|00000004| |.bss _end |080495d4| A | NOTYPE| | |*ABS*
äž¡æ¹ã®ãªããžã§ã¯ããã¡ã€ã«ã®æåãå«ãŸããŠãããæªå®çŸ©ã®åç
§ã¯ãã¹ãŠè¡šç€ºãããªããªããŸããã ã·ã³ãã«ã¯ãåæ§ã®ã¿ã€ããäžç·ã«ãªãããã«äžŠã¹æ¿ããããŸãã ãŸããOSãå®è¡å¯èœãã¡ã€ã«ãªã©ãåŠçããã®ã«åœ¹ç«ã€ããã€ãã®ã¢ããªã³ããããŸãã
çµè«ãè€éã«ãªãã»ã©å€ãã®è€éãªè©³çްããããŸãããã¢ã³ããŒã¹ã³ã¢ã§å§ãŸããã®ããã¹ãŠæšãŠããšãã¯ããã«ç°¡åã«ãªããŸãã
éè€ããæå
åã®ç« ã§ã¯ããªã³ã¯ãèŠã€ãã£ãã·ã³ãã«ã®å®çŸ©ãèŠã€ããããšãã§ããªãå Žåããªã³ã«ã¯ãšã©ãŒã¡ãã»ãŒãžãåºããšè¿°ã¹ãŸããã ãŸããã¬ã€ã¢ãŠãäžã«ãã£ã©ã¯ã¿ãŒã®
2ã€ã®å®çŸ©ãèŠã€ãã£ãå Žåã¯ã©ããªããŸããïŒ
C ++ã§ã¯ããœãªã¥ãŒã·ã§ã³ã¯ç°¡åã§ãã ãã®èšèªã«ã¯
1ã€ã®å®çŸ©ã®ã«ãŒã«ãšããŠç¥ãããå¶éããããã¬ã€ã¢ãŠãäžã«ééããåæåã«å¯ŸããŠ1ã€ã ãã®å®çŸ©ãå¿
èŠã§ããããã以äžã§ã¯ãããŸããã ïŒC ++æšæºã®å¯Ÿå¿ããç« ã¯3.2ã§ãããããã€ãã®äŸå€ã«ã€ããŠãèšåããŠããŸããããã«ã€ããŠã¯
åŸã§èª¬æã
ãŸã ãïŒ
Cã®å Žåãäºæ
ã¯ããã»ã©æçœã§ã¯ãããŸããã 颿°ãšåæåãããã°ããŒãã«å€æ°ã®å®çŸ©ã¯æ£ç¢ºã«1ã€ã§ãªããã°ãªããŸããããåæåãããŠããªã倿°ã®å®çŸ©ã¯
äºåçãªå®çŸ©ãšããŠè§£éã§ããŸãã ãããã£ãŠãCèšèªã¯ãããŸããŸãªãœãŒã¹ãã¡ã€ã«ã«åããªããžã§ã¯ãã®äºåçãªå®çŸ©ãå«ããããšãèš±å¯ããŸãïŒå°ãªããšãçŠæ¢ããŸããïŒã
ãã ãããªã³ã«ã¯Cããã³C ++以å€ã®èšèªãåŠçã§ããå¿
èŠããããŸããCããã³C ++ã§ã¯ã1ã€ã®å®çŸ©ã®èŠåãå¿
ãããå°éãããŸããã ããšãã°ãFortranããããåç
§ãããã¹ãŠã®ãã¡ã€ã«ã®ãã¹ãŠã®ã°ããŒãã«å€æ°ã®ã³ããŒãä¿æããã®ã¯æ£åžžã§ãã æ¬¡ã«ããªã³ã«ãŒã¯ã1ã€ã®ã³ããŒïŒãµã€ãºãç°ãªãå Žåã¯æå€§ã®ä»£è¡šïŒãéžæããŠéè€ãåé€ããæ®ããç Žæ£ããå¿
èŠããããŸãã ãã®ã¢ãã«ã¯ãFortran COMMONïŒå
±éïŒããŒã¯ãŒãã«ãããã¬ã€ã¢ãŠãã®ãäžè¬ã¢ãã«ããšåŒã°ããããšããããŸãã
çµæãšããŠãå°ãªããšãåæåãããŠããªãã°ããŒãã«å€æ°ã®éè€æåã§ããå ŽåãUNIXãªã³ã«ãéè€æåã®ååšãèªããªãããšã¯éåžžã«äžè¬çã§ãïŒãã®ã¬ã€ã¢ãŠãã¢ãã«ã¯ãççµåã®ã¢ãã«ããšåŒã°ããããšããããŸã[
translã«æ³šæããŠãã ããã defã¢ãã«ãããè¯ãææ¡ãæè¿ããŸã]ïŒã ãããæ°ã«ãªãå ŽåïŒããããæ°ã«ãªãã¯ãã§ãïŒããªã³ã«ã®ããã¥ã¡ã³ããåç
§ããŠããã®åäœãç·©åãã-work
---
ãªãã·ã§ã³ãèŠã€ããŠãã ããã ããšãã°ãGNUããŒã«ãã§ãŒã³ã§ã¯ã
-fno-common
ã³ã³ãã€ã©ãªãã·ã§ã³ã䜿çšãããšãå
±éïŒCOMMONïŒãããã¯ãçæãã代ããã«ãBBSã»ã°ã¡ã³ãã«åæåãããŠããªã倿°ã匷å¶
-fno-common
ã«é
眮ã§ããŸãã
ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯äœãããŸããïŒ
ãªã³ã«ãå®è¡å¯èœãã¡ã€ã«ãçæããã·ã³ãã«ãžã®åãªã³ã¯ã«é©åãªå®çŸ©ãå²ãåœãŠãã®ã§ãå®è¡ã®ããã«ããã°ã©ã ãå®è¡ãããšãã«ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãäœãè¡ãããç°¡åã«çè§£ã§ããŸãã
ãã¡ããããã°ã©ã ãå®è¡ããã«ã¯ããã·ã³ã³ãŒãã®å®è¡ãå¿
èŠã§ãã OSã¯æããã«ãå®è¡å¯èœãã¡ã€ã«ã®ãã·ã³ã³ãŒããããŒããã£ã¹ã¯ãããªãã¬ãŒãã£ã³ã°ã¡ã¢ãªã«è»¢éããå¿
èŠããããããããCPUããããååŸã§ããŸãã ãããã®éšåã¯ãã³ãŒãã»ã°ã¡ã³ãïŒã³ãŒãã»ã°ã¡ã³ããŸãã¯ããã¹ãã»ã°ã¡ã³ãïŒãšåŒã°ããŸãã
ããŒã¿ã®ãªãã³ãŒãã¯ããèªäœã§ã¯åœ¹ã«ç«ã¡ãŸããã ãããã£ãŠããã¹ãŠã®ã°ããŒãã«å€æ°ã«ã¯ã³ã³ãã¥ãŒã¿ãŒã®ã¡ã¢ãªå
ã®å Žæãå¿
èŠã§ãã ãã ããåæåãããã°ããŒãã«å€æ°ãšåæåãããŠããªãã°ããŒãã«å€æ°ã«ã¯éãããããŸãã åæåããã倿°ã«ã¯ç¹å®ã®éå§å€ããããããããªããžã§ã¯ãããã³å®è¡å¯èœãã¡ã€ã«ã«ä¿åããå¿
èŠããããŸãã ããã°ã©ã ãéå§æã«éå§ããããšãOSã¯ãããã®å€ãããã°ã©ã ã®ä»®æ³ç©ºéã®ããŒã¿ã»ã°ã¡ã³ãã«ã³ããŒããŸãã
åæåãããŠããªã倿°ã®å ŽåãOSã¯ãã¹ãŠã®å€æ°ãåæå€ãšããŠ0ãæã£ãŠãããšæ³å®ããå ŽåããããŸãã å€ãã³ããŒããå¿
èŠã¯ãããŸããã ãŒãã«åæåãããã¡ã¢ãªã®äžéšã¯ãbssã»ã°ã¡ã³ããšåŒã°ããŸãã
ã€ãŸããã°ããŒãã«å€æ°çšã®ã¹ããŒã¹ã¯ããã£ã¹ã¯ã«ä¿åãããŠããå®è¡å¯èœãã¡ã€ã«ã«å²ãåœãŠãããšãã§ããŸãã åæåããã倿°ã®å Žåããã®åæå€ãä¿åããå¿
èŠããããŸãããåæåãããŠããªã倿°ã®å Žåããµã€ãºãä¿åããã ãã§ãã

ãæ°ã¥ããããããŸãããããããŸã§ãªããžã§ã¯ããã¡ã€ã«ãšãªã³ã«ã«é¢ãããã¹ãŠã®è°è«ã§ãã°ããŒãã«å€æ°ã«ã€ããŠã®ã¿è©±ããŠããŸããã
åè¿°ã®ããŒã«ã«å€æ°ãšåçã«å æãããã¡ã¢ãª
ã«ã€ããŠã¯èšåããŸããã§ã
ã ã
ãã®ããŒã¿ã¯ãããã°ã©ã ã®å®è¡äžã«æå¹æéãéå§ããã³çµäºããããããªã³ã«ãŒã®ä»å
¥ãå¿
èŠãšããŸãããããã¯ããªã³ã«ãŒããã§ã«ãžã§ããå®è¡ããããããã£ãšåŸã®ããšã§ãã ãã ãã説æãå®å
šã«ããããã«ã次ã®ããšãç°¡åã«ç€ºããŸãã
- ããŒã«ã«å€æ°ã¯ã ã¹ã¿ãã¯ãšåŒã°ããã¡ã¢ãªé åã«é
眮ãããŸã ããã®ã¡ã¢ãªé åã¯ãããŸããŸãªé¢æ°ãåŒã³åºãããŠå®è¡ããããšæ¡å€§ããã³çž®å°ããŸãã
- åçã«å²ãåœãŠãããã¡ã¢ãªã¯heapãšåŒã°ããã¡ã¢ãªé åããååŸãããmalloc颿°ã¯ãã®é åã®ç©ºãé åãžã®ã¢ã¯ã»ã¹ãå¶åŸ¡ããŸãã
å³ã宿ãããã«ã¯ãå®è¡äžã®ããã»ã¹ã®ã¡ã¢ãªç©ºéãã©ã®ãããªãã®ãã远å ãã䟡å€ããããŸãã ããŒããšã¹ã¿ãã¯ã¯åçã«ãµã€ãºã倿Žã§ãããããã¹ã¿ãã¯ãäžæ¹åã«æé·ããããŒããå察æ¹åã«æé·ããããšã¯éåžžã«äžè¬çã§ãã ãããã£ãŠãã¹ã¿ãã¯ãšããŒããäžéã®ã©ããã§åºäŒã£ãå Žåã«ã®ã¿ãããã°ã©ã ã¯ç©ºãã¡ã¢ãªäžè¶³ã®ãšã©ãŒãåºããŸãïŒãã®å Žåãããã°ã©ã ã®ã¡ã¢ãªç©ºéã¯æ¬åœã«ãã£ã±ãã«ãªããŸãïŒã

ãªã³ã«ãè¡ãããš; ããŒã2
ãªã³ã«ãè¡ãããšã®
åºæ¬ã説æããã®ã§ãããè€éãªéšåã®èª¬æãããªã³ã«ã«è¿œå ããããšããšã»ãŒåãé åºã§èª¬æããŸãã
ãªã³ã«ã®æ©èœã«åœ±é¿ããäž»ãªèгå¯äºé
ã¯æ¬¡ã®ãšããã§ãïŒå€æ°ã®ç°ãªãããã°ã©ã ãåãããšïŒç»é¢ãžã®åºåãããŒããã£ã¹ã¯ããã®ãã¡ã€ã«ã®èªã¿åããªã©ïŒãè¡ãå Žåããã®ã³ãŒããç¹å®ã®å Žæã«åé¢ããŠä»ã®äººã«äžããããšã¯æããã«çã«ããªã£ãŠããŸãããã䜿çšããããã°ã©ã ã
èãããã解決çã®1ã€ã¯ãåããªããžã§ã¯ããã¡ã€ã«ã䜿çšããããšã§ããããªããžã§ã¯ããã¡ã€ã«ã®ã³ã¬ã¯ã·ã§ã³å
šäœã...ç°¡åã«ã¢ã¯ã»ã¹ã§ãã1ã€ã®å Žæã«ä¿åããæ¹ãã¯ããã«äŸ¿å©ã§ãã
æè¡çãªäœè«ïŒãã®ç« ã§ã¯ããªã³ã«ãŒã®éèŠãªããããã£ã§ããåé
眮ãå®å
šã«çç¥ããŠããŸãã ç°ãªãããã°ã©ã ã«ã¯ç°ãªããµã€ãºããããŸãã å
±æã©ã€ãã©ãªãããŸããŸãªããã°ã©ã ã®ã¢ãã¬ã¹ç©ºéã«ããããããŠããå Žåãç°ãªãã¢ãã¬ã¹ã«ãªããŸãã , . , (« +1020 ») (« 0x102218BF»), , . â
relocation . , , C/C++ â .
â
. , (share), ; .
UNIX
ar , , , *.a. «lib» "-l" (.. "-lfred" «libfred.a»).
( , ranlib
, , . ar
.)
Windows
.LIB
LIB, , «import library», , DLL â
Windows DLLãªã³ã«ã¯ããªããžã§ã¯ããã¡ã€ã«ã®ã³ã¬ã¯ã·ã§ã³ãå埩åŠçããŠããããçµåãããšãã«ããŸã å®è£
ã§ããªãæåã®ãªã¹ããä¿æããŸããæç€ºçã«æå®ããããã¹ãŠã®ãªããžã§ã¯ããã¡ã€ã«ãåŠçããããšããã«ããªã³ã«ãŒã¯ãªã¹ãå
ã«æ®ã£ãŠããæåãæ€çŽ¢ããããã®æ°ããå Žæãã€ãŸãã©ã€ãã©ãªã«ãªããŸããã©ã€ãã©ãªãªããžã§ã¯ãã®1ã€ã§æªå®çŸã·ã³ãã«ãå®çŸ©ãããŠããå Žåããªããžã§ã¯ãããŠãŒã¶ãŒã«ãã£ãŠãªããžã§ã¯ããã¡ã€ã«ã®ãªã¹ãã«è¿œå ããããã®ããã«ãªããžã§ã¯ãã远å ãããã¬ã€ã¢ãŠããç¶è¡ãããŸããã©ã€ãã©ãªãã远å ããããã®ã®ç²åºŠã«æ³šæããŠãã ããïŒç¹å®ã®æåãå®çŸ©ããå¿
èŠãããå Žåã¯ããªããžã§ã¯ãå
šäœ , , . , , â , .
â
; , ,
. , , , , , .
, ; ,
ao, bo, -lx
ããã³-ly
ããã¡ã€ã« | ao | bo | libx.a | liby.a |
察象 | ao | bo | x1.o | x2.o | x3.o | y1.o | y2.o | y3.o |
Oprede- Lenia | a1, a2, a3 | b1, b2 | x11, x12, x13 | x21, x22, x23 | x31, x32 | y11, y12 | y21, y22 | y31, y32 |
解決ã§ããªã shonnyeã® ãªã³ã¯ | b2, x12 | a3, y22 | x23, y12 | y11 | | y21 | | x31 |
ao
bo
,
b2
a3
,
x12
y22
.
libx.a
,
x1.o
,
x12
; ,
x23
y12
(
y22, x23, y12
).
libx.a
,
x23
,
x2.o
libx.a
.
y11
(
y22, y12, y11
).
libx.a
ãã®ããããªã³ã«ã¯ã«äœ¿çšããliby.a
ãŸããããã§ãåãããšãèµ·ããããªã³ã«ãŒã«ã¯ãšãå«ãŸy1.o
ãy2.o
ãŸããæåã®ãªããžã§ã¯ãã«ãžã®ãªã³ã¯ã远å ãããŸããy21
ãy2.o
ãŸã å«ãŸããããããã®ãªã³ã¯ã¯åçŽã«è§£æ±ºãããŸãããã®ããã»ã¹ã®çµæãæªå®çŸ©ã®åç
§ã¯ãã¹ãŠè§£æ±ºãããäžéšã®ïŒãã¹ãŠã§ã¯ãªãïŒã©ã€ãã©ãªãªããžã§ã¯ããæçµçãªå®è¡å¯èœãã¡ã€ã«ã«å«ãŸããŸããããšãã°ããžbo
ã®ãªã³ã¯ããã£ãå Žåã¯ãç¶æ³ãå€å°å€ããããšã«æ³šæããŠãã ããy32
ããã®å Žåãã¬ã€ã¢ãŠãlibx.a
ãçºçããŸãããåŠçã«liby.a
ã¯å
å«ãå¿
èŠã«ãªããŸãy3.o
ããã®ãªããžã§ã¯ããå«ããããšã«ããã远å ããŸãx31
æªè§£æ±ºã®æåã®ãªã¹ãã«è¿œå ãããšããã®ãªã³ã¯ã¯æªè§£æ±ºã®ãŸãŸã«ãªããŸãããã®æ®µéã§ã¯ããªã³ã«ã¯ãã§ã«åŠçlibx.a
ãå®äºããŠããããããã®ã·ã³ãã«ã®å®çŸ©ã¯èŠã€ãããŸããïŒc x3.o
ïŒãïŒã¡ãªã¿ã«ããã®äŸã¯ã©ã€ãã©ãªlibx.a
ãšã©ã€ãã©ãªã®éã«åšæçãªäŸåé¢ä¿ãããliby.a
ãŸã;ããã¯éåžžWindowsã§ç¹ã«æªãã§ãïŒåçå
±æã©ã€ãã©ãª
C (
libc
) â . ,
printf
,
fopen
, .
, . -
printf
, , .
, (
.so
.dll
Windows
.dylib
Mac OS XïŒããã®ã¿ã€ãã®ã©ã€ãã©ãªã®å Žåããªã³ã«ãŒã¯å¿
ããããã¹ãŠã®ãã€ã³ããæ¥ç¶ãããšã¯éããŸããã代ããã«ããªã³ã«ãŒã¯ãIOUãã¿ã€ãã®ã¯ãŒãã³ãçºè¡ãïŒç§ã¯ããªããåãã=ç§ã¯ããªããåããïŒãããã°ã©ã ãéå§ãããŸã§ãã®ã¯ãŒãã³ã®æéãé
ãããŸããããããã¹ãŠã¯ãç¹å®ã®æåã®å®çŸ©ãå
±æã©ã€ãã©ãªã«ããããšããªã³ã«ãŒãçºèŠããå Žåãæçµçãªå®è¡å¯èœãã¡ã€ã«ã«ãã®å®çŸ©ãå«ããªããšããäºå®ã«èŠçŽãããŸãã代ããã«ããªã³ã«ã¯ãã·ã³ãã«ã®ååãšããã®ã·ã³ãã«ã衚瀺ãããã¯ãã®ã©ã€ãã©ãªãæžã蟌ã¿ãŸããããã°ã©ã ãå®è¡ã®ããã«åŒã³åºããããšãOSã¯ããã«ãããã»ã¹ã®æ®ãã®éšåãããã°ã©ã ã®éå§åã«æééãã«å®äºããããšãä¿èšŒããŸãã颿°ãåŒã³åºãããåmain
ã«ããªã³ã«ãŒã®å°ããªããŒãžã§ã³ïŒå€ãã®å Žåãld.so
) â .
,
printf
.
printf
,
libc.so
â
printf
.
, . (
printf
libc.so
), . , , .
, ( ,
ar
), . ,
nm
â :
, ,
liby.so
x31
.
:
y32
bc
,
y3.o
x3.o
.
, â
ldd
; Unix , ( ), , . , . ( ,
LD_LIBRARY_PATH
.)
/usr/bin:ldd xeyes linux-gate.so.1 => (0xb7efa000) libXext.so.6 => /usr/lib/libXext.so.6 (0xb7edb000) libXmu.so.6 => /usr/lib/libXmu.so.6 (0xb7ec6000) libXt.so.6 => /usr/lib/libXt.so.6 (0xb7e77000) libX11.so.6 => /usr/lib/libX11.so.6 (0xb7d93000) libSM.so.6 => /usr/lib/libSM.so.6 (0xb7d8b000) libICE.so.6 => /usr/lib/libICE.so.6 (0xb7d74000) libm.so.6 => /lib/libm.so.6 (0xb7d4e000) libc.so.6 => /lib/libc.so.6 (0xb7c05000) libXau.so.6 => /usr/lib/libXau.so.6 (0xb7c01000) libxcb-xlib.so.0 => /usr/lib/libxcb-xlib.so.0 (0xb7bff000) libxcb.so.1 => /usr/lib/libxcb.so.1 (0xb7be8000) libdl.so.2 => /lib/libdl.so.2 (0xb7be4000) /lib/ld-linux.so.2 (0xb7efb000) libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb7bdf000)
, , , , . , , ( bss â , , ,
strtok
). , , . ,
ao
co
,
bo
co
, .
Windows DLL
å
±æã©ã€ãã©ãªã®äžè¬çãªååã¯UnixãšWindowsã®äž¡æ¹ã®ãã©ãããã©ãŒã ã§ã»ãŒåãã§ãããšããäºå®ã«ãããããããåå¿è
ãçè§£ã§ããããã€ãã®è©³çްããŸã ãããŸãããšã¯ã¹ããŒããããã·ã³ãã«
æå€§ã®éãã¯ãWindowsã©ã€ãã©ãªã§ã¯æåãèªåçã«ãšã¯ã¹ããŒããããªãããšã§ããUnixã§ã¯ãå
±æã©ã€ãã©ãªã«å¯ŸããŠèªèšŒããããã¹ãŠã®ãªããžã§ã¯ããã¡ã€ã«ã®ãã¹ãŠã®æåãããã®ã©ã€ãã©ãªã®ãŠãŒã¶ãŒã«è¡šç€ºãããŸããWindowsã§ã¯ãããã°ã©ãã¯æç€ºçã«äžéšã®æåã衚瀺ããå¿
èŠããããŸãããããããšã¯ã¹ããŒãããŸããã·ã³ãã«ãšWindows DLLããšã¯ã¹ããŒãããã«ã¯3ã€ã®æ¹æ³ããããŸãïŒããã3ã€ã®æ¹æ³ã¯ãã¹ãŠåãã©ã€ãã©ãªã«æ··åšãããããšãã§ããŸãïŒãC ++ããã®mishmashã«æ¥ç¶ããããšããã«ããããã®ãªãã·ã§ã³ã®æåã®ãªãã·ã§ã³ãæãç°¡åã«ãªããŸãããã®å Žåãã³ã³ãã€ã©ã¯ååã®è£
食ãåŒãåããããã§ãã.LIB
ããã³ãã®ä»ã®ã©ã€ãã©ãªé¢é£ãã¡ã€ã«
Windowsã©ã€ãã©ãªã«é¢é£ãã2çªç®ã®å°é£ã«çŽé¢ããŸãããšã¯ã¹ããŒããããã·ã³ãã«ã«é¢ããæ
å ±ã¯ããªã³ã«ãŒãä»ã®ã·ã³ãã«ãšé¢é£ä»ããå¿
èŠããããŸãããããèªäœã«ã¯å«ãŸããŠããŸããDLL
ã代ããã«ããã®æ
å ±ã¯å¯Ÿå¿ãã.LIB
ãã¡ã€ã«ã«å«ãŸããŠããŸãã.LIB
ã«é¢é£ä»ããããŠãããã¡ã€ã«ã¯DLL
ãã©ã®ïŒãšã¯ã¹ããŒããããïŒæåãDLL
ãã®å Žæãšãšãã«å«ãŸããŠãããã説æããŸããã䜿çšãããã€ããªã¯ãæåãæ£ããé¢é£ä»ããããã«ãã¡ã€ã«ã«DLL
ã¢ã¯ã»ã¹ããå¿
èŠããããŸã.LIB
ãç©äºãããã«æ··ä¹±ãããããã«ãæ¡åŒµæ©èœã¯.LIB
éçã©ã€ãã©ãªã«ã䜿çšãããŸããå®éãWindowsã©ã€ãã©ãªã«äœããã®åœ¢ã§é¢é£ããå¯èœæ§ã®ããããŸããŸãªãã¡ã€ã«ãããã€ããããŸãããšãšãã«.LIB
ãã¡ã€ã«ãããã³ïŒãªãã·ã§ã³ã®ïŒ.DEF
ãã¡ã€ã«ã䜿çšãããšãWindowsã©ã€ãã©ãªã«é¢é£ä»ããããŠããæ¬¡ã®ãã¹ãŠã®ãã¡ã€ã«ã衚瀺ã§ããŸãã- ã¬ã€ã¢ãŠãåºåãã¡ã€ã«
- library
.DLL
ïŒå®éã®ã©ã€ãã©ãªã³ãŒãããã®ãã¡ã€ã«ã¯ãã©ã€ãã©ãªã䜿çšãããã€ããªãïŒå®è¡æã«ïŒå¿
èŠãšããŸãã
- library
.LIB
ïŒçµæã®ã·ã³ãã«ã®ã©ãã«ã©ã®ã·ã³ãã«ãããããèšè¿°ãããã©ã€ãã©ãªã€ã³ããŒãããã¡ã€ã«DLL
ããã®ãã¡ã€ã«ã¯ãDLL
äžéšã®æåã®ã¿ããšã¯ã¹ããŒãããå Žåã«çæãããŸããæåããšã¯ã¹ããŒããããªãå Žåã.LIB
ãã¡ã€ã«ã«ã¯ãã€ã³ãããããŸããããã®ãã¡ã€ã«ã¯ãªã³ã¯äžã«å¿
èŠã§ãã
- library
.EXP
ïŒã³ã³ãã€ã«æžã¿ã©ã€ãã©ãªã®ããšã¯ã¹ããŒããã¡ã€ã«ãã埪ç°äŸåé¢ä¿ã®ãããã€ããªãååšããå Žåã«å¿
èŠã§ãã
- library
.ILK
: /INCREMENTAL
, , . .
- library
.PDB
: /DEBUG
, , .
- library
.MAP
: /MAP
, .
- :
- library
.LIB
: « », DLL
, .
- library
.LIB
: , , . .LIB
- library
.DEF
: «», , .
- library
.EXP
: , , LIB.EXE
.LIB
. .
- library
.ILK
: ; äžèšãåç
§ããŠãã ããã
- ã©ã€ãã©ãª
.RES
ïŒå®è¡å¯èœãã¡ã€ã«ã§äœ¿çšãããããŸããŸãªGUIãŠã£ãžã§ããã«é¢ããæ
å ±ãå«ããªãœãŒã¹ãã¡ã€ã«ããããã®ãªãœãŒã¹ã¯ãæçµçãªãã€ããªã«å«ãŸããŠããŸãã
ããã¯ãããããã¹ãŠã®è¿œå ãã¡ã€ã«ã«å«ãŸããã»ãŒãã¹ãŠã®æ
å ±ãåã«ã©ã€ãã©ãªèªäœã«è¿œå ãããUnixãšã®å€§ããªéãã§ããã€ã³ããŒãããããã£ã©ã¯ã¿ãŒ
DLLã¯ããšã¯ã¹ããŒããããæåãæç€ºçã«å®£èšããããã®èŠä»¶ã«å ããŠãã©ã€ãã©ãªã³ãŒãã䜿çšããŠã€ã³ããŒãããæåãæç€ºçã«å®£èšãããã€ããªãèš±å¯ããŸããããã¯å¿
é ã§ã¯ãããŸãããã16ããããŠã£ã³ããŠã®å±¥æŽããããã£ã«ãã£ãŠåŒãèµ·ããããéåºŠã®æé©åãæäŸããŸãããããè¡ãã«ã¯ã次ã®ããã«ãœãŒã¹ã³ãŒãã§__declspecïŒdllimportïŒãšããŠæåã宣èšããŸãã __declspec(dllimport) int function_from_some_dll(int x, double y); __declspec(dllimport) extern int global_var_from_some_dll;
C. : DLL, /
, , DLL,
.
â .
#ifdef EXPORTING_XYZ_DLL_SYMS #define XYZ_LINKAGE __declspec(dllexport) #else #define XYZ_LINKAGE __declspec(dllimport) #endif XYZ_LINKAGE int xyz_exported_function(int x)
DLL, ,
EXPORTING_XYZ_DLL_SYMS
(
#define
) . , .
, DLL, , Windows , . Unix , , .. , , , , . Windows .
â . , , â , , ,
, , .
X.DLL
Y.DLL
,
Y.DLL
X.DLL
, : , .
Windows
.
- X.
LIB.EXE
( LINK.EXE
), X.LIB
, LINK.EXE
. X.DLL
, X.EXP
.
Y
, X.LIB
, , Y.DLL
Y.LIB
.
- æåŸã«ãã©ã€ãã©ãªã
X
å®å
šã«äœæããŸããããX.EXP
ã¯ãæåã®ã¹ãããã§ååŸãã远å ã®ãã¡ã€ã«ã䜿çšããŠãã»ãŒéåžžã©ããã«çºçããŸãããã®ã¹ãããã§ã®éåžžã®ããšã¯ããªã³ã«ã䜿çšY.LIB
ããã³çæãããã®X.DLL
ã§ããç°åžž- X.LIB
ãã®ãã¡ã€ã«ã¯ãã¡ã€ã«ã®ååšããæãããªããã«ãæåã®ã¹ãããã§ãã§ã«äœæãããŠããããããªã³ã«ãŒã¯äœæã¹ããããã¹ãããã.EXP
ãŸãã
ããããåšæçãªäŸåé¢ä¿ãåé¿ãããããªæ¹æ³ã§ã©ã€ãã©ãªãåç·šæããããšã¯ç¢ºãã«åªããŠããŸã...ç»åãè£å®ããC ++
C++ , C, . â C++ C, . , , .
C++ , , , (
):
int max(int x, int y) { if (x>y) return x; else return y; } float max(float x, float y) { if (x>y) return x; else return y; } double max(double x, double y) { if (x>y) return x; else return y; }
: -
max
, ?
(name mangling), (to mangle = , ,
.. ) , . . .
( ), , , , (,
nm
â !):
Symbols from fn_overload.o: Name Value Class Type Size Line Section __gxx_personality_v0| | U | NOTYPE| | |*UND* _Z3maxii |00000000| T | FUNC|00000021| |.text _Z3maxff |00000022| T | FUNC|00000029| |.text _Z3maxdd |0000004c| T | FUNC|00000041| |.text
max
, , , «max» â «i»
int
, «f»
float
«d»
double
( , , , !).
, , , . (,
c++filt
) (
--demangle
GNU nm), - :
Symbols from fn_overload.o: Name Value Class Type Size Line Section __gxx_personality_v0| | U | NOTYPE| | |*UND* max(int, int) |00000000| T | FUNC|00000021| |.text max(float, float) |00000022| T | FUNC|00000029| |.text max(double, double) |0000004c| T | FUNC|00000041| |.text
, , C C++. , C++ , ; , C , , . , C++
extern "C"
. C++ , â C++ , C, C , C++.
, , , -
extern "C"
C C++ .
g++ -o test1 test1a.o test1b.o test1a.o(.text+0x18): In function `main': : undefined reference to `findmax(int, int)' collect2: ld returned 1 exit status
çŽ æŽããããã³ãã¯ããšã©ãŒã¡ãã»ãŒãžã«é¢æ°ã®çœ²åãå«ãŸããŠããããšã§ããããã¯ãåã«èŠã€ãããªãã£ããšããã¡ãã»ãŒãžã§ã¯ããfindmax
ãŸãããã€ãŸããC ++ã³ãŒãã¯ã®ãããªãã®ãæ¢ããŸããã"_Z7findmaxii"
ã®ã¿ãèŠã€ã"findmax"
ãŸãããããã£ãŠãã¬ã€ã¢ãŠããšã©ãŒãçºçããŸãããšããã§ãextern "C"
ã¯ã©ã¹ã®ã¡ã³ããŒé¢æ°ã§ã¯å®£èšãç¡èŠãããããšã«æ³šæããŠãã ããïŒC ++æšæºã®7.5.4ïŒéçãªããžã§ã¯ãã®åæå
C++, , â
. â , . , , .
, . C â :
, ---.
C ++ã§ã¯ãåæåããã»ã¹ã¯åã«åºå®å€ãã³ããŒãããããã¯ããã«è€éã«ãªãå¯èœæ§ããããŸããããã°ã©ã èªäœãå®éã«å®è¡ãéå§ããåã«ãã¯ã©ã¹éå±€å
šäœã®ããŸããŸãªã³ã³ã¹ãã©ã¯ã¿ãŒã®ãã¹ãŠã®ã³ãŒããå®è¡ããå¿
èŠããããŸãããããåŠçããããã«ãã³ã³ãã€ã©ã¯åC ++ãã¡ã€ã«ã®ãªããžã§ã¯ããã¡ã€ã«ã«å°ãäœåãªæ
å ±ãé
眮ããŸããã€ãŸããããã¯ç¹å®ã®ãã¡ã€ã«ã«å¯ŸããŠåŒã³åºãå¿
èŠãããã³ã³ã¹ãã©ã¯ã¿ã®ãªã¹ãã§ãããªã³ã¯æã«ããªã³ã«ãŒã¯ãããã®ãªã¹ãããã¹ãŠ1ã€ã®å€§ããªãªã¹ãã«çµåãããªã¹ãå
šäœãééããã³ãŒããé
眮ããŠããã¹ãŠã®ã°ããŒãã«ãªããžã§ã¯ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããŸããé åºã«æ³šæããŠãã ãã , â , . (. « C++» â 47
, 4
)
,
nm
. C++ :
class Fred { private: int x; int y; public: Fred() : x(1), y(2) {} Fred(int z): x(z), y(3) {} }; Fred theFred; Fred theOtherFred(55);
(
)
nm
:
Symbols from global_obj.o: Name Value Class Type Size Line Section __gxx_personality_v0| | U | NOTYPE| | |*UND* __static_initialization_and_destruction_0(int, int) |00000000| t | FUNC|00000039| |.text Fred::Fred(int) |00000000| W | FUNC|00000017| |.text._ZN4FredC1Ei Fred::Fred() |00000000| W | FUNC|00000018| |.text._ZN4FredC1Ev theFred |00000000| B | OBJECT|00000008| |.bss theOtherFred |00000008| B | OBJECT|00000008| |.bss global constructors keyed to theFred |0000003a| t | FUNC|0000001a| |.text
, ,
W ( «» («weak» symbol)) ".gnu.linkonce.t.
stuff ". , «Name» , â .
ãã¿ãŒã³
å
ã»ã©ã颿°ã®3ã€ã®ç°ãªãå®è£
ã®äŸã瀺ããŸããmax
ããããããããŸããŸãªåã®åŒæ°ãåããŸããããã ãã颿°ã®æ¬äœã³ãŒãã¯3ã€ã®ã±ãŒã¹ãã¹ãŠã§åäžã§ããããšãããããŸãããããŠãåãã³ãŒããè€è£œããããšã¯ãæªãããã°ã©ãã³ã°ããŒã³ã§ããããšãç¥ã£ãŠããŸããC ++ã§ã¯ãã³ãã¬ãŒãã®æŠå¿µãå°å
¥ãããŠããããããã¹ãŠã®ã±ãŒã¹ã§ä»¥äžã®ã³ãŒããäžåºŠã«äœ¿çšã§ããŸããmax_template.h
颿°ã³ãŒãã®ã³ããŒã1ã€ã ãæã€ããããŒãã¡ã€ã«ãäœæã§ããŸãmax
ã template <class T> T max(T x, T y) { if (x>y) return x; else return y; }
ãã®ãã¡ã€ã«ããœãŒã¹ãã¡ã€ã«ã«å«ããŠããã³ãã¬ãŒã颿°ã詊ããŠãã ããã #include "max_template.h" int main() { int a=1; int b=2; int c; c = max(a,b);
C++
max<int>(int,int)
max<double>(double,double)
. , - . , ,
max<float>(float,float)
max<MyFloatingPointClass>(MyFloatingPointClass,MyFloatingPointClass)
.
. , , , ( , ).
ããã¯ã©ã®ããã«è¡ãããŸããïŒ
éåžžãã¢ã¯ã·ã§ã³ã®2ã€ã®ãã¹ããããŸããå埩ããæš©éãéåŒãããã€ã³ã¹ã¿ã³ã¹ããã«ããã§ãŒãºã«å»¶æãããã®ããããã§ãïŒéåžžããããã®ã¢ãããŒããSunã®ã¹ããŒããã¹ããã³ãã¹ãšåŒã³ãŸãïŒãã€ã³ã¹ã¿ã³ã¹ãç¹°ãè¿ãéåŒãæ¹æ³ã¯ãåãªããžã§ã¯ããã¡ã€ã«ã«ãæ€åºããããã¹ãŠã®ãã¿ãŒã³ã®ã³ãŒããå«ãŸããŠããããšãæå³ããŸããããšãã°ãäžèšã®ãã¡ã€ã«ã®å Žåããªããžã§ã¯ããã¡ã€ã«ã®å
å®¹ã¯æ¬¡ã®ããã«ãªããŸãã Symbols from max_template.o: Name Value Class Type Size Line Section __gxx_personality_v0 | | U | NOTYPE| | |*UND* double max<double>(double, double) |00000000| W | FUNC|00000041| |.text _Z3maxIdET_S0_S0_ int max<int>(int, int) |00000000| W | FUNC|00000021| |.text._Z3maxIiET_S0_S0_ main |00000000| T | FUNC|00000073| |.text
max<int>(int,int)
max<double>(double,double)
.
, , ( , ). â .
( Solaris C++) â , . , , , .
, , C++ ( )
, , â .
, , . .
dlopen
dlsym
( Windows
LoadLibrary
GetProcAddress
). . , ,
dlopen
.
dlopen
, , (
RTLD_NOW
) (
RTLD_LAZY
). ,
dlopen
, , , â .
, . , , , . .
dlsym
èŠã€ãã£ãæåã®ååãå ±åãããªãã©ã«ãã©ã¡ãŒã¿ãåãåãããã®å Žæãžã®ãã€ã³ã¿ãè¿ããŸãïŒãŸãã¯NULL
æåãèŠã€ãããªãå ŽåïŒãC ++ãšã®çžäºäœçš
, C++, ?
.
dlsym
, , . , , .. .
, , C++ . , â C- , ( ), .
äžèšãèŠçŽãããšã次ã®ããšã«æ³šæããŠãã ãããéåžžextern "C"
ããšã³ããªãã€ã³ãã«1人ã®å人ãçœ®ãæ¹ãé©ådlsym
ã§ãããã®ãšã³ããªãã€ã³ãã¯ãC ++ã¯ã©ã¹ã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãžã®ãã€ã³ã¿ãŒãè¿ããã¡ã¯ããªã¡ãœããã§ãC ++ã®ãã¹ãŠã®ãã£ãŒã ã«ã¢ã¯ã»ã¹ã§ããŸããã©ã€ãã©ãªãåçã«ããŒããŸãã¯ã¢ã³ããŒããããå Žåãã©ã€ãã©ãªã«è¿œå ã§ãããªã³ã«ã«ãã£ãŠåŒã³åºãããïŒããŒããŸãã¯å®è¡äžã¯é¢ä¿ãããŸããïŒããã€ãã®ç¹æ®æåããããããã³ã³ãã€ã©ã¯ããŒããããã©ã€ãã©ãªã®ã°ããŒãã«ãªããžã§ã¯ãã®ãã¶ã€ããããŸãåŠçdlopen
ã§ããŸããããã§ãã³ã³ã¹ãã©ã¯ã¿ãŸãã¯ãã¹ãã©ã¯ã¿ãžã®å¿
èŠãªåŒã³åºããè¡ãããšãã§ããŸãã Unixã§ã¯ããããã¯é¢æ°ã§_init
ããã_fini
, , GNU ,
__attribute__((constructor))
__attribute__((destructor))
. Windows â
DllMain
DWORD fdwReason
DLL_PROCESS_ATTACH
DLL_PROCESS_DETACH
.
, « », ; « », « » , ( , ). , .
ãªãã·ã§ãã«
, , , 95% , .
, :
- John Levine, Linkers and Loaders : , , . - ( ) .
- Mach-O Mac OS X.
- Peter Van Der Linden, Expert C Programming : , , , C, , C, .
- Scott Meyers, More Effective C++ : 34 , C C++ ( )
- Bjarne Stroustrup, The Design and Evolution of C++ : 11.3 C++ .
- Margaret A. Ellis & Bjarne Stroustrup, The Annotated C++ Reference Manual : 7.2c
- ELF format reference [PDF]
- Linuxã§ã®è»œéã®å®è¡å¯èœãã¡ã€ã«ã®äœæã«é¢ãã2ã€ã®è峿·±ãèšäºãšãç¹ã«æå°éã®Hello Worldã
- æªåé«ãUlrich Drepperã®ãå
±æã©ã€ãã©ãªã®æžãæ¹ã[PDF]ã«ã¯ã ELFãšè»¢éã«é¢ãã詳现ãå«ãŸããŠããŸãã
ãã®ããŒãžã«é¢ããæçšãªææ¡ãããŠãããMike CappãšEd Wilsonã«æè¬ããŸãã
Copyright©2004-2005,2009-2010 David Drysdaleãã®ããã¥ã¡ã³ãã¯ãGNU Free Documentation LicenseããŒãžã§ã³1.1ãŸãã¯Free Software Foundationãçºè¡ãããã以éã®ããŒãžã§ã³ã®æ¡ä»¶ã®äžã§ãã³ããŒãé
åžãããã³/ãŸãã¯å€æŽããèš±å¯ãäžããããŠããŸããäžå€ã»ã¯ã·ã§ã³ãããã³ãã«ããŒããã¹ããããã¯ã«ããŒããã¹ãã¯ãããŸãããã©ã€ã»ã³ã¹ã®ã³ããŒã¯ãã¡ãããå
¥æã§ããŸãã