¶óÀ̺귯¸® ¸¸µé±â
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.



Ãß°¡ÇÒ ³»¿ë

nmÀ» ÀÌ¿ëÇÏ¸é ¶óÀ̺귯¸®¿¡ Æ÷ÇÔµÈ ¿ÀºêÁ§Æ®¿Í ÇÔ¼ö¸í±îÁö È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù.
# nm libproc.a 
alloc.o: 
nm: alloc.o: no symbols 
compare.o: 
nm: compare.o: no symbols 
devname.o: 
nm: devname.o: no symbols 
ksym.o: 
nm: ksym.o: no symbols 
 

library ÀÇ »ç¿ë

library ÀÇ »ç¿ë

À± »ó¹è

yundream@coconut.co.kr



1절. ¼Ò°³

ÀÌ ¹®¼­´Â library ÀÇ »ç¿ë¹æ¹ý¿¡ ´ëÇÑ ³»¿ëÀ» ´ã°í ÀÖ´Ù. ¿Ö ¶óÀ̺귯¸®°¡ ÇÊ¿äÇÑÁö, ¶óÀ̺귯¸®´Â ¾î¶² Á¾·ù°¡ ÀÖÀ¸¸ç, ¾î¶»°Ô ÀÛ¼ºÇÒ¼ö ÀÖ´ÂÁö, ±×¸®°í ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö¿¡ ´ëÇØ¼­ ¾ê±âÇϵµ·Ï ÇÒ°ÍÀÌ´Ù. ±×¸®°í Áß°£Áß°£¿¡ ÀÌÇØ¸¦ µ½±â À§ÇÑ ½ÇÁ¦ ÄÚµù¿ª½Ã µé¾î°¥ °ÍÀÌ´Ù.

¶óÀ̺귯¸®¿¡ ´ëÇÑ ÀÌ·¯Àú·¯ÇÑ ¼¼ºÎÀûÀÎ ³»¿ë±îÁö ´Ù·çÁø ¾ÊÀ»°ÍÀÌ´Ù. Á»´õ ÀÌ·ÐÀûÀÎ ³»¿ëÀ» ÇÊ¿ä·Î ÇÑ´Ù¸é Program Library HOWTO ¸¦ Âü°íÇϱ⠹ٶõ´Ù. ÀÌ ¹®¼­¿¡¼­´Â ¶óÀ̺귯¸®¸¦ ¸¸µé°í Ȱ¿ëÇÏ´Â ¸é¿¡ ÁßÁ¡À» µÑ°ÍÀÌ´Ù. ±×·¯¹Ç·Î À§ÀÇ ¹®¼­´Â À̹®¼­¸¦ ÀбâÀü¿¡ ´ëÃæÀÌ¶óµµ Çѹø Àоµµ·Ï ÇÑ´Ù.

Á¤Àû ¶óÀ̺귯¸®¿Í °øÀ¯¶óÀ̺귯¸®´Â ÀϹÝÀûÀÎ ³»¿ëÀÓÀ¸·Î °£´ÜÇÑ ¼³¸í°ú ÀϹÝÀûÀÎ ¿¹Á¦¸¦ µå´Â Á¤µµ·Î ³Ñ¾î°¥ °ÍÀÌ´Ù. ±×·¯³ª µ¿Àû¶óÀ̺귯¸®¿¡ ´ëÇØ¼­´Â ¸î°¡Áö ´Ù·ç¾î¾ßÇÒ À̽´µéÀÌ ÀÖÀ½À¸·Î ´Ù¸¥ °Íµé¿¡ ºñÇØ¼­ Á»´õ ºñÁßÀÖ°Ô ´Ù·ç°Ô µÉ°ÍÀÌ´Ù.


2절. Library À̾߱â

2.1절. ¶óÀ̺귯¸®¶õ ¹«¾ùÀΰ¡

¶óÀ̺귯¸®¶õ ƯÁ¤ÇÑ ÄÚµå(ÇÔ¼ö ȤÀº Ŭ·¡½º)¸¦ Æ÷ÇÔÇϰí ÀÖ´Â ÄÄÆÄÀÏµÈ ÆÄÀÏÀÌ´Ù. ÀÌ·¯ÇÑ ¶óÀ̺귯¸®¸¦ ¸¸µå´Â ÀÌÀ¯´Â ÀÚÁÖ »ç¿ëµÇ´Â ƯÁ¤ÇÑ ±â´ÉÀ» main ÇÔ¼ö¿¡¼­ ºÐ¸®½ÃÄÑ ³õÀ½À¸·Î½á, ÇÁ·Î±×·¥À» À¯Áö, µð¹ö±ëÀ» ½±°ÔÇϰí ÄÄÆÄÀÏ ½Ã°£À» Á»´õ ºü¸£°Ô ÇÒ¼ö Àֱ⠶§¹®ÀÌ´Ù.

¸¸¾à ¶óÀ̺귯¸®¸¦ ¸¸µéÁö ¾Ê°í ¸ðµç ÇÔ¼ö¸¦ main ¿¡ Áý¾î ³Ö´Â´Ù¸é, ¼öÁ¤ÇÒ¶§ ¸¶´Ù main Äڵ带 ¼öÁ¤ÇØ¾ß ÇÏ°í ´Ù½Ã ÄÄÆÄÀÏ ÇØ¾ß ÇÒ°ÍÀÌ´Ù. ´ç¿¬È÷ ¼öÁ¤Çϱ⵵ ¾î·Æ°í ÄÄÆÄÀÏ¿¡µµ ¸¹Àº ½Ã°£ÀÌ °É¸°´Ù.

¹Ý¸é ¶óÀ̺귯¸®È­ ÇØµÎ¸é ¿ì¸®´Â ÇØ´ç ¶óÀ̺귯¸®¸¸ ´Ù½Ã ÄÄÆÄÀÏ ½ÃÄѼ­ main ÇÔ¼ö¿Í ¸µÅ© ½ÃÄÑÁÖ¸é µÈ´Ù. ½Ã°£µµ ¾Æ³¥»Ó´õ·¯ ¼öÁ¤Çϱ⵵ ¸Å¿ì ½±´Ù.


2.2절. ¶óÀ̺귯¸®ÀÇ Á¾·ù

¶óÀ̺귯¸®¿¡µµ ±× ¾²ÀÓ»õ¿¡ µû¶ó¼­ ¿©·¯°¡Áö Á¾·ù°¡ ÀÖ´Ù(Å©°Ô 3°¡Áö). °¡Àå ÈçÇÏ°Ô ¾²Àϼö ÀÖ´Â "Á¤Àû¶óÀ̺귯¸®"¿Í "°øÀ¯¶óÀ̺귯¸®", "µ¿Àû¶óÀ̺귯¸®" °¡ ÀÖ´Ù.

