ËüÃDz»½öÊÇLinuxϵͳÏÂÓ¦ÓóÌÐòµÄ±ê×¼¶þ½øÖƸñʽ£¬Ò²ÊDzÙ×÷ϵͳÄںˡ¢¿âÎļþÒÔ¼°¸÷ÖÖ¶¯Ì¬Á´½Ó¶ÔÏóµÄ»ùʯ
Àí½âLinuxÈçºÎÖ´ÐÐELFÎļþ£¬²»½öÄܹ»ÌáÉýÎÒÃǶÔϵͳµ×²ã»úÖÆµÄÈÏʶ£¬»¹ÄÜΪ¸ßЧ¿ª·¢¡¢µ÷ÊÔ¼°ÐÔÄÜÓÅ»¯Ìṩ¼áʵ»ù´¡
±¾ÎĽ«ÉîÈë̽ÌÖLinuxÖ´ÐÐELFÎļþµÄÈ«¹ý³Ì£¬½ÒʾÆä±³ºóµÄ¼¼Êõϸ½ÚÓëʵ¼ùÓ¦ÓÃ
ELFÎļþ½á¹¹¸ÅÀÀ ELFÎļþÊÇÒ»ÖÖ±ê×¼»¯µÄ¶þ½øÖƸñʽ£¬Ö¼ÔÚÈ·±£¿ç²»Í¬Ó²¼þƽ̨ºÍ²Ù×÷ϵͳ°æ±¾µÄ¶þ½øÖƼæÈÝÐÔ
Ò»¸öµäÐ͵ÄELFÎļþÓɶà¸ö²¿·Ö×é³É£¬Ã¿¸ö²¿·Ö¶¼³ÐÔØ×ÅÌØ¶¨µÄÐÅÏ¢»òÊý¾Ý£º 1.ELF Header£ºÎļþµÄÆðʼλÖ㬰üº¬ÁËÎļþµÄħÊý£¨Magic Number£©ÒÔÈ·ÈÏÎļþ¸ñʽ¡¢Ä¿±ê¼Ü¹¹¡¢ÎļþÀàÐÍ£¨¿ÉÖ´ÐС¢¿ÉÖØ¶¨Î»¡¢¹²Ïí¶ÔÏóµÈ£©¡¢Èë¿ÚµãµØÖ·ÒÔ¼°³ÌÐòÍ·±í£¨Program Header Table£©ºÍ½ÚÍ·±í£¨Section Header Table£©µÄÆ«ÒÆÁ¿ºÍ´óС
2.Program Header Table£º¶ÔÓÚ¿ÉÖ´ÐÐÎļþºÍ¹²Ïí¶ÔÏ󣬴˱íÃèÊöÁËÎļþµÄ¼ÓÔØÖ¸Á°üÀ¨¶Î£¨Segment£©µÄÐéÄâµØÖ·¡¢ÎïÀíµØÖ·¡¢ÎļþÆ«ÒÆ¡¢´óС¡¢±êÖ¾£¨Èç¿É¶Á¡¢¿Éд¡¢¿ÉÖ´ÐУ©ÒÔ¼°ËùÐèµÄÄÚ´æ¶ÔÆë
3.Section Header Table£ºÖ÷ÒªÓÃÓÚ¿ÉÖØ¶¨Î»ÎļþºÍ¶ÔÏóÎļþ£¬ÃèÊöÁËÎļþµÄ¸÷¸ö½Ú£¨Section£©µÄÐÅÏ¢£¬Èç½ÚÃû³Æ¡¢ÀàÐÍ¡¢´óС¡¢Æ«ÒƵȣ¬¶ÔÓÚÁ´½ÓÆ÷¶øÑÔÖÁ¹ØÖØÒª
4.½Ú£¨Sections£©£º°üº¬´úÂ루.text£©¡¢Êý¾Ý£¨.data£©¡¢Î´³õʼ»¯Êý¾Ý£¨.bss£©¡¢µ÷ÊÔÐÅÏ¢£¨.debug_info£©µÈ£¬ÊÇELFÎļþµÄÖ÷ÌåÄÚÈÝ
5.×Ö·û´®±í£¨String Table£©£º´æ´¢½ÚÃû³Æ¡¢·ûºÅÃû³ÆµÈ×Ö·û´®
6.·ûºÅ±í£¨Symbol Table£©£º¼Ç¼³ÌÐòÖÐËùÓзûºÅ£¨±äÁ¿¡¢º¯ÊýµÈ£©µÄÐÅÏ¢£¬°üÀ¨Ãû³Æ¡¢ÀàÐÍ¡¢ÖµµÈ
LinuxÖ´ÐÐELFÎļþµÄ¹ý³Ì µ±Óû§ÔÚLinuxϵͳÉÏÔËÐÐÒ»¸öELFÎļþʱ£¬´Óµã»÷ͼ±ê¡¢ÊäÈëÃüÁîµ½³ÌÐòʵ¼ÊÔËÐУ¬±³ºó¾ÀúÁËһϵÁи´ÔÓ¶ø¾«Ï¸µÄ²½Ö裺 1.Shell½âÎöÃüÁîÐУºÓû§ÊäÈëÃüÁîºó£¬shell£¨Èçbash£©¸ºÔð½âÎöÃüÁîÐвÎÊý£¬È·¶¨ÒªÖ´ÐеÄELFÎļþ·¾¶
2.¼ÓÔØÆ÷£¨Loader£©½éÈ룺LinuxʹÓö¯Ì¬Á´½ÓÆ÷£¨Èçld-linux.so»òld-linux-x86-64.so.2£©×÷ΪĬÈϵÄELFÎļþ¼ÓÔØÆ÷
µ±ÏµÍ³Ê¶±ðµ½ÒªÖ´ÐеÄÊÇÒ»¸öELFÎļþʱ£¬»áµ÷Óö¯Ì¬Á´½ÓÆ÷
3.¶ÁÈ¡ELF Header£º¶¯Ì¬Á´½ÓÆ÷Ê×ÏȶÁÈ¡ELF Header£¬ÑéÖ¤Îļþ¸ñʽ£¬²¢È·¶¨ÎļþµÄÀàÐÍ¡¢¼Ü¹¹ºÍÈë¿Úµã
4.´¦ÀíProgram Header Table£º»ùÓÚProgram Header Table£¬¶¯Ì¬Á´½ÓÆ÷ΪÎļþÖеÄÿ¸ö¶Î·ÖÅäÄÚ´æ¿Õ¼ä£¬²¢½«ÎļþÄÚÈÝÓ³Éäµ½ÏàÓ¦µÄÄÚ´æÇøÓò
Õâ°üÀ¨´úÂë¶Î¡¢Êý¾Ý¶Î¡¢BSS¶ÎµÈ
5.ÖØ¶¨Î»£¨Relocation£©£º¶ÔÓÚÐèÒª¶¯Ì¬Á´½ÓµÄELFÎļþ£¬¶¯Ì¬Á´½ÓÆ÷»á½âÎö·ûºÅ±í£¬²éÕÒ²¢°ó¶¨Íⲿ¿âÖеķûºÅµØÖ·£¬Íê³ÉÖØ¶¨Î»¹ý³Ì£¬È·±£ËùÓзûºÅ¶¼ÄÜÕýÈ·ÒýÓÃ
6.³õʼ»¯£ºÖ´ÐÐELFÎļþÖеÄ.init¶Î£¨Èç¹û´æÔÚ£©£¬ÕâÊÇÓû§¶¨ÒåµÄ³õʼ»¯´úÂ룬ÓÃÓÚÖ´ÐгÌÐòÆô¶¯Ç°µÄ×¼±¸¹¤×÷
7.µ÷ÓÃÈë¿Úµã£º×îºó£¬¶¯Ì¬Á´½ÓÆ÷½«¿ØÖÆÈ¨½»¸øELFÎļþµÄÈë¿Úµã£¨ÓÉELF HeaderÖ¸¶¨£©£¬Í¨³£ÊdzÌÐòµÄmainº¯Êý»ò_startº¯Êý£¨¶ÔÓÚC/C++³ÌÐò£¬mainº¯Êý֮ǰµÄÆô¶¯´úÂë»áµ÷ÓÃ_start£©
8.³ÌÐòÔËÐÐÓëÍ˳ö£º³ÌÐò¿ªÊ¼Ö´ÐÐÆäÖ÷Âß¼£¬Ö±µ½Óöµ½exitµ÷Óûò·µ»Ømainº¯ÊýµÄ·µ»ØÖµ£¬ÏµÍ³»ØÊÕ·ÖÅ䏸³ÌÐòµÄ×ÊÔ´£¬³ÌÐò½áÊø
ELFÎļþÖ´ÐÐÖеĹؼü¼¼ÊõÓëÓÅ»¯ 1.µØÖ·¿Õ¼ä²¼¾ÖËæ»ú»¯£¨ASLR£©£ºÎªÁËÌá¸ßϵͳµÄ°²È«ÐÔ£¬LinuxʵÏÖÁËASLR£¬Ê¹µÃÿ´Î³ÌÐòÆô¶¯Ê±£¬Æä¼ÓÔØµÄÄÚ´æµØÖ·¶¼²»Í¬£¬Ôö¼ÓÁ˹¥»÷ÕßÀûÓûº³åÇøÒç³öµÈ©¶´µÄÄѶÈ
2.ÀÁ¼ÓÔØ£¨Lazy Loading£©£º¶¯Ì¬Á´½ÓÆ÷Ö§³ÖÀÁ¼ÓÔØ¼¼Êõ£¬¼´½öÔÚ³ÌÐòʵ¼Ê·ÃÎÊij¸ö¿âº¯Êý»ò±äÁ¿Ê±²Å½«Æä¼ÓÔØµ½Äڴ棬¼õÉÙÁ˳ÌÐòÆô¶¯Ê±µÄÄÚ´æÕ¼ÓúͼÓÔØÊ±¼ä
3.ELF½âÊÍÆ÷Óë½Å±¾£ºÍ¨¹ýÖ¸¶¨½âÊÍÆ÷£¨Èç# !/bin/sh£©ºÍ±àдELF½Å±¾£¬ELFÎļþ¿ÉÒÔ±»Éè¼ÆÎª×Ô½âÊͽű¾£¬ÔöÇ¿ÁËÁé»îÐÔ
4.ÐÔÄÜ·ÖÎö¹¤¾ß£ºÀûÓÃÈçgdb¡¢strace¡¢perfµÈ¹¤¾ß£¬¿ª·¢Õß¿ÉÒÔÉîÈë·ÖÎöELFÎļþµÄÖ´Ðйý³Ì£¬¶¨Î»ÐÔÄÜÆ¿¾±£¬½øÐдúÂëÓÅ»¯
5.ELF½Ù³ÖÓë·À»¤£ºÁ˽âELFÎļþµÄÖ´ÐлúÖÆ¶ÔÓÚ°²È«Ñо¿ÈËÔ±ÖÁ¹ØÖØÒª£¬¿ÉÒÔ°ïÖúËûÃÇ·¢ÏÖ²¢ÀûÓÃϵͳ©¶´£¬Í¬Ê±Ò²´Ùʹ¿ª·¢Õß²ÉÈ¡¸ü¼ÓÑÏÃܵķÀ»¤´ëÊ©£¬ÈçÇ¿»¯È¨ÏÞ¹ÜÀí¡¢ÊµÊ©´úÂëÇ©ÃûµÈ
½áÓï ELFÎļþ×÷ΪLinuxϵͳµÄºËÐÄ×é³É²¿·Ö£¬ÆäÖ´ÐлúÖÆ²»½öÊǼÆËã»ú¿ÆÑ§ÁìÓòµÄ»ù´¡ÖªÊ¶£¬Ò²ÊÇÈí¼þ¿ª·¢¡¢ÏµÍ³ÔËά¡¢°²È«Ñо¿µÈ¶à¸öÁìÓòµÄ±Ø±¸¼¼ÄÜ
ͨ¹ýÉîÈëÀí½âELFÎļþµÄ½á¹¹¡¢Ö´ÐÐÁ÷³ÌÒÔ¼°Ïà¹ØµÄÓÅ»¯Ó밲ȫ¼¼Êõ£¬ÎÒÃÇ¿ÉÒÔ¸ü¼Ó¸ßЧµØ¿ª·¢Èí¼þ¡¢ÓÅ»¯ÏµÍ³ÐÔÄÜ¡¢±£ÕÏϵͳ°²È«
Ëæ×ż¼ÊõµÄ²»¶Ï½ø²½£¬ELFÎļþ¸ñʽ¼°ÆäÖ´ÐлúÖÆÒ²ÔÚ²»¶ÏÑݽø£¬³ÖÐøÑ§Ï°ºÍ̽Ë÷ÕâÒ»ÁìÓò£¬½«ÎªÎÒÃǵļ¼Êõ³É³¤ºÍÖ°Òµ·¢Õ¹¿ª±Ù¸ü¹ãÀ«µÄ¿Õ¼ä