À̹ø ¼½¼ÇÀº Áö±Ý ÇöÀç·Î¼± ¾ÆÁÖ ÀûÀº ³»¿ë¸¸À» °¡Áö°í ÀÖ´Ù. ELF ÇÏ¿ìÅõ ¹®¼¸¦ ¹ßÃéÇÔÀ¸·Î½á ±× ³»¿ëÀÌ °è¼ÓÀûÀ¸·Î ´Ã¾î³ª°Ô µÉ °ÍÀÌ´Ù.
¸®´ª½º´Â °øÀ¯ ¶óÀ̺귯¸®¸¦ °¡Áö°í ÀÖ´Ù. ÀÌ ±Û Àüü¸¦ Àд µ¿¾È ÀÌÁ¦´Â ÀÌ·± ¸» µè´Â °Íµµ Áú·ÈÀ» °ÍÀÌ´Ù. ÀüÅëÀûÀ¸·Î ÇÁ·Î±×·¥ ¸µÅ© °úÁ¤¿¡¼ ÇàÇÑ ÀÛ¾÷Àº ·Îµù °úÁ¤¿¡¼ ±× ¹Ý´ë °úÁ¤À» °ÅÃÄ¾ß ÇÑ´Ù.
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ÀÇ °æ¿ìÀÌ´Ù. ÇÁ·Î±×·¥ ÄÄÆÄÀÏÇÑ »ç¶÷º¸´Ù ³·Àº ¸¶ÀÌ³Ê ¹öÀüÀÇ ¶óÀ̺귯¸®¸¦ °®°í Àֱ⠶§¹®¿¡ ¹ß»ýÇÏ´Â °æ°í ¸Þ¼¼ÁöÀÌ´Ù. ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ±â´Â ÇÒ °ÍÀÌ´Ù. ¾÷±×·¹À̵åÇÏ´Â °ÍÀÌ ¾î¶³±î?
¸¹Àº ȯ°æ º¯¼öµéÀÌ µ¿Àû ·Î´õ¿¡ °ü°èÇÑ´Ù. ´ëºÎºÐÀº ÀÏ¹Ý »ç¿ëÀÚº¸´Ù´Â
ldd
¿¡°Ô À¯¿ëÇÏ´Ù. ldd
¿¡ ´Ù¾çÇÑ ½ºÀ§Ä¡¸¦ ÁÜÀ¸·Î½á ½±°Ô ¼¼ÆÃÇÒ ¼ö ÀÖ´Ù.
LD_BIND_NOW
--- ÀϹÝÀûÀ¸·Î ÇÔ¼ö°¡ È£ÃâµÇ±â Àü±îÁö´Â ¶óÀ̺귯¸®¿¡¼
ã¾Æº¸Áö ¾Ê´Â´Ù. ÀÌ Ç÷¡±×¸¦ ¼¼ÆÃÇØÁÖ¸é ¶óÀ̺귯¸® ÀûÀç½Ã¿¡ ¸ðµç üũ¸¦ ÇÏ°Ô
µÇ°í ½ÃÀÛÀº »ó´çÈ÷ ´À¸®°Ô µÈ´Ù. ÀÌ°ÍÀº ¿©·¯ºÐÀÌ ¸¸µç ÇÁ·Î±×·¥ÀÌ ¸ðµç °Íµé°ú
Á¦´ë·Î ¸µÅ©°¡ µÇ¾ú´ÂÁö ½ÃÇèÇغ¼ ¶§ À¯¿ëÇÏ´Ù.
LD_PRELOAD
--- overriding ÇÔ¼ö Á¤ÀǸ¦ °¡Áö°í ÀÖ´Â ÈÀÏ¿¡ ¼¼ÆÃµÉ ¼ö
ÀÖ´Ù. ¿¹¸¦ µé¾î¼ ¸Þ¸ð¸® ÇÒ´ç ¹æ¹ýÀ» Å×½ºÆÃÇÏ·Á°í Çϸç, malloc¸¦ ±³Ã¼ÇÏ·Á°í ÇÒ
¶§´Â ¿©·¯ºÐÀÌ ¿øÇÏ´Â ·çƾÀ¸·Î ¸¸µç ÈÄ¿¡ ±³Ã¼ÇÒ ¼ö°¡ ÀÖ´Ù. malloc.o
¶ó´Â
À̸§À¸·Î ÄÄÆÄÀÏÇÑ ÈÄ ´ÙÀ½°ú °°ÀÌ Çغ¸ÀÚ.
$ LD_PRELOAD=malloc.o; export LD_PRELOAD
$ some_test_program
LD_ELF_PRELOAD
¿Í LD_AOUT_PRELOAD
ÀÌ µÑÀº ºñ½ÁÇÏ´Ù. ÇÏÁö¸¸ °¢°¢ ƯÁ¤
ÇüÅ¿¡¸¸ °ü°èÇÑ´Ù. ¸¸¾à LD_ELF_PRELOAD
¿Í LD_PRELOAD
°¡ µÑ ´Ù
»ç¿ëµÇ¾ú´Ù¸é Á» ´õ ÀÚ¼¼È÷ ÁöÁ¤ÇÑ ÀüÀÚ LD_ELF_PRELOAD
°¡ »ç¿ëµÈ´Ù.
LD_LIBRARY_PATH
--- ÀÌ°ÍÀº °øÀ¯ ¶óÀ̺귯¸®¸¦ ãÀ» ¶§ Âü°íÇÒ
µð·ºÅ丮¸¦ ÄÝ·Ð(:)À» ºÐ¸®ÀÚ·Î ½á¼ Ç¥ÇöÇÑ ¸®½ºÆ®ÀÌ´Ù. ±×°ÍÀº ld¿¡ ¿µÇâÀ» ÁÖÁö´Â
¸øÇÑ´Ù. ´ÜÁö ½ÇÇà½Ã¿¡¸¸ °ü°èÇÑ´Ù. ¶ÇÇÑ setuid³ª setgid¸¦ °®´Â ÇÁ·Î±×·¥¿¡
´ëÇؼ´Â ¹«¿ëÁö¹°ÀÌ´Ù. ¸¶Âù°¡Áö·Î LD_ELF_LIBRARY_PATH
¿Í
LD_AOUT_LIBRARY_PATH
´Â °¢°¢ÀÇ ¹ÙÀ̳ʸ® Çü½Ä¿¡¸¸ Àû¿ëµÇµµ·Ï ÇÏ°í ÀÖ´Ù.
LD_LIBRARY_PATH
´Â Á¤»óÀûÀÎ °æ¿ì ±×·¸°Ô ÇÊ¿äÇÏÁø ¾Ê´Ù. ´ë½Å¿¡
/etc/ld.so.conf/
¿¡ µð·ºÅ丮¸¦ Ãß°¡ÇÏ°í ldconfig¸¦ ´Ù½Ã ÇÑ ¹ø
½ÇÇà½ÃÅ°´Â°Ô ÁÁ´Ù.
LD_NOWARN
--- ÀÌ´Â a.out¿¡¸¸ Àû¿ëµÈ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°ÀÌ
¼¼ÆÃÇϸé LD_NOWARN=true; export LD_NOWARN
) ¸¶ÀÌ³Ê ¹öÀüÀÌ ´Ù¸£´ÙµçÁö ÇÏ´Â,
Å©°Ô ½É°¢ÇÏÁö ¾Ê´Â °æ°í¸¦ Ç¥½ÃÇÏÁö ¾Êµµ·Ï ÇÑ´Ù.
LD_WARN
--- ÀÌ´Â ELF¿¡¸¸ ÇØ´çµÈ´Ù. ¼¼ÆõǸé ÀϹÝÀûÀ¸·Î ``Can't find
library''¿Í °°Àº ½É°¢ÇÑ ¿¡·¯¸¦ °æ°í·Î ¹Ù²Ù¾îÁØ´Ù. º°·Î ÇÊ¿ä¾ø´Â ¿É¼ÇÀÌ´Ù.
LD_TRACE_LOADED_OBJECTS
--- ELF¿¡¸¸ Àû¿ëµÈ´Ù. ÇÁ·Î±×·¥À¸·Î ÇÏ¿©±Ý
ldd
ÇÏ¿¡¼ ½ÇÇàµÇ°í ÀÖ´Ù°í »ý°¢ÇÏ°Ô²û ¸¸µç´Ù.
$ LD_TRACE_LOADED_OBJECTS=true /usr/bin/lynx
libncurses.so.1 => /usr/lib/libncurses.so.1.9.6
libc.so.5 => /lib/libc.so.5.2.18
ÀÌ´Â ¼Ö¶ó¸®½º 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");
}
}