ÀÌµé ¶óÀ̺귯¸®°¡ ¼­·Î ±¸ºÐµÇ¾îÁö´Â Ư¡Àº ÀûÀç ½Ã°£ÀÌ µÉ°ÍÀÌ´Ù.

Á¤Àû¶óÀ̺귯¸®

Á¤Àû¶óÀ̺귯¸®´Â object file(.o·Î ³¡³ª´Â) ÀÇ ´Ü¼øÇÑ ¸ðÀ½ÀÌ´Ù. Á¤Àû¶óÀ̺귯¸°´À º¸Åë .a ÀÇ È®ÀåÀÚ¸¦ °¡Áø´Ù. °£´ÜÈ÷ »ç¿ëÇÒ¼ö ÀÖ´Ù. ÄÄÆÄÀϽà ÀûÀçµÇ¹Ç·Î À¯¿¬¼ºÀÌ ¶³¾îÁø´Ù. ÃÖ±Ù¿¡´Â Á¤Àû¶óÀ̺귯¸®´Â Áö¾çµÇ°í ÀÖ´Â Ãß¼¼ÀÌ´Ù. ÄÄÆÄÀϽà ÀûÀçµÇ¹Ç·Î ¾Æ¹«·¡µµ ¹ÙÀ̳ʸ®Å©±â°¡ ¾à°£ Ä¿Áö´Â ¹®Á¦°¡ ÀÖÀ»°ÍÀÌ´Ù.

°øÀ¯¶óÀ̺귯¸®

°øÀ¯¶óÀ̺귯¸®´Â ÇÁ·Î±×·¥ÀÌ ½ÃÀ۵ɶ§ ÀûÀçµÈ´Ù. ¸¸¾à ÇϳªÀÇ ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ¾î¼­ °øÀ¯¶óÀ̺귯¸®¸¦ »ç¿ëÇß´Ù¸é, ±×µÚ¿¡ °øÀ¯¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â ¸ðµç ÇÁ·Î±×·¥Àº ÀÚµ¿ÀûÀ¸·Î ¸¸µé¾îÁ® ÀÖ´Â °øÀ¯¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ°Ô µÈ´Ù. ±×·³À¸·Î½á ¿ì¸®´Â Á»´õ À¯¿¬ÇÑ ÇÁ·Î±×·¥À» ¸¸µé¼ö ÀÕ°Ô µÈ´Ù.

Á¤Àû¶óÀ̺귯¸®¿Í ´Þ¸® ¶óÀ̺귯¸®°¡ ÄÄÆÄÀϽà ÀûÀçµÇÁö ¾ÊÀ¸¹Ç·Î ÇÁ·Î±×·¥ÀÇ »çÀÌÁî ÀÚü´Â ÀÛ¾ÆÁöÁö¸¸ À̷лóÀ¸·Î ºÃÀ»¶§, ¶óÀ̺귯¸®¸¦ ÀûÀçÇÏ´Â ½Ã°£ÀÌ ÇÊ¿äÇÒ°ÍÀ̹ǷΠÁ¤Àû¶óÀ̺귯¸®¸¦ »ç¿ëÇÑ ÇÁ·Î±×·¥º¸´Ù´Â 1-5% Á¤µµ ´À·ÁÁú¼ö ÀÖ´Ù. ÇÏÁö¸¸ º¸ÅëÀº ÀÌ·¯ÇÑ ´À¸²À» ´À³¥¼ö´Â ¾øÀ»°ÍÀÌ´Ù.

µ¿Àû¶óÀ̺귯¸®

°øÀ¯¶óÀ̺귯¸®°¡ ÇÁ·Î±×·¥ÀÌ ½ÃÀ۵ɶ§ ÀûÀçµÇ´Â ¹Ý¸é À̰ÍÀº ÇÁ·Î±×·¥½ÃÀÛÁß Æ¯Á¤ÇѶ§¿¡ ÀûÀçµÇ´Â ¶óÀ̺귯¸®ÀÌ´Ù. Ç÷¯±×ÀÎ ¸ðµâµîÀ» ±¸ÇöÇÒ¶§ ÀûÇÕÇÏ´Ù. ¼³Á¤ÆÄÀϵ ÀоîµéÀÎ ¶óÀ̺귯¸®¸¦ µî·Ï½ÃŰ°í ¿øÇÏ´Â ¶óÀ̺귯¸®¸¦ ½ÇÇà½ÃŰ°Ô ÇϴµîÀÇ ¸Å¿ì À¯¿¬ÇÏ°Ô ÀÛµ¿ÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µé°íÀÚ ÇÒ¶§ À¯¿ëÇÏ´Ù.


2.2.1절. ¿Ö Á¤Àû¶óÀ̺귯¸®ÀÇ »ç¿ëÀ» Áö¾çÇϴ°¡

¿¹Àü¿¡ libz ¶ó´Â ¶óÀ̺귯¸®¿¡ º¸¾È ¹®Á¦°¡ »ý°Ü¼­ ÇÑ⠽òô·¯¿ü´øÀûÀÌ ÀÖ´Ù. libz ¶óÀ̺귯¸®´Â °¢Á¾ ¼­¹öÇÁ·Î±×·¥¿¡ ¸Å¿ì ³Î¸® »ç¿ëµÇ´Â ¶óÀ̺귯¸®¿´´Âµ¥, ½ÇÁ¦ ¹®Á¦°¡ µÇ¾ú´ø ÀÌÀ¯´Â ¸¹Àº libz ¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥µéÀÌ "Á¤Àû¶óÀ̺귯¸®" Çü½ÄÀ¸·Î ¶óÀ̺귯¸®¸¦ »ç¿ëÇ߱⠶§¹®¿¡, ¹ö±×ÇȽº(bug fix)¸¦ À§Çؼ­´Â ¹®Á¦°¡ µÇ´Â libz ¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥µéÀ» ´Ù½Ã ÄÄÆÄÀÏ ½ÃÄÑ¾ß Ç߱⠶§¹®ÀÌ´Ù. ÇѸ¶µð·Î ¹ö±×ÇȽº ÀÚü°¡ ¾î·Á¿ü´ø°Ô Å« ¹®Á¦¿´¾ú´Ù. µµ´ëü ÀÌ ÇÁ·Î±×·¥µéÀÌ libz ¸¦ »ç¿ëÇϰí ÀÖ´ÂÁö ±×·¸Áö ¾ÊÀºÁö¸¦ ¿ÏÀüÇÏ°Ô ¾Ë±âµµ Èûµé»Ó´õ·¯, ¾ðÁ¦ ±×¸¹Àº ÇÁ·Î±×·¥À» ´Ù½Ã ÄÄÆÄÀÏ ÇÑ´Ü ¸»Àΰ¡.

