´«Í³ÉÏ£¬¶¯Ì¬Á´½Ó¿â£¨DLL£©ÕâÒ»¸ÅÄî¸ü¶àµØÓëWindows²Ù×÷ϵͳÁªÏµÔÚÒ»Æð£¬ËüÔÊÐí³ÌÐòÔÚÔËÐÐʱ¼ÓÔØºÍÖ´ÐдúÂëÄ£¿é£¬´Ó¶øÌá¸ßÁË´úÂëµÄ¸´ÓÃÐÔºÍÄ£¿é»¯³Ì¶È
È»¶ø£¬Ëæ×ż¼ÊõµÄ²»¶Ï½ø²½ºÍ¿ªÔ´ÉçÇøµÄÅ·¢Õ¹£¬LinuxϵͳҲ·¢Õ¹³öÁËÒ»Ì×Ç¿´óµÄ»úÖÆÀ´Ö§³ÖÀàËÆµÄ¹¦ÄÜ£¬¼´Í¨¹ý¹²Ïí¶ÔÏó£¨Shared Objects£¬¼ò³Æ.soÎļþ£©ÊµÏÖ¶¯Ì¬Á´½Ó
¾¡¹ÜÊõÓïÓÐËù²»Í¬£¬µ«ËüÃÇÔÚºËÐÄÀíÄîÉÏÒìÇúͬ¹¤£¬¶¼Ö¼ÔÚÌáÉýÈí¼þµÄÁé»îÐÔºÍЧÂÊ
±¾ÎĽ«ÉîÈë̽ÌÖLinuxϵġ°DLL¿Ø¼þ¡±£¨ÒÔ¹²Ïí¶ÔÏóµÄÐÎʽ´æÔÚ£©µÄÓ¦Óá¢ÓÅÊÆÒÔ¼°ÈçºÎÔÚLinux»·¾³ÖиßЧÀûÓÃËüÃÇ£¬ÒÔÕ¹ÏÖÆäÇ¿´óµÄ˵·þÁ¦ºÍʵ¼ù¼ÛÖµ
Ò»¡¢Linux¹²Ïí¶ÔÏóµÄ»ùʯ£ºELF¸ñʽÓ붯̬Á´½ÓÆ÷ LinuxÏµĹ²Ïí¶ÔÏóÎļþ»ùÓÚ¿ÉÖ´ÐÐÓë¿ÉÁ´½Ó¸ñʽ£¨Executable and Linkable Format£¬ELF£©
ELFÊÇÒ»ÖÖ±ê×¼µÄÎļþ¸ñʽ£¬ÓÃÓÚ¶¨Òå³ÌÐòºÍÆäËû¿ÉÖ´ÐдúÂëµÄ½á¹¹£¬ËüÖ§³Ö¾²Ì¬Á´½ÓºÍ¶¯Ì¬Á´½ÓÁ½ÖÖ·½Ê½
¶¯Ì¬Á´½ÓµÄºËÐÄÔÚÓÚ£¬ËüÔÊÐí³ÌÐòÔÚÔËÐÐʱ¶ø·Ç±àÒëʱÁ´½Óµ½ËùÐèµÄ¿â£¬ÕâÒâζ×ÅÖ»Óе±³ÌÐòʵ¼ÊÖ´Ðе½ÐèҪij¸ö¿âº¯Êýʱ£¬¸Ã¿â²Å»á±»¼ÓÔØµ½ÄÚ´æÖÐ
ÕâÒ»ÌØÐÔ¼«´óµØ¼õÉÙÁËÄÚ´æÕ¼Óã¬ÒòΪ¶à¸ö³ÌÐò¿ÉÒÔ¹²Ïíͬһ¸ö¿âÎļþµÄ¸±±¾
ʵÏÖÕâÒ»»úÖÆµÄ¹Ø¼ü½ÇÉ«ÊǶ¯Ì¬Á´½ÓÆ÷£¨Dynamic Linker/Loader£©
ÔÚLinuxÖУ¬glibc£¨GNU C Library£©ÌṩµÄ`ld.so`£¨»ò`ld-linux.so`£©¸ºÔðÕâÒ»ÈÎÎñ
µ±³ÌÐòÆô¶¯Ê±£¬¶¯Ì¬Á´½ÓÆ÷»á¼ì²é³ÌÐòµÄÒÀÀµ¹ØÏµ£¬¼ÓÔØËùÓбØÐèµÄ¹²Ïí¿â£¬²¢´¦Àí·ûºÅ½âÎöºÍÖØ¶¨Î»£¬È·±£³ÌÐòÄܹ»ÕýÈ··ÃÎÊÕâЩ¿âÖеĺ¯ÊýºÍÊý¾Ý
¶þ¡¢Linux DLL¿Ø¼þ£¨¹²Ïí¶ÔÏ󣩵ÄÓÅÊÆ 1.×ÊÔ´¹²Ïí£º¶à¸ö½ø³Ì¿ÉÒÔ¹²Ïíͬһ¸ö¹²Ïí¶ÔÏóÎļþ£¬ÏÔÖø¼õÉÙÄÚ´æºÍ´ÅÅ̿ռäµÄʹÓÃ
Õâ¶ÔÓÚ×ÊÔ´ÊÜÏ޵Ļ·¾³ÓÈÎªÖØÒª
2.Ä£¿é»¯Óë¿Éά»¤ÐÔ£ºÍ¨¹ý½«´úÂë²ð·Ö³É¶à¸ö¹²Ïí¶ÔÏ󣬿ª·¢Õß¿ÉÒÔ¸üÈÝÒ׵عÜÀíºÍ¸üÐÂÈí¼þ×é¼þ£¬¶øÎÞÐèÖØÐ±àÒëÕû¸ö³ÌÐò
3.ÐÔÄÜÓÅ»¯£º¶¯Ì¬Á´½ÓÔÊÐí¿âÔÚÐèҪʱ¼ÓÔØ£¬¼õÉÙÁ˳ÌÐòÆô¶¯Ê±µÄÄÚ´æÕ¼ÓúͼÓÔØÊ±¼ä
ͬʱ£¬ÓÉÓÚ¿â¿ÉÒÔ¶ÀÁ¢¸üУ¬Óû§ÎÞÐèΪÿ´Î¿â¸üжøÖØÐ°²×°Õû¸öÓ¦ÓóÌÐò
4.¿çƽ̨¼æÈÝÐÔ£¨Ïà¶ÔÐÔ£©£ºËäÈ»LinuxÓëWindowsÔÚDLL/¹²Ïí¶ÔÏóµÄ¾ßÌåʵÏÖÉÏÓÐËù²»Í¬£¬µ«Í¨¹ý³éÏó²ãºÍ¼æÈݿ⣨ÈçWine¡¢CygwinµÈ£©£¬¿ÉÒÔÔÚÒ»¶¨³Ì¶ÈÉÏʵÏÖ¿çÆ½Ì¨´úÂ븴ÓÃ
5.°²È«ÐÔ£º¶¯Ì¬Á´½ÓÆ÷¿ÉÒÔʵʩ¶îÍâµÄ°²È«¼ì²é£¬ÈçµØÖ·¿Õ¼ä²¼¾ÖËæ»ú»¯£¨ASLR£©£¬ÔöÇ¿³ÌÐòµÄ°²È«ÐÔ
Èý¡¢LinuxÏ´´½¨ÓëʹÓù²Ïí¶ÔÏó ´´½¨Linux¹²Ïí¶ÔÏóµÄ¹ý³ÌÖ÷Òª°üÀ¨±àдԴ´úÂë¡¢±àÒëΪ¶ÔÏóÎļþ£¨.o£©£¬È»ºóÁ´½ÓΪ¹²Ïí¶ÔÏó£¨.so£©
ÒÔÏÂÊÇÒ»¸ö¼òµ¥µÄʾÀý£º
1.±àдԴ´úÂ룺
c
// mylib.c
include
3.Á´½ÓΪ¹²Ïí¶ÔÏó£º
bash
gcc -shared -o libmylib.so mylib.o
4.ʹÓù²Ïí¶ÔÏó£º
c
// main.c
include