ºìÁªLinuxÃÅ»§
Linux°ïÖú

LinuxϵÄELFÎļþ¸ñʽ¼ò½é

·¢²¼Ê±¼ä:2006-10-10 01:41:28À´Ô´:ºìÁª×÷Õß:ztonline
¡¡¡¡1. ¸ÅÊö

¡¡¡¡Executable and linking format(ELF)ÎļþÊÇx86 LinuxϵͳϵÄÒ»ÖÖ³£ÓÃÄ¿±êÎļþ(object file)¸ñʽ£¬ÓÐÈýÖÖÖ÷ÒªÀàÐÍ:

¡¡¡¡(1)ÊÊÓÚÁ¬½ÓµÄ¿ÉÖØ¶¨Î»Îļþ(relocatable file)£¬¿ÉÓëÆäËüÄ¿±êÎļþÒ»Æð´´½¨¿ÉÖ´ÐÐÎļþºÍ¹²ÏíÄ¿±êÎļþ¡£
¡¡¡¡(2)ÊÊÓÚÖ´ÐеĿÉÖ´ÐÐÎļþ(executable file)£¬ÓÃÓÚÌṩ³ÌÐòµÄ½ø³ÌÓ³Ïñ£¬¼ÓÔØµÄÄÚ´æÖ´ÐС£
¡¡¡¡(3)¹²ÏíÄ¿±êÎļþ(shared object file),Á¬½ÓÆ÷¿É½«ËüÓëÆäËü¿ÉÖØ¶¨Î»ÎļþºÍ¹²ÏíÄ¿±êÎļþÁ¬½Ó³ÉÆäËüµÄÄ¿±êÎļþ£¬¶¯Ì¬Á¬½ÓÆ÷Óֿɽ«ËüÓë¿ÉÖ´ÐÐÎļþºÍÆäËü¹²ÏíÄ¿±êÎļþ½áºÏÆðÀ´´´½¨Ò»¸ö½ø³ÌÓ³Ïñ¡£

¡¡¡¡ELFÎļþ¸ñʽ±È½Ï¸´ÔÓ£¬±¾ÎÄÖ»ÊǼòÒª½éÉÜËüµÄ½á¹¹£¬Ï£ÍûÄܸøÏëÁ˽âELFÎļþ½á¹¹µÄ¶ÁÕßÒÔ°ïÖú¡£¾ßÌåÏ꾡µÄ×ÊÁÏÇë²ÎÔÄרÃŵÄELFÎĵµ¡£

¡¡¡¡2. Îļþ¸ñʽ

¡¡¡¡ÎªÁË·½±ãºÍ¸ßЧ£¬ELFÎļþÄÚÈÝÓÐÁ½¸öƽÐеÄÊÓ½Ç:Ò»¸öÊdzÌÐòÁ¬½Ó½Ç¶È£¬ÁíÒ»¸öÊdzÌÐòÔËÐнǶȣ¬Èçͼ1Ëùʾ¡£

¡¡¡¡ELF headerÔÚÎļþ¿ªÊ¼´¦ÃèÊöÁËÕû¸öÎļþµÄ×éÖ¯£¬SectionÌṩÁËÄ¿±êÎļþµÄ¸÷ÏîÐÅÏ¢£¨ÈçÖ¸Áî¡¢Êý¾Ý¡¢·ûºÅ±í¡¢Öض¨Î»ÐÅÏ¢µÈ£©£¬Program header tableÖ¸³öÔõÑù´´½¨½ø³ÌÓ³Ïñ£¬º¬ÓÐÿ¸öprogram headerµÄÈë¿Ú£¬Section header table°üº¬Ã¿Ò»¸ösectionµÄÈë¿Ú£¬¸ø³öÃû×Ö¡¢´óСµÈÐÅÏ¢¡£

[align=center]
ͼ1[/align]

¡¡¡¡3. Êý¾Ý±íʾ

¡¡¡¡ELFÊý¾Ý±àÂë˳ÐòÓë»úÆ÷Ïà¹Ø£¬Êý¾ÝÀàÐÍÓÐÁùÖÖ£¬¼û±í1¡£

[align=center][/align]

¡¡¡¡4. ELFÎļþÍ·

¡¡¡¡Ïóbmp¡¢exeµÈÎļþÒ»Ñù£¬ELFµÄÎļþÍ·°üº¬Õû¸öÎļþµÄ¿ØÖƽṹ¡£ËüµÄ¶¨ÒåÈçÏ£º

[code]#define EI_NIDENT 16
typedef struct{
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type;
Elf32_Half e_machine;
Elf32_Word e_version;
Elf32_Addr e_entry;
Elf32_Off e_phoff;
Elf32_Off e_shoff;
Elf32_Word e_flags;
Elf32_Half e_ehsize;
Elf32_Half e_phentsize;
Elf32_Half e_phnum;
Elf32_Half e_shentsize;
Elf32_Half e_shnum;
Elf32_Half e_shstrndx;
}Elf32_Ehdr;[/code]