¸¸¾à libz ¸¦ Á¤ÀûÀ¸·Î »ç¿ëÇÏÁö ¾Ê°í "°øÀ¯¶óÀ̺귯¸®" ÇüÅ·Π»ç¿ëÇÑ´Ù¸é bug fix °¡ ÈξÀ ½¬¿üÀ»°ÍÀÌ´Ù. ¿Ö³Ä¸é libz °øÀ¯¶óÀ̺귯¸®´Â Çϳª¸¸ ÀÖÀ» °ÍÀ̹ǷΠÀ̰͸¸ ¾÷±×·¹ÀÌµå ½ÃÄÑÁÖ¸é µÇ±â ¶§¹®ÀÌ´Ù.

¾Æ¹¸µç ÀÌ·¸°Ô À¯¿¬¼ºÀÌ Áö³ªÄ¡°Ô ¶³¾îÁø´Ù´Â Ãø¸éÀÌ Á¤Àû¶óÀ̺귯¸®¸¦ »ç¿ëÇÏÁö ¾Ê´Â °¡Àå Å« ÀÌÀ¯°¡ µÉ°ÍÀÌ´Ù. ÇÁ·Î±×·¥µéÀÇ µ¢Ä¡°¡ Ä¿Áö´Â ¹®Á¦´Â À¯¿¬¼º ¹®Á¦¿¡ ºñÇÏ¸é ±×¸®Å«¹®Á¦°¡ µÇÁö´Â ¾ÊÀ»°ÍÀÌ´Ù.


3절. ¶óÀ̺귯¸® ¸¸µé°í »ç¿ëÇϱâ

À̹øÀå¿¡¼­´Â ½ÇÁ¦·Î ¶óÀ̺귯¸®¸¦ ¸¸µé°í »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼­ °¢ ¶óÀ̺귯¸® Á¾·ùº°·Î ¾Ë¾Æº¼ °ÍÀÌ´Ù.


3.1절. ¶óÀ̺귯¸®È­ ÇÒ ÄÚµå

¶óÀ̺귯¸®ÀÇ À̸§Àº libmysum ÀÌ µÉ°ÍÀ̸ç, ¿©±â¿¡´Â 2°³ÀÇ ÇÔ¼ö°¡ µé¾î°¥ °ÍÀÌ´Ù. Çϳª´Â µ¡¼ÀÀ» ÇÒ ÇÔ¼ö·Î "ysum" ¶Ç Çϳª´Â »¬¼ÀÀ» À§ÇÑ ÇÔ¼ö·Î "ydiff" À¸·Î ÇÒ°ÍÀÌ´Ù. ÀÌ ¶óÀ̺귯¸®¸¦ ¸¸µé±â À§Çؼ­ mysum.h ¿Í mysum.c 2°³ÀÇ ÆÄÀÏÀÌ ¸¸µé¾îÁú°ÍÀÌ´Ù.

mysum.h

int ysum(int a, int b); 
int ydiff(int a, int b);
			

mysun.c

#include "mysum.h"
int ysum(int a, int b)
{
    return a + b; 
}
int ydiff(int a, int b)
{
    return a - b;
}
			


3.2절. Á¤Àû¶óÀ̺귯¸® Á¦ÀÛ

Á¤Àû¶óÀ̺귯¸®´Â À§¿¡¼­ ¸»ÇßµíÀÌ ´Ü¼øÈ÷ ¿ÀºêÁ§Æ®(.o)µéÀÇ ¸ðÀÓÀÌ´Ù. ¿ÀºêÁ§Æ®¸¦ ¸¸µç´ÙÀ½¿¡ ar À̶ó´Â ¸í·ÉÀ» ÀÌ¿ëÇØ¼­ ¶óÀ̺귯¸® ¾ÆÄ«À̺긦 ¸¸µé¸é µÈ´Ù.

[root@localhost test]# gcc -c mysum.c
[root@localhost test]# ar rc libmysum.a mysum.o
			
¾ÆÁÖ¾ÆÁÖ °£´ÜÇÏ´Ù. ´ÜÁö ar ¿¡ ¸î°¡Áö ¿É¼Ç¸¸À» ÀÌ¿ëÇØ¼­ libmysum À̶õ ¶óÀÌ ºê·¯¸®¸¦ ¸¸µé¾ú´Ù. 'r' Àº libmysum.a ¶ó´Â ¶óÀ̺귯¸® ¾ÆÄ«À̺꿡 »õ·Î¿î ¿ÀºêÁ§Æ®¸¦ Ãß°¡ÇÒ°ÍÀ̶ó´Â ¿É¼ÇÀÌ´Ù. 'c' ´Â ¾ÆÄ«À̺갡 Á¸ÀçÇÏÁö ¾ÊÀ»°æ¿ì »ý¼ºÇ϶ó´Â ¿É¼ÇÀÌ´Ù.

ÀÌÁ¦ ¶óÀ̺귯¸®°¡ ½ÇÁ¦·Î »ç¿ë°¡´ÉÇÑÁö Å×½ºÆ®Çغ¸µµ·Ï ÇÏÀÚ.

¿¹Á¦ : print_sum.c

#include "mysum.h"
#include <stdio.h>
#include <string.h>

int main()
{
    char oper[5];
    char left[11];
    char right[11];
    int  result;

    memset(left, 0x00, 11);
    memset(right, 0x00, 11);

    // Ç¥ÁØÀÔ·Â(Űº¸µå)À¸·Î ºÎÅÍ  ¹®ÀÚ¸¦ ÀԷ¹޴´Ù.
    // 100+20, 100-20 °ú °°ÀÌ ¿¬»êÀÚ¿Í ÇÇ¿¬»êÀÚ »çÀÌ¿¡ °ø¹éÀ» µÎÁö ¾Ê¾Æ¾ß ÇÑ´Ù.  
    fscanf(stdin, "%[0-9]%[^0-9]%[0-9]", left, oper, right);
    if (oper[0] == '-')
    {
        printf("%s %s %s = %d\n", left, oper, right, 
                        ydiff(atoi(left), atoi(right)));
    }
    if (oper[0] == '+')
    {
        printf("%s %s %s = %d\n", left, oper, right, 
                        ysum(atoi(left), atoi(right)));
    }
}
			

