¾Æ·¡ ºÎÅÍ´Â (Á¤Àû, °øÀ¯ ¹× µ¿Àû ¶óÀ̺귯¸®ÀÇ)¼¼°¡Áö ÇüÅÂÀÇ ¸ðµç ¶óÀÌºê ·¯¸®ÀÇ ¿¹ÀÌ´Ù. libhello.c´Â libhello.h¸¦ Çì´õ·Î ÇÏ´Â º¸ÅëÀÇ ¶óÀ̺귯¸®À̸ç, demo_use.c´Â libhello.c¸¦ È£ÃâÇÏ´Â Æò¹üÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. ±× ´ÙÀ½¿¡´Â ÀÌ°ÍÀÌ ¾î¶»°Ô Á¤Àû ¹× °øÀ¯¶óÀ̺귯¸®·Î »ç¿ëµÇ´Â°¡ÀÇ ¿¹¸¦ º¸¿©ÁÖ´Â ½ºÅ©¸³Æ® (script_static, script_shared)°¡ ÁÖ¼®°ú ÇÔ²² ÀÖÀ¸¸ç, ±× ´ÙÀ½¿¡´Â °øÀ¯ ¶óÀÌ ºê·¯¸®°¡ ¾î¶»°Ô µ¿Àû ¶óÀ̺귯¸®·Î »ç¿ëµÇ´ÂÁö¸¦ º¸¿©ÁÖ´Â demo_ dyanmic.c¿Í script_dynamicÀÌ ÀÖ´Ù.
File libhello.c /* libhello.c - ¶óÀ̺귯¸®·Î »ç¿ëµÇ´Â ÆÄÀÏ */ #include <stdio.h> void hello(void) printf("Hello, library world.");
File libhello.h /* libhello.h - Çì´õ ÆÄÀÏ */ void hello(void);
File demo_use.c /* demo_use.c -- ¹Ù·Î hello·çƾÀ» »ç¿ëÇÏ´Â ¿¹ */ #include "libhello.h" int main(void) { hello(); return 0; }
File script_static #!/bin/sh # Á¤Àû ¶óÀ̺귯¸® µ¥¸ð # Á¤Àû ¶óÀ̺귯¸®ÀÇ ¿ÀºêÁ§Æ® ÆÄÀÏÀÎ libhello-static.o»ý¼º. # libhello-staticÀ̶ó´Â À̸§À» »ç¿ëÇÏ´Â °ÍÀº Á¤Àû ¶óÀ̺귯¸® # ¿Í µ¿Àû ¶óÀ̺귯¸® »ç¿ëÀ» ¾ö¿¬È÷ ±¸º°Çϱâ À§ÇÑ°ÍÀÏ »ÓÀÌ¹Ç # ·Î -staticÀ̶ó´Â À̸§À» ¿ÀºêÁ§Æ® ÆÄÀÏÀ̳ª Á¤Àû ¶óÀ̺귯¸®¿¡ # ¾µ ÇÊ¿ä´Â ¾ø´Ù. gcc -Wall -g -c -o libhello-static.o libhello.c # Á¤Àû ¶óÀ̺귯¸®ÀÇ »ý¼º. ar rcs libhello-static.a libhello-static.o # ¿©±â¼ libhello-static.a¸¦ ³ªÁß¿¡ »ç¿ëÇϱâ # À§ÇØ ¾îµò°¡¿¡ º¹»çÇØ ³õÀ»¼ö ÀÖÀ» °ÍÀÌ´Ù. # µ¥¸ð ¸ñÀûÀ¸·Î »ç¿ëÇϱâ À§Çؼ ¿ì¸®´Â # ÇöÀçÀÇ µð·ºÅ丮¿¡ ¶óÀ̺귯¸®¸¦ µÎ±â·Î ÇÑ´Ù. # demo_use ÇÁ·Î±×·¥ÀÇ ÄÄÆÄÀÏ gcc -Wall -g -c demo_use.c -o demo_use.o # demo_use ÇÁ·Î±×·¥ÀÇ »ý¼º; -L. ¿É¼ÇÀº "." °¡ ÇÁ·Î±×·¥ # ÀÇ »ý¼º½Ã¿¡ °Ë»öµÇ°Ô ÇÑ´Ù. ÀÌ ¸í·ÉÀ¸·Î libhello-static.a¿¡ # ÀÖ´Â °ü·ÃµÈ ¿ÀºêÁ§Æ®°¡ ÆÄÀÏ demo_use_static¿¡ »ðÀԵȴÙ. gcc -g -o demo_use_static demo_use.o -L. -lhello-static # ÇÁ·Î±×·¥ÀÇ ½ÇÇà ./demo_use_static
File script_shared #!/bin/sh # °øÀ¯ ¶óÀ̺귯¸®ÀÇ µ¥¸ð # °øÀ¯ ¶óÀ̺귯¸®ÀÇ ¿ÀºêÁ§Æ® ÆÄÀÏ libhello.oÀÇ »ý¼º. gcc -fPIC -Wall -g -c libhello.c # °øÀ¯ ¶óÀ̺귯¸®ÀÇ »ý¼º. # -lc¸¦ »ç¿ëÇÏ¿© C ¶óÀ̺귯¸®¿Í ¸µÅ©ÇÑ´Ù. ¿Ö³ÄÇϸé # libhello°¡ C ¶óÀ̺귯¸®¿¡ ÀÇÁ¸µÇ±â ¶§¹®ÀÌ´Ù. gcc -g -shared -Wl,-soname,libhello.so.0 \ -o libhello.so.0.0 libhello.o -lc # ¿©±â¼ libhello.so.0.0¸¦ ¾î¶² µð·ºÅ丮 À̸¦Å׸é # /usr/local/lib¿¡ º¹»çÇÏ¿©µµ µÈ´Ù. # ÀÌÁ¦ ldconfig¸¦ ÀÌ¿ë ½Éº¼¸¯ ¸µÅ©¸¦ ¸¸µç´Ù. # sonameÀ» ¼Â¾÷ÇÔ. ¾Æ·¡¿Í °°ÀÌ Çصµ ¹«¹æÇÏ´Ù. # ln -sf libhello.so.0.0 libhello.so.0 # ¿©±â¼´Â ±×³É ldconfig·Î Çϵµ·Ï ÇÑ´Ù. /sbin/ldconfig -n . # linker nameÀ» ¼ÂÆÃÇÑ´Ù. # Á»´õ ¸é¹ÐÇÏ°Ô ÇÏ·Á¸é ÀÌ¹Ì Á¸ÀçÇÏ´Â linker nameÀÌ # ÀÖ´ÂÁö È®ÀÎÇغ¸°í ¸¸¾à ±×·¸´Ù¸é ±×³É ³öµÖ¾ß ÇÒÁö # ¾Æ´ÑÁö¸¦ Àß Ã¼Å©ÇؾßÇÑ´Ù. ln -sf libhello.so.0 libhello.so # demo_use ÇÁ·Î±×·¥ ÆÄÀÏÀ» ÄÄÆÄÀÏÇÑ´Ù. gcc -Wall -g -c demo_use.c -o demo_use.o # demo_use ÇÁ·Î±×·¥ÀÇ »ý¼º. # -L. Àº "." ÀÌ ÇÁ·Î±×·¥ÀÇ »ý¼º½Ã¿¡ °Ë»öµÇµµ·Ï # ÇÑ´Ù. "." °¡ ÇÁ·Î±×·¥ ½ÇÇà½Ã¿¡ °Ë»öµÇ´Â °ÍÀÌ # ¾Æ´Ô¿¡ À¯ÀÇÇ϶ó. gcc -g -o demo_use demo_use.o -L. -lhello # ÇÁ·Î±×·¥ ½ÇÇà. LD_LIBRARY_PATH¸¦ »ç¿ë # ÇÏ¿© °øÀ¯ ¶óÀ̺귯¸®°¡ ¾îµð¿¡ Àִ°¡¸¦ # ÇÁ·Î±×·¥¿¡ ¾Ë·Á ÁÖ¾î¾ßÇÑ´Ù. LD_LIBRARY_PATH="." ./demo_use
/* dlfcn.h ÆÄÀÏÀÌ µ¿ÀûÀûÀç ¶óÀ̺귯¸® ·çƾ¿¡ ÇÊ¿äÇÔ */ #include <dlfcn.h> #include <stdio.h> /* "libhello.h"¸¦ includeÇÒ ÇÊ¿ä°¡ ¾øÀ½¿¡ À¯ÀÇÇ϶ó. ±×·¸Áö¸¸ ±×¿Í °ü·ÃÇÏ¿© ¾î¶² °ÍÀº ¹Ýµå½Ã ¸í½ÃÇؾßÇÑ´Ù; Áï, dlsym()À¸·Î ¾òÀº °ªÀ» °¡Áö°í ÀÖÀ» µ¥ÀÌÅÍÀÇ Å¸ÀÙ Àº ºÐ¸íÈ÷ Á¤ÇØÁ®¾ß ÇÑ´Ù. */ /* "simple_demo_function" ŸÀÙÀº ¸Å°³º¯¼ö¿Í ¸®ÅÏ°ªÀÌ ¾ø´Â ÇÔ¼öÀÇ Å¸ÀÙÀ» ¸»ÇÑ´Ù. */ typedef void (*simple_demo_function)(void);
int main(void) const char *error; void *module; simple_demo_function demo_function; /* µ¿Àû ¶óÀ̺귯¸®¸¦ ÀûÀçÇÔ */ module = dlopen("libhello.so", RTLD_LAZY); if (!module) fprintf(stderr, "Couldn't open libhello.so: %s", dlerror()); exit(1);
/* ½Éº¼À» °¡Á®¿È */ dlerror(); demo_function = dlsym(module, "hello"); if ((error = dlerror())) fprintf(stderr, "Couldn't find hello: %s", error); exit(1);
/* DL ¶óÀ̺귯¸®ÀÇ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. */ (*demo_function)(); /* ¸ðµç °ÍÀ» ¸¶Ä£ µÚ È®½ÇÈ÷ Ŭ·Î¡ÇÑ´Ù. */ dlclose(module); return 0;
File script_dynamic #!/bin/sh # µ¿Àû ¶óÀ̺귯¸® µ¥¸ð # libhello.so¿Í friends°¡ ÀÌ¹Ì # »ý¼ºµÇ¾úÀ½À» °¡Á¤ÇÑ´Ù. ( dynamicÀÇ ¿¹¸¦ º¸¶ó). # demo_dynamic ÇÁ·Î±×·¥À» ¿ÀºêÁ§Æ® ÆÄÀÏ·Î ÄÄÆÄÀÏ. gcc -Wall -g -c demo_dynamic.c # demo_use ÇÁ·Î±×·¥ÀÇ »ý¼º. # ÀÌ ÇÁ·Î±×·¥ÀÌ »ç¿ëÇϴ ƯÁ¤ÀÇ ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¥ÀÌ # ½ÃÀÛµÇ°í ³µÚ°¡ µÇ±â Àü±îÁö´Â ÀûÀçµÇÁö ¾Ê±â ¶§¹®¿¡ µ¿Àû # ¶óÀ̺귯¸®¸¦ ã±âÀ§ÇØ ¾îµð¸¦ °Ë»öÇØ¾ß ÇÏ´ÂÁö ¾Ë¸± ÇÊ¿ä°¡ # ¾øÀ½¿¡ À¯ÀÇÇ϶ó. # ±×·¸Áö¸¸ µ¿Àû ¶óÀ̺귯¸®¸¦ ÀûÀçÇÏ´Â ¶óÀ̺귯¸®¸¦ # Æ÷ÇÔÇϱâ À§Çؼ -ldl¿É¼ÇÀº ¹Ýµå½Ã ÇÊ¿äÇÏ´Ù. gcc -g -o demo_dynamic demo_dynamic.o -ldl # ÇÁ·Î±×·¥ÀÇ ½ÇÇà. LD_LIBRARY_PATH ¸¦ ÀÌ¿ëÇÏ¿© # ÇÁ·Î±×·¥ÀÌ ¾îµð¼ µ¿Àû ¶óÀ̺귯¸®¸¦ ¾òÀ»¼ö # ÀÖ´ÂÁö ¾Ë·Á ÁÖ¾î¾ß ÇÑ´Ù. . LD_LIBRARY_PATH="." ./demo_dynamic