¡¡¡¡ÆäÖÐE_identµÄ16¸ö×Ö½Ú±êÃ÷ÊǸöELFÎļþ£¨7F+'E'+'L'+'F' +class +data+version+pad£©¡£E_type±íʾÎļþÀàÐÍ£¬2±íʾ¿ÉÖ´ÐÐÎļþ¡£E_machine˵Ã÷»úÆ÷Àà±ð£¬3±íʾ386»úÆ÷£¬8±íʾ MIPS»úÆ÷¡£E_entry¸ø³ö½ø³Ì¿ªÊ¼µÄÐ鵨ַ£¬¼´ÏµÍ³½«¿ØÖÆ×ªÒƵÄλÖá£E_phoffÖ¸³öprogram header tableµÄÎļþÆ«ÒÆ£¬e_phentsize±íʾһ¸öprogram header±íÖеÄÈë¿ÚµÄ³¤¶È£¨×Ö½ÚÊý±íʾ£©£¬e_phnum¸ø³öprogram header±íÖеÄÈë¿ÚÊýÄ¿¡£ÀàËÆµÄ£¬e_shoff£¬e_shentsize£¬e_shnum ·Ö±ð±íʾsection header±íµÄÎļþÆ«ÒÆ£¬±íÖÐÿ¸öÈë¿ÚµÄµÄ×Ö½ÚÊýºÍÈë¿ÚÊýÄ¿¡£E_flags¸ø³öÓë´¦ÀíÆ÷Ïà¹ØµÄ±êÖ¾£¬e_ehsize¸ø³öELFÎļþÍ·µÄ³¤¶È£¨×Ö½ÚÊý±íʾ£©¡£E_shstrndx±íʾsectionÃû±íµÄλÖã¬Ö¸³öÔÚsection header±íÖеÄË÷Òý¡£

¡¡¡¡ÏÂÃæÓиöelfÎļþÍ·µÄÀý×Ó£¬¿ÉÒÔ¶ÔÕÕÀí½â£¬¼ûͼ2¡£

[align=center]
ͼ2[/align]

5. section header

¡¡¡¡Ä¿±êÎļþµÄsection header table¿ÉÒÔ¶¨Î»ËùÓеÄsection£¬ËüÊÇÒ»¸öElf32_Shdr½á¹¹µÄÊý×飬SectionÍ·±íµÄË÷ÒýÊÇÕâ¸öÊý×éµÄϱꡣÓÐЩË÷ÒýºÅÊDZ£ÁôµÄ£¬Ä¿±êÎļþ²»ÄÜʹÓÃÕâÐ©ÌØÊâµÄË÷Òý¡£

¡¡¡¡Section°üº¬Ä¿±êÎļþ³ýÁËELFÎļþÍ·¡¢³ÌÐòÍ·±í¡¢sectionÍ·±íµÄËùÓÐÐÅÏ¢£¬¶øÇÒÄ¿±êÎļþsectionÂú×㼸¸öÌõ¼þ:

¡¡¡¡(1)Ä¿±êÎļþÖеÄÿ¸ösection¶¼Ö»ÓÐÒ»¸ösectionÍ·ÏîÃèÊö£¬¿ÉÒÔ´æÔÚ²»Ö¸Ê¾ÈκÎsectionµÄsectionÍ·Ïî¡£
¡¡¡¡(2)ÿ¸ösectionÔÚÎļþÖÐÕ¼¾ÝÒ»¿éÁ¬ÐøµÄ¿Õ¼ä¡£
¡¡¡¡(3)SectionÖ®¼ä²»¿ÉÖØµþ¡£
¡¡¡¡(4)Ä¿±êÎļþ¿ÉÒÔÓзǻ¿Õ¼ä£¬¸÷ÖÖheadersºÍsectionsûÓи²¸ÇÄ¿±êÎļþµÄÿһ¸ö×Ö½Ú£¬ÕâЩ·Ç»î¶¯¿Õ¼äÊÇûÓж¨ÒåµÄ¡£

¡¡¡¡Section header½á¹¹¶¨ÒåÈçÏ£º

[code]typedef struct{
Elf32_Word sh_name;
Elf32_Word sh_type;
Elf32_Word sh_flags;
Elf32_Addr sh_addr;
Elf32_Off sh_offset;
Elf32_Word sh_size;
Elf32_Word sh_link;
Elf32_Word sh_info;
Elf32_Word sh_addralign;
Elf32_Word sh_entsize;
}Elf32_Shdr;[/code]