À§ÀÇ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ Çϱâ À§Çؼ­´Â ¶óÀ̺귯¸®ÀÇ À§Ä¡¿Í ¾î¶² ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ°ÍÀÎÁö¸¦ ¾Ë·ÁÁà¾ß ÇÑ´Ù. ¶óÀ̺귯¸®ÀÇ À§Ä¡´Â '-L' ¿É¼ÇÀ» ÀÌ¿ëÇØ¼­ ¾Ë·ÁÁÙ¼ö ÀÖÀ¸¸ç, '-l' ¿É¼ÇÀ» ÀÌ¿ëÇØ¼­ ¾î¶² ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ°ÍÀÎÁö¸¦ ¾Ë·ÁÁÙ¼ö ÀÖ´Ù. -l µÚ¿¡ »ç¿ëµÉ ¶óÀ̺귯¸® À̸§Àº ¶óÀ̺귯¸®ÀÇ À̸§¿¡¼­ "lib"¿Í È®ÀåÀÚ "a"¸¦ Á¦¿ÜÇÑ ³ª¸ÓÁö À̸§ÀÌ´Ù. Áï libmysum.a ¸¦ »ç¿ëÇÒ °ÍÀ̶ó¸é "-lmysum" ÀÌ µÉ°ÍÀÌ´Ù.

[root@localhost test]# gcc -o print_sum print_num.c -L./ -lmysum
			
¸¸¾à ¿ì¸®°¡ »ç¿ëÇÒ ¶óÀ̺귯¸®°¡ Ç¥ÁØ ¶óÀ̺귯¸® µð·ºÅ丮°æ·Î¿¡ ÀÖ´Ù¸é -L À» »ç¿ëÇÏÁö ¾Ê¾Æµµ µÈ´Ù. Ç¥ÁضóÀ̺귯¸® µð·ºÅ丮 °æ·Î´Â /etc/ld.so.conf ¿¡ ¸í½ÃµÇ¾î ÀÖ´Ù.

Á¤Àû¶óÀ̺귯¸® »óÅ·ΠÄÄÆÄÀÏÇÑ ÇÁ·Î±×·¥ÀÇ °æ¿ì ÄÄÆÄÀϽÿ¡ ¶óÀ̺귯¸®°¡ Æ÷ÇԵǹǷΠ¶óÀ̺귯¸®¸¦ ÇÔ²² ¹èÆ÷ÇÒ ÇÊ¿ä´Â ¾ø´Ù.


3.3절. °øÀ¯¶óÀ̺귯¸® Á¦ÀÛ / »ç¿ë

print_sum.c °¡ ÄÄÆÄÀϵDZâ À§Çؼ­ »ç¿ëÇÒ ¶óÀ̺귯¸® ÇüŰ¡ Á¤Àû¶óÀ̺귯¸®¿¡¼­ °øÀ¯¶óÀ̺귯¸®·Î ¹Ù²î¿´´Ù°í ÇØ¼­ print_sum.c ÀÇ Äڵ尡 º¯°æµÇ´Â°Ç ¾Æ´Ï´Ù. ÄÄÆÄÀÏ ¹æ¹ý¿ª½Ã µ¿ÀÏÇÏ¸ç ´ÜÁö ¶óÀ̺귯¸® Á¦ÀÛ¹æ¹ý¿¡ À־¸¸ Â÷À̰¡ ³¯»ÓÀÌ´Ù.

ÀÌÁ¦ À§ÀÇ mysum.c ¸¦ °øÀ¯¶óÀ̺귯¸® ÇüÅ·Π¸¸µé¾îº¸ÀÚ. °øÀ¯¶óÀ̺귯¸®´Â º¸Åë .so ÀÇ È®ÀåÀÚ¸¦ °¡Áø´Ù.

[root@localhost test]# gcc -fPIC -c mysum.c
[root@localhost test]# gcc -shared -W1,-soname,libmysutff.so.1 -o libmysum.so.1.0.1 mysum.o
[root@localhost test]# cp libmysum.so.1.0.1 /usr/local/lib
[root@localhost test]# ln -s /usr/local/lib/libmysum.so.1.0.1 /usr/local/lib/libmysum.so
			
¿ì¼± mysum.c ¸¦ -fPIC ¿É¼ÇÀ» Á־ ¿ÀºêÁ§Æ® ÆÄÀÏÀ» ¸¸µé°í, ´Ù½Ã gcc ¸¦ ÀÌ¿ëÇØ¼­ °øÀ¯¶óÀ̺귯¸®¸¦ Á¦ÀÛÇÑ´Ù. ¸¸µé¾îÁø ¶óÀ̺귯¸®¸¦ Àû´çÇÑ À§Ä¡·Î ¿Å±â°í ³ª¼­ ln À» ÀÌ¿ëÇØ¼­ ÄÄÆÄÀÏ·¯¿¡¼­ ÀνÄÇÒ¼ö ÀÖ´Â À̸§À¸·Î ½Éº¼¸¯ ¸µÅ©¸¦ °É¾îÁØ´Ù.

ÄÄÆÄÀÏ ¹æ¹ýÀº Á¤Àû¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇÑ ÄÚµåÀÇ ÄÄÆÄÀÏ ¹æ¹ý°ú µ¿ÀÏÇÏ´Ù.

[root@coco test]# gcc -o print_sum print_sum.c -L/usr/local/lib -lmysum
			

°øÀ¯¶óÀ̺귯¸®´Â ½ÇÇà½Ã¿¡ ¶óÀ̺귯¸®¸¦ ÀûÀçÇÔÀ¸·Î ÇÁ·Î±×·¥À» ¹èÆ÷ÇÒ¶§´Â °øÀ¯¶óÀ̺귯¸®µµ ÇÔ²² ¹èÆ÷µÇ¾î¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀ»°æ¿ì ´ÙÀ½°ú °°ÀÌ °øÀ¯¶óÀ̺귯¸®¸¦ ãÀ»¼ö ¾ø´Ù´Â ¸Þ½ÃÁö¸¦ Ãâ·ÂÇϸ鼭 ÇÁ·Î±×·¥ ½ÇÇàÀÌ Áß´ÜµÉ °ÍÀÌ´Ù.

[root@coco library]# ./print_sum
./print_sum: error while loading shared libraries: libmysub.so: cannot open shared object file: No such file or directory
			
À§¿Í °°Àº ¿À·ù¸Þ½ÃÁö¸¦ ¹ß°ßÇß´Ù¸é libmysub.so °¡ ½Ã½ºÅÛ¿¡ Á¸ÀçÇÏ´ÂÁö È®ÀÎÇØ º¸ÀÚ. ¸¸¾à Á¸ÀçÇϴµ¥µµ À§¿Í °°Àº ¿À·ù°¡ ¹ß»ýÇÑ´Ù¸é ÀÌ´Â LD_LIBRARY_PATH ³ª /etc/ld.so.conf ¿¡ ¶óÀ̺귯¸® ÆÐ½º°¡ ÁöÁ¤µÇ¾î ÀÖÁö ¾ÊÀ» °æ¿ìÀÌ´Ù. ÀÌ·²¶§´Â LD_LIBRARY_PATH ȯ°æº¯¼ö¿¡ libmysub.so °¡ ÀÖ´Â µð·ºÅ丮¸¦ ¸í½ÃÇØÁְųª, /etc/ld.so.conf ¿¡ µð·ºÅ丮¸¦ Ãß°¡½ÃÄÑÁÖ¸é µÈ´Ù.

