´ÙÀ½ ÀÌÀü Â÷·Ê

6. »ç¿ë¹ýÀÇ ¿¹½Ã

¾Æ·¡ ºÎÅÍ´Â (Á¤Àû, °øÀ¯ ¹× µ¿Àû ¶óÀ̺귯¸®ÀÇ)¼¼°¡Áö ÇüÅÂÀÇ ¸ðµç ¶óÀÌºê ·¯¸®ÀÇ ¿¹ÀÌ´Ù. 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

File demo_dynamic.c /* demo_dynamic.c -- "hello" routineÀÇ µ¿ÀûÀûÀç¿Í »ç¿ëÀÇ ¿¹ */

/* 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


´ÙÀ½ ÀÌÀü Â÷·Ê