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

7. µ¿Àû ·Îµù(Dynamic Loading)

À̹ø ¼½¼ÇÀº Áö±Ý ÇöÀç·Î¼± ¾ÆÁÖ ÀûÀº ³»¿ë¸¸À» °¡Áö°í ÀÖ´Ù. ELF ÇÏ¿ìÅõ ¹®¼­¸¦ ¹ßÃéÇÔÀ¸·Î½á ±× ³»¿ëÀÌ °è¼ÓÀûÀ¸·Î ´Ã¾î³ª°Ô µÉ °ÍÀÌ´Ù.

7.1 °³³ä Àâ±â

¸®´ª½º´Â °øÀ¯ ¶óÀ̺귯¸®¸¦ °¡Áö°í ÀÖ´Ù. ÀÌ ±Û Àüü¸¦ Àд µ¿¾È ÀÌÁ¦´Â ÀÌ·± ¸» µè´Â °Íµµ Áú·ÈÀ» °ÍÀÌ´Ù. ÀüÅëÀûÀ¸·Î ÇÁ·Î±×·¥ ¸µÅ© °úÁ¤¿¡¼­ ÇàÇÑ ÀÛ¾÷Àº ·Îµù °úÁ¤¿¡¼­ ±× ¹Ý´ë °úÁ¤À» °ÅÃÄ¾ß ÇÑ´Ù.

7.2 ¿¡·¯ ¸Þ¼¼Áö

can't load library: /lib/libxxx.so, Incompatible version

a.out ¿¡¼­¸¸ ÀϾ´Âµ¥, ÀÌ ¸»Àº ¿©·¯ºÐÀÇ ¶óÀ̺귯¸® ¸ÞÀÌÀú ¹öÀüÀÌ Æ²¸®´Ù´Â ¸»ÀÌ´Ù. ´Ù¸¥ ¹öÀüÀ» °¡Áö°í ÀÖ´Ù°í Çؼ­ ´«°¡¸²½ÄÀ¸·Î ½Éº¼¸¯ ¸µÅ©ÇÏ´Â °ÍÀ¸·Î ¾ÈµÈ´Ù. µÈ´Ù ÇÒÁö¶óµµ °á±¹¿£ ¼¼±×ÆúÆ®¸¦ ÀÏÀ¸Å³ °ÍÀÌ´Ù. »õ·Î¿î ¹öÀüÀ» °¡Á®¿À¶ó.ELF¿¡¼­µµ ºñ½ºÇÑ ¸Þ¼¼Áö°¡ ³ª¿Â´Ù.

ftp: can't load library 'libreadline.so.2'

warning using incompatible library version xxx

a.outÀÇ °æ¿ìÀÌ´Ù. ÇÁ·Î±×·¥ ÄÄÆÄÀÏÇÑ »ç¶÷º¸´Ù ³·Àº ¸¶ÀÌ³Ê ¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ °®°í Àֱ⠶§¹®¿¡ ¹ß»ýÇÏ´Â °æ°í ¸Þ¼¼ÁöÀÌ´Ù. ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ±â´Â ÇÒ °ÍÀÌ´Ù. ¾÷±×·¹À̵åÇÏ´Â °ÍÀÌ ¾î¶³±î?

7.3 µ¿Àû ·Î´õÀÇ ÀÛµ¿ Á¦¾îÇϱâ

¸¹Àº ȯ°æ º¯¼öµéÀÌ µ¿Àû ·Î´õ¿¡ °ü°èÇÑ´Ù. ´ëºÎºÐÀº ÀÏ¹Ý »ç¿ëÀÚº¸´Ù´Â ldd¿¡°Ô À¯¿ëÇÏ´Ù. ldd¿¡ ´Ù¾çÇÑ ½ºÀ§Ä¡¸¦ ÁÜÀ¸·Î½á ½±°Ô ¼¼ÆÃÇÒ ¼ö ÀÖ´Ù.

7.4 µ¿Àû ·ÎµùÀ» »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ ¸¸µé±â

ÀÌ´Â ¼Ö¶ó¸®½º 2.xÀÇ µ¿Àû ·Îµù Áö¿øÀÌ ÀÌ·ïÁö´Â ¹æ½Ä°ú ¸Å¿ì Èí»çÇÏ´Ù. H J LuÀÇ ELF ÇÁ·Î±×·¡¹Ö ¹®¼­¿¡ ÀÚ¼¼È÷ ³ª¿Í ÀÖÀ¸¸ç dlopen(3) ¸ÇÆäÀÌÁö¿¡ ¾ÆÁÖ Àß ³ª¿Í ÀÖ´Ù. ¸ÇÆäÀÌÁö´Â ld.so ÆÐÅ°Áö¿¡ µé¾îÀÖ´Ù. ´ÙÀ½ ÇÁ·Î±×·¥À» -ldl ¿É¼ÇÀ» ÁÖ°í ¸µÅ©Ç϶ó.

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

main()
{
  void *libc;
  void (*printf_call)();

  if(libc=dlopen("/lib/libc.so.5",RTLD_LAZY))
  {
    printf_call=dlsym(libc,"printf");
    (*printf_call)("hello, world\n");
  }

}


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