¸¸¾à libmysub.so °¡ /usr/my/lib ¿¡ º¹»çµÇ¾î ÀÖ°í ȯ°æº¯¼ö¸¦ ÅëÇØ¼­ ¶óÀ̺귯¸®ÀÇ À§Ä¡¸¦ ¾Ë·ÁÁÖ°íÀÚ ÇÒ¶§´Â ¾Æ·¡¿Í °°ÀÌ ÇϸéµÈ´Ù.

[root@localhost test]# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/my/lib 
			
±×·¸Áö ¾Ê°í ld.so.conf ÆÄÀÏÀ» º¯°æÇÏ±æ ¿øÇÑ´Ù¸é(ÀÌ·²°æ¿ì °ü¸®ÀÚ ±ÇÇÑÀ» °¡Áö°í ÀÖ¾î¾ß ÇÒ°ÍÀÌ´Ù) ld.so.conf ¿¡ ¶óÀ̺귯¸® µð·ºÅ丮¸¦ Ãß°¡Çϰí ldconfig ¸¦ Çѹø ½ÇÇà½ÃÄÑÁÖ¸é µÈ´Ù.
[root@localhost test]# cat /usr/my/lib >> /etc/ld.so.conf 
[root@localhost test]# ldconfig
			
ldconfig ¸¦ ½ÇÇà½ÃŰ°Ô µÇ¸é /etc/ld.so.conf ÀÇ ÆÄÀÏÀ» ÂüÁ¶ÇÏ¿©¼­ /etc/ld.so.cache ÆÄÀÏÀÌ ¸¸µé¾îÁö°í, ÇÁ·Î±×·¥Àº ld.so.cache ÀÇ µð·ºÅ丮 °æ·Î¿¡¼­ ÇØ´ç ¶óÀ̺귯¸®°¡ ÀÖ´ÂÁö ã°Ô µÈ´Ù.


3.4절. µ¿Àû¶óÀ̺귯¸®ÀÇ »ç¿ë

µ¿Àû¶óÀ̺귯¸®¶ó°í ÇØ¼­ µ¿Àû¶óÀ̺귯¸®¸¦ ¸¸µé±â À§ÇÑ ¾î¶² Ưº°ÇÑ ¹æ¹ýÀÌ Àִ°ÍÀº ¾Æ´Ï´Ù. ÀÏ¹Ý °øÀ¯¶óÀ̺귯¸®¸¦ ±×´ë·Î ¾²¸ç, ´ÜÁö ½ÇÇà½Ã°£¿¡ µ¿Àû¶óÀ̺귯¸®¸¦ È£ÃâÇϱâ À§ÇÑ ¹æ¹ý»óÀÇ Â÷À̸¸ Á¸ÀçÇÒ »ÓÀÌ´Ù.

Á¤Àû/°øÀ¯ ¶óÀ̺귯¸®°¡ ¶óÀ̺귯¸®ÀÇ »ý¼º¹æ¹ý°ú ÄÄÆÄÀϹæ¹ý¿¡ ¾à°£ÀÇ Â÷À̸¸ ÀÖ°í ÄÚµå´Â µ¿ÀÏÇÏ°Ô »ç¿ëµÇ¾ú´ø°Í°ú´Â ´Þ¸® µ¿Àû¶óÀ̺귯¸®´Â ÄÚµåÀÚü¿¡ Â÷À̰¡ ÀÖ´Ù. ±×·²¼ö¹Û¿¡ ¾ø´Â°Ô, µ¿Àû¶óÀ̺귯¸®´Â ÇÁ·Î±×·¥ÀÌ »øÇàµÇ´Â Áß¿¡ ƯÁ¤ÇÑ ½ÃÁ¡¿¡¼­ ºÎ¸£°í ½ÍÀ»¶§ ¶óÀ̺귯¸®¸¦ ÀûÀçÇØ¾ß ÇϹǷÎ, ¶óÀ̺귯¸®¸¦ ÀûÀçÇϰí, »ç¿ëÇϰí ÇØÁ¦(free) Çϱâ À§ÇÑ Äڵ带 »ý¼ºÇØ¾ß Çϱ⠶§¹®ÀÌ´Ù.

linux ¿¡¼­´Â ÀÌ·¯ÇÑ ¶óÀ̺귯¸®¸¦ È£ÃâÇϱâ À§ÇÑ ¾Æ·¡¿Í °°Àº ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù. ¾Æ·¡ÀÇ ÇÔ¼öµéÀº solaris ¿¡¼­ µ¿ÀÏÇÏ°Ô »ç¿ëµÉ¼ö ÀÖ´Ù.

#include <dlfcn.h>

void *dlopen (const char *filename, int flag);
const char *dlerror(void);
void *dlsym(void *handle, char *symbol);
int dlclose(void *handle); 
			
dlopen Àº µ¿Àû¶óÀ̺귯¸®¸¦ ÀûÀçÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. ù¹øÂ° ¾Æ±Ô¸ÕÆ®ÀÎ filename Àº /usr/my/lib/libmysum.so ¿Í °°ÀÌ ÀûÀçÇϱ⠿øÇÏ´Â ¶óÀ̺귯¸®ÀÇ À̸§ÀÌ´Ù. ¸¸¾à ÀûÀç½Ãų ¶óÀ̺귯¸®ÀÇ À̸§ÀÌ Àý´ë°æ·Î·Î ÁöÁ¤µÇ¾î ÀÖÁö ¾ÊÀ»°æ¿ì¿¡´Â LD_LIBRARY_PATH ¿¡ µî·ÏµÈ µð·ºÅ丮¿¡¼­ ã°í, ¿©±â¿¡¼­µµ ãÁö ¸øÇÒ°æ¿ì /etc/ld.so.cache ¿¡ µî·ÏµÈ µð·ºÅ丮 ¸®½ºÆ®¿¡¼­ ã°Ô µÈ´Ù. dlopen(3) ÀÌ ¼º°øÀûÀ¸·Î È£ÃâµÇ¸é ÇØ´ç ¶óÀ̺귯¸®¿¡ ´ëÇÑ handle °ªÀ» ³Ñ°Ü ÁØ´Ù. flag ´Â RTLD_LAZY¿Í RTLD_NOW Áß Çϳª¸¦ Á¤ÀÇÇÒ¼ö ÀÖ´Ù. RTLD_LAZY´Â ¶óÀ̺귯¸®ÀÇ Äڵ尡 ½ÇÇà½Ã°£¿¡ Á¤ÀǵÇÁö ¾ÊÀº ½Éº¼À» ÇØ°áÇϸç, RTLD_NOW ´Â dlopen ÀÇ ½ÇÇàÀÌ ³¡³ª±âÀü¿¡(return Àü¿¡) ¶óÀ̺귯¸®¿¡ Á¤ÀǵÇÁö ¾ÊÀº ½Éº¼À» ÇØ°áÇÑ´Ù.