¡¡¡¡ÆäÖÐsh_nameÖ¸³ösectionµÄÃû×Ö£¬ËüµÄÖµÊǺóÃæ½«»á½²µ½µÄ section header string tableÖеÄË÷Òý£¬Ö¸³öÒ»¸öÒÔnull½áβµÄ×Ö·û´®¡£Sh_typeÊÇÀà±ð£¬sh_flagsָʾ¸ÃsectionÔÚ½ø³ÌÖ´ÐÐʱµÄÌØÐÔ¡£Sh_addr Ö¸³öÈô´ËsectionÔÚ½ø³ÌµÄÄÚ´æÓ³ÏñÖгöÏÖ£¬Ôò¸ø³ö¿ªÊ¼µÄÐ鵨ַ¡£Sh_offset¸ø³ö´ËsectionÔÚÎļþÖÐµÄÆ«ÒÆ¡£ÆäËü×ֶεÄÒâÒ岻̫³£Óã¬Ôڴ˲»Ï¸Êö¡£

¡¡¡¡ÎļþµÄsectionº¬ÓгÌÐòºÍ¿ØÖÆÐÅÏ¢£¬ÏµÍ³Ê¹ÓÃÒ»Ð©ÌØ¶¨µÄsection£¬²¢ÓÐÆä¹Ì¶¨µÄÀàÐͺÍÊôÐÔ£¨ÓÉsh_typeºÍsh_infoÖ¸³ö£©¡£ÏÂÃæ½éÉܼ¸¸ö³£Óõ½µÄsection:¡°.bss¡±¶Îº¬ÓÐÕ¼¾Ý³ÌÐòÄÚ´æÓ³ÏñµÄδ³õʼ»¯Êý¾Ý£¬µ±³ÌÐò¿ªÊ¼ÔËÐÐʱϵͳ¶ÔÕâ¶ÎÊý¾Ý³õʼΪÁ㣬µ«Õâ¸ösection²¢²»Õ¼Îļþ¿Õ¼ä¡£¡°.data.¡±ºÍ¡°data1¡±¶Î°üº¬Õ¼¾ÝÄÚ´æÓ³ÏñµÄ³õʼ»¯Êý¾Ý¡£ ¡°.rodata¡±ºÍ¡°.rodata1¡±¶Îº¬³ÌÐòÓ³ÏñÖеÄÖ»¶ÁÊý¾Ý¡£¡°.shstrtab¡±¶Îº¬ÓÐÿ¸ösectionµÄÃû×Ö£¬ÓÉsectionÈë¿Ú½á¹¹ÖеÄsh_nameË÷Òý¡£¡°.strtab¡±¶Îº¬Óбíʾ·ûºÅ±í(symbol table)Ãû×ÖµÄ×Ö·û´®¡£¡°.symtab¡±¶Îº¬ÓÐÎļþµÄ·ûºÅ±í£¬ÔÚºóÎÄרÃŽéÉÜ¡£¡°.text¡±¶Î°üº¬³ÌÐòµÄ¿ÉÖ´ÐÐÖ¸Áî¡£

¡¡¡¡6. symbol table

¡¡¡¡Ä¿±êÎļþµÄ·ûºÅ±í°üº¬¶¨Î»»òÖØ¶¨Î»³ÌÐò·ûºÅ¶¨ÒåºÍÒýÓÃʱËùÐèÒªµÄÐÅÏ¢¡£·ûºÅ±íÈë¿Ú½á¹¹¶¨ÒåÈçÏÂ:

[code]typedef struct{
Elf32_Word st_name;
Elf32_Addr st_value;
Elf32_Word st_size;
Unsigned char st_info;
Unsigned char st_other;
Elf32_Half st_shndx;
}Elf32_Sym;[/code]

¡¡¡¡ÆäÖÐst_name°üº¬Ö¸Ïò·ûºÅ±í×Ö·û´®±í(strtab)ÖеÄË÷Òý£¬´Ó¶ø¿ÉÒÔ»ñµÃ·ûºÅÃû¡£St_valueÖ¸³ö·ûºÅµÄÖµ£¬¿ÉÄÜÊÇÒ»¸ö¾ø¶ÔÖµ¡¢µØÖ·µÈ¡£St_sizeÖ¸³ö·ûºÅÏà¹ØµÄÄÚ´æ´óС£¬±ÈÈçÒ»¸öÊý¾Ý½á¹¹°üº¬µÄ×Ö½ÚÊýµÈ¡£ St_info¹æ¶¨ÁË·ûºÅµÄÀàÐͺͰó¶¨ÊôÐÔ£¬Ö¸³öÕâ¸ö·ûºÅÊÇÒ»¸öÊý¾ÝÃû¡¢º¯ÊýÃû¡¢sectionÃû»¹ÊÇÔ´ÎļþÃû£»²¢ÇÒÖ¸³ö¸Ã·ûºÅµÄ°ó¶¨ÊôÐÔÊÇlocal¡¢ global»¹ÊÇweak¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