dlerror ´Â dl °ü·ÃÇÔ¼öµéÀÌ Á¦´ë·Î ÀÛµ¿À» ¼öÇàÇÏÁö ¾Ê¾ÒÀ»°æ¿ì ¿¡·¯¸Þ½ÃÁö¸¦ µÇµ¹·ÁÁØ´Ù. dleooro(), dlsym(), dlclose(), dlopen(3)Áß ¸¶Áö¸· È£ÃâµÈ ÇÔ¼öÀÇ ¿¡·¯¸Þ½ÃÁö¸¦ µÇµ¹·ÁÁØ´Ù.

dlsym Àº dlopen(3) À» ÅëÇØ¼­ ¿­¸°¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ¼ö ÀÖµµ·Ï ½Éº¼°ªÀ» ã¾ÆÁØ´Ù. ½Éº¼À̶ó°í Çϸé Á» ¾Ö¸ÅÇѵ¥, ½Éº¼°ªÀº Áï ¿­¸°¶óÀ̺귯¸®¿¡¼­ ¿©·¯ºÐÀÌ ½ÇÁ¦·Î È£ÃâÇÒ ÇÔ¼öÀÇÀ̸§À̶ó°í »ý°¢ÇÏ¸é µÈ´Ù. handle ´Â dlopen(3) ¿¡ ÀÇÇØ¼­ ¹ÝȯµÈ °ªÀÌ´Ù. symbol Àº ¿­¸°¶óÀ̺귯¸®¿¡¼­ ¿©·¯ºÐÀÌ ½ÇÁ¦·Î ºÎ¸£°ÔµÉ ÇÔ¼öÀÇ À̸§ÀÌ´Ù. dlsym ÀÇ ¸®ÅϰªÀº dlopen À¸·Î ¿­¸° ¶óÀ̺귯¸®ÀÇ È£ÃâÇÔ¼ö¸¦ °¡¸£Å°°Ô µÈ´Ù. ¸®ÅϰªÀ» º¸¸é void * ÇüÀ¸·Î µÇ¾î Àִµ¥, void ÇüÀ» »ç¿ëÇÏÁö ¸»°í È£ÃâÇÔ¼ö°¡ ¸®ÅÏÇÏ´Â ÇüÀ» Á÷Á¢¸í½ÃÇϵµ·Ï ÇÏÀÚ. ÀÌ·¸°Ô ÇÔÀ¸·Î½á ³ªÁß¿¡ ÇÁ·Î±×·¥À» À¯Áöº¸¼ö°¡ Á»´õ ¼ö¿ùÇØÁø´Ù.


3.5절. µ¿Àû¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ¿© ÇÁ·Î±×·¥ÀÇ È®À强°ú À¯¿¬¼ºÀ» ³ôÀ̱â

µ¿Àû¶óÀ̺귯¸®´Â ½ÇÇà½Ã°£¿¡ ÇÊ¿äÇÑ ¶óÀ̺귯¸®¸¦ È£ÃâÇÒ¼ö ÀÖÀ½À¸·Î Á¶±Ý¸¸(»ç½ÇÀº ¾ÆÁÖ ¸¹À̰ÚÁö¸¸ T.T) ½Å°æ¾´´Ù¸é ¸Å¿ì È®À强³ô°í À¯¿¬ÇÑ ÇÁ·Î±×·¥À» ¸¸µé¼ö ÀÖ´Ù.

µ¿Àû¶óÀ̺귯¸®ÀÇ °¡Àå ´ëÇ¥ÀûÀÎ ¿¹°¡ ¾Æ¸¶µµ Plug-in ÀÌ ¾Æ´Ò±î ½Í´Ù. ¸¸¾à¿¡ ¸ðÁú¶ó ºê¶ó¿ìÀú°¡ plug-in À» Áö¿øÇÏÁö ¾Ê´Â ´Ù¸é ¿ì¸®´Â »õ·Î¿î ±â´Éµé ÀÌ Ãß°¡µÉ¶§ ¸¶´Ù ºê¶ó¿ìÀú¸¦ ´Ù½Ã ÄÚµùÇϰí ÄÄÆÄÀÏÇÏ´Â ¼ö°í¸¦ ÇØ¾ßÇÒ°ÍÀÌ´Ù. ±×·¯³ª µ¿Àû¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ¸é ºê¶ó¿ìÀú¸¦ ´Ù½Ã ÄÚµùÇϰí ÄÄÆÄÀÏ ÇÒÇÊ¿ä ¾øÀÌ, ÇØ´ç ±â´ÉÀ» Áö¿øÇÏ´Â ¶óÀ̺귯¸® ÆÄÀϸ¸ ¹Þ¾Æ¼­ ƯÁ¤ µð·ºÅ丮¿¡ ¼³Ä¡Çϱ⸸ ÇÏ¸é µÉ°ÍÀÌ´Ù. ¹°·Ð µ¿Àû¶óÀ̺귯¸®¸¦ »ç¿ëÇϱ⸸ ÇÑ´Ù°í ÇØ¼­ ÀÌ·¯ÇÑ ±â´ÉÀÌ ¹Ù·Î ±¸ÇöµÇ´Â °Ç ¾Æ´Ï´Ù. Plug-in ÀÇ È¿À²ÀûÀÎ ±¸¼ºÀ» À§ÇÑ Ç¥ÁØÈ­µÈ API¸¦ Á¦°øÇÏ°í ¿©±â¿¡ ¸Â°Ô Plug-in ¿ë ¶óÀ̺귯¸®¸¦ Á¦ÀÛÇØ¾ß¸¸ ÇÒ°ÍÀÌ´Ù.

¿ì¸®°¡ Áö±Ý±îÁö ¾ê·Îµç ÇÁ·Î±×·¥À» º¸¸é ÇöÀç '+', '-' ¿¬»êÀ» Áö¿øÇϰí Àִµ¥, ¸¸¾à 'x', '/' ¿¬»êÀ» Áö¿øÇÏ´Â ¶óÀ̺귯¸®°¡ ¸¸µé¾îÁ³´Ù¸é, ¿ì¸®´Â ÇÁ·Î±×·¥ÀÇ ÄÚµùÀ» ´Ù½ÃÇØ¾ß¸¸ ÇÒ°ÍÀÌ´Ù. À̹ø¿¡´Â µ¿Àû¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇØ¼­ plug-in ¹æ½ÄÀÇ È®ÀåÀÌ °¡´ÉÇϵµ·Ï ÇÁ·Î±×·¥À» ´Ù½Ã ¸¸µé¾î º¸µµ·Ï ÇÒ°ÍÀÌ´Ù.


3.5.1절. µ¿Àû¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇÑ ¿¹Á¦

µ¿Àû¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇØ¼­ main ÇÁ·Î±×·¥ÀÇ ÀçÄÚµù ¾øÀÌ Ãß°¡µÇ´Â »õ·Î¿î ±â´ÉÀ» Ãß°¡½Ã۱â À§Çؼ­´Â ÅëÀÏµÈ ÀÎÅÍÆäÀ̽º¸¦ Áö´Ï´Â ƯÁ¤ÇÑ Çü½ÄÀ» °¡Áöµµ·Ï ¶óÀ̺귯¸®°¡ ÀÛ¼ºµÇ¾î¾ß Çϸç, ¼³Á¤ÆÄÀÏÀ» ÅëÇÏ¿©¼­ ¾î¶² ¶óÀ̺귯¸®°¡ ºÒ¸®¾îÁ®¾ß ÇÏ´ÂÁö¿¡ ´ëÇÑ Á¤º¸¸¦ ÀоîµéÀϼö ÀÖ¾î¾ß ÇÑ´Ù. ±×·¡¼­ ¾î¶² ±â´ÉÀ» Ãß°¡½Ã۰íÀÚ ÇÑ´Ù¸é Æ¯Á¤ Çü½Ä¿¡ ¸Âµµ·Ï ¶óÀ̺귯¸®¸¦ Á¦ÀÛÇϰí, ¼³Á¤ÆÄÀÏÀ» º¯°æÇÏ´Â Á¤µµ·Î ¸¸µé¾îÁø »õ·Î¿î ¶óÀ̺귯¸®ÀÇ ±â´ÉÀ» ÀÌ¿ëÇÒ¼ö ÀÖ¾î¾ß ÇÑ´Ù.

¼³Á¤ÆÄÀÏÀº ´ÙÀ½°ú °°Àº Çü½ÄÀ¸·Î ¸¸µé¾îÁø´Ù. ¼³Á¤ÆÄÀÏÀÇ À̸§Àº plugin.cfg ¶ó°í Á¤Çß´Ù.

+,ysum,libmysum.so
-,ydiff,libmysum.so
				
'-' ¿¬»ê¿¡´ëÇØ¼­´Â libmysum.so ¶óÀ̺귯¸®¸¦ È£ÃâÇϸç, ydiff ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. '=' ¿¬»ê¿¡ ´ëÇØ¼­´Â libmysum.so ¶óÀ̺귯¸®¸¦ È£ÃâÇϰí ysum ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù´Â ¶æÀÌ´Ù. ¼³Á¤ÆÄÀÏÀÇ À̸§Àº plugin.cfg ·Î Çϱâ·Î ÇϰڴÙ.

´ÙÀ½Àº µ¿Àû¶óÀ̺귯¸®·Î ¸¸µé¾îÁø print_sum ÀÇ »õ·Î¿î ¹öÁ¯ÀÌ´Ù.

¿¹Á¦ : print_sum_dl.c

#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
#include <string.h>

struct input_data
{
    char    oper[2];
    char    func[10]; 
    char    lib[30];
};

int main(int argc, char **argv)
{
    char oper[2];
    char left[11];
    char right[11];
    char buf[50];
    char null[1];
    int data_num;

    struct input_data plug_num[10]; 

    void *handle;

    int (*result)(int, int);
    int i;
    char *error;

    FILE *fp;

    // ¼³Á¤ÆÄÀÏÀ» ÀоîµéÀ̰í 
    // ³»¿ëÀ» ±¸Á¶Ã¼¿¡ ÀúÀåÇÑ´Ù. 
    fp = fopen("plugin.cfg", "r");
    data_num = 0;
    while(fgets(buf, 50, fp) != NULL)
    {
        buf[strlen(buf) -1] = '\0';
        sscanf(buf, "%[^,]%[,]%[^,]%[,]%[^,]", plug_num[data_num].oper, 
                                               null,    
                                               plug_num[data_num].func, 
                                               null,
                                               plug_num[data_num].lib);
        data_num ++;
    }
    fclose(fp);

    printf("> ");
    memset(left, 0x00, 11);
    memset(right, 0x00, 11);
    fscanf(stdin, "%[0-9]%[^0-9]%[0-9]", left, oper, right);

    // ¿¬»êÀÚ¸¦ ºñ±³Çؼ­ 
    // Àû´çÇÑ ¶óÀ̺귯¸®¸¦ ºÒ·¯¿Â´Ù. 
    for (i  = 0; i < data_num ; i++)
    {
        int state; 
        if ((state = strcmp(plug_num[i].oper, oper)) == 0) 
        {
            printf("my operator is      : %s\n", plug_num[i].oper);
            printf("my call function is : %s\n", plug_num[i].func);
            break;
        }
    }    

    if (i == data_num)
    {
        printf("--> unknown operator\n");
        exit(0);
    }

    handle = dlopen(plug_num[i].lib, RTLD_NOW);
    if (!handle)
    {
        printf("open error\n");
        fputs(dlerror(), stderr);
        exit(1);
    }

    // ¿¬»êÀÚ¿¡ Àû´çÇÑ ÇÔ¼ö¸¦ ºÒ·¯¿Â´Ù. 
    result = dlsym(handle, plug_num[i].func);
    if ((error = dlerror()) != NULL)
    {
        fputs(error, stderr);
        exit(1);
    }

    printf("%s %s %s = %d\n",left, oper, right, result(atoi(left), atoi(right)) ); 

    dlclose(handle);
}
				
À§ÀÇ ¿¹Á¦ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°ÀÌ ÄÄÆÄÀϵǾî¾ß ÇÑ´Ù. ¶óÀ̺귯¸® ÆÄÀÏÀÇ À§Ä¡´Â /usr/my/lib ¾Æ·¡¿¡ Àִ°ÍÀ¸·Î Çϸç, ¶óÀ̺귯¸® ã±â °æ·Î¿¡ µî·ÏµÇ¾î ÀÖ´Ù°í °¡Á¤ÇϰڴÙ.
[root@localhost test]# gcc -o print_sum_dl print_sum_dl.c -ldl 
				
ÀÌ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¸é »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ±â´Ù¸®´Â "> "°¡ ¶ß°Ô µÇ°í, ¿©±â¿¡ °è»êÇϱ⠿øÇÏ´Â °ªÀ» ÀÔ·ÂÇÏ¸é µÈ´Ù. ÇöÀç´Â '+'¿Í '-' ¿¬»ê¸¸À» Áö¿øÇϸç, ¿¬»êÀÚ¿Í ÇÇ¿¬»êÀÚµé °£¿¡ °£°ÝÀÌ ¾ø¾î¾ß ÇÑ´Ù. ´ÙÀ½Àº ½ÇÇà°á°ú È­¸éÀÌ´Ù.
  
[root@localhost test]# ./print_sum_dl
> 99+99
my operator is      : +
my call function is : ysum
99 + 99 = 198
[root@localhost test]#
				
»ç¿ëÀÚ°¡ ÇÁ·Î±×·¥À» ½ÇÇàÇϸé ÇÁ·Î±×·¥Àº »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ¹Þ¾ÆµéÀ̰í sscanf ¸¦ ÀÌ¿ëÇØ¼­ ¿¬»êÀÚ¿Í ÇÇ¿¬»êÀÚ¸¦ ±¸ºÐÇÏ°Ô µÈ´Ù. ±×¸®°í ÇÇ¿¬»êÀÚ¸¦ °ªÀ¸·Î ÇÏ¿©, ¼³Á¤ÆÄÀÏ¿¡ ¼³Á¤µÈ ¶óÀ̺귯¸®¸¦ ºÒ·¯µéÀ̰í(dlopen) ÇØ´ç ÇÔ¼ö¸¦ °¡Á®¿Í¼­(dlsym) ½ÇÇà½ÃŰ°Ô µÈ´Ù.

ÀÚ ÀÌ·¸°Ô ÇØ¼­ ¿ì¸®´Â '+', '-' ¿¬»êÀÌ °¡´ÉÇÑ ÇÁ·Î±×·¥À» Çϳª ¸¸µé°Ô µÇ¾ú´Ù. ±×·±µ¥ A ¶ó´Â °³¹ßÀÚ°¡ '*','/' ¿¬»êµµ ÀÖÀ¸¸é ÁÁ°Ú´Ù°í »ý°¢Çؼ­ ¾Æ·¡¿Í °°Àº Äڵ带 °¡Áö´Â '*', '/' ¿¬»êÀ» À§ÇÑ ¶óÀ̺귯¸®¸¦ Á¦ÀÛÇÏ¿´´Ù.

¿¹Á¦ : mymulti.h

int multi(int a, int b);
int div(int a, int b);
				
¿¹Á¦ : mymulti.c
int multi(int a, int b)
{
    return a * b;
}

int div(int a, int b)
{
    return a / b;
}
				

A ¶ó´Â °³¹ßÀÚ´Â À̰ÍÀ» ´ÙÀ½°ú °°ÀÌ °øÀ¯¶óÀ̺귯¸® ÇüÅ·Π¸¸µé¾î¼­ °£´ÜÇÑ ¶óÀ̺귯¸®ÀÇ ¼³¸í°ú ÇÔ²² email ·Î Àü¼ÛÇß´Ù.

[root@localhost test]# gcc -c -fPIC mymulti.c
[root@localhost test]# gcc -shared -W1,-soname,libmymulti.so.1 -o libmymulti.so.1.0.1 mymulti.o
				

¶óÀ̺귯¸®¸¦ ¹Þ¾ÒÀ¸¹Ç·Î »õ·Î¿î ¶óÀ̺귯¸®°¡ Á¦´ë·Î ÀÛµ¿À» ÇÏ´ÂÁö È®ÀÎÀ» ÇØº¸µµ·Ï ÇÏÀÚ. ¿ì¼± libmymulti.so.1.0.1 À» /usr/my/lib ·Î º¹»çÇϵµ·Ï ÇÏÀÚ. ±×´ÙÀ½ ¼³Á¤ÆÄÀÏ¿¡ ´ÙÀ½°ú °°Àº ³»¿ëÀ» °¡Áöµµ·Ï º¯°æ ½Ã۵µ·Ï ÇÏÀÚ.

 
+,ysum,libmystuff.so
-,ydiff,libmystuff.so
*,ymulti,libmymulti.so.1.0.1
/,ydiv,libmymulti.so.1.0.1
				
ÀÌÁ¦ print_sum_dl À» ½ÇÇà½ÃÄѺ¸ÀÚ.
[root@localhost test]# ./print_sum_dl
> 10*10
my operator is      : *
my call function is : ymulti
10 * 10 = 100

[root@localhost test]# ./print_sum_dl
> 10/10
my operator is      : /
my call function is : ydiv
10 / 10 = 1
				
print_sum_dl.c ÀÇ ¿øº»ÆÄÀÏÀÇ ¾Æ¹«·± ¼öÁ¤¾øÀÌ ´ÜÁö ¼³Á¤ÆÄÀϸ¸ º¯°æ½ÃÄÑ ÁÜÀ¸·Î½á ±âÁ¸ÀÇ print_sum_dl ¿¡ "°öÇϱâ"¿Í "³ª´©±â"ÀÇ »õ·Î¿î ±â´ÉÀÌ Ãß°¡ µÇ¾ú´Ù.

À§¿¡¼­µµ ¸»ÇßµíÀÌ ÀÌ·¯ÇÑ Plug-in ºñ½ÁÇÑ ±â´ÉÀ» ±¸ÇöÇϱâ À§Çؼ­´Â ÅëÀÏµÈ ÇÔ¼ö API°¡ Á¦°øµÉ¼ö ÀÖ¾î¾ß ÇÑ´Ù.


4절. °á·Ð

¿©±â¿¡ ÀÖ´Â ³»¿ëÁß µ¿Àû¶óÀ̺귯¸®¿¡ ´ëÇÑ ³»¿ëÀº ¼Ö¶ó¸®½º¿Í ¸®´ª½º¿¡¼­¸¸ µ¿ÀÏÇÏ°Ô »ç¿ëÇÒ¼ö ÀÖ´Ù. Hp-Ux ȤÀº À©µµ¿ì¿¡¼­´Â »ç¿ë°¡´ÉÇÏÁö ¾Ê´Â ¹æ¹ýÀÌ´Ù. ÀÌ¿¡ ´ëÇÑ ¸î°¡Áö ÇØ¹ýÀÌ Á¸ÀçÇϴµ¥, ÀÌ ³»¿ëÀº ³ªÁß¿¡ ½Ã°£ÀÌ µÇ¸é ´Ù·çµµ·Ï ÇϰڴÙ. ¾î¶µç ¼Ö¶ó¸®½º¿Í ¸®´ª½º »ó¿¡¼­ ÄÚµùµÇ°í À©µµ¿ì ȤÀº ´Ù¸¥ À¯´Ð½º·Î Æ÷ÆÃµÉ ÇÁ·Î±×·¥ÀÌ ¾Æ´Ï¶ó¸é À§ÀÇ ¹æ¹ýÀ» »ç¿ëÇϴµ¥ À־ ¹®Á¦°¡ ¾øÀ»°ÍÀÌ´Ù.

º¸³½ Æ®·¢¹é Á¤º¸
Shared Library Hijacking
2010-11-26 10:58:00
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.