ÀÖÓãµç¾º


  • ½ÌÓýÐÐÒµA¹ÉIPOµÚÒ»¹É£¨¹ÉƱ´úÂë 003032£©

    È«¹ú×Éѯ/ͶËßÈÈÏߣº400-618-4000

    C++Åàѵ֮LinuxϵͳµäÐÍÎļþ¸ñʽELF

    ¸üÐÂʱ¼ä:2015Äê12ÔÂ28ÈÕ16ʱ59·Ö À´Ô´:ÀÖÓã²¥¿ÍC/C++ѧ¿Æ ä¯ÀÀ´ÎÊý:

     
    ÔÚLinuxϵͳʹÓùý³ÌÖУ¬ÎÒÃǾ­³£»á¿´µ½elf32-i386¡¢ELF 64-bit LSBµÈ×ÖÑù¡£ÄÇô¾¿¾¹ELFÊÇÊ²Ã´ÄØ£¿
    µ±ÎÒÃÇʹÓÃgcc±àÒ빤¾ß±àÒëc³ÌÐò»áµÃµ½Ò»¸ö¶þ½øÖƵÄÎļþ£¬Ï뵱ȻµÄʹÓÃvim±à¼­¹¤¾ß½«Æä´ò¿ª£¬½á¹û¿´µ½ÈçÏÂÄÚÈÝ£º
    µ±È»ÁË£¬´ó²¿·Öͬѧ²»»áÕâÑù×ö¡£Êý¾ÝÊÇÒÔ¶þ½øÖÆÐÎʽ´æ´¢µÄ£¬¶øviÖ»ÊÇÒ»¸öÎı¾±à¼­¹¤¾ß¡£ÄÇôÊý¾Ý¾¿¾¹ÊÇÔõÑù´æ´¢£¬ÒÔʲôÑùµÄ¸ñʽ´æ´¢³É¶þ½øÖÆÎļþÄØ£¿ÊÇÒ»¸öÒ»¸ö°¤×ÅÅÅÂ𣿴Ó×óÏòÓÒ£¬»¹ÊÇ´ÓÓÒÏò×ó£¿Õâ¾ÍÐèÒªÎÒÃÇÉîÈëÁ˽âÏÂELFÎļþÁË¡£
     
             ELFÎļþ¸ñʽÊÇÒ»¸ö¿ª·Å±ê×¼£¬¸÷ÖÖUNIXϵͳµÄ¿ÉÖ´ÐÐÎļþ¶¼²ÉÓÃELF¸ñʽ£¬ËüÓÐÈýÖÖ²»Í¬µÄÀàÐÍ£º
    1. ¿ÉÖØ¶¨Î»µÄÄ¿±êÎļþ£¨Relocatable£¬»òÕßObject File£©
    2. ¿ÉÖ´ÐÐÎļþ£¨Executable£©
    3. ¹²Ïí¿â£¨Shared Object£¬»òÕßShared Library£©
    ´ÓÎÒÃÇ×η¾åµÄhello worldÈëÊÖ°É¡£
    ºÜ³£¼ûµÄ£¬µ±ÎÒÃÇgcc hello.c -o hello ±àÒëÕâ¸öcÔ´³ÌÐòµÄʱºò¾ÍµÃµ½ÁËÒ»¸öELF¸ñʽµÄÎļþ¡£¿ÉÒÔʹÓÃfileÃüÁîÀ´²é¿´¡£Êý¾ÝÏÔʾ£¬¸ÃÎļþÊÇÒ»¸ö64λµÄ£¬Ð¡Î²¶Ë´æ´¢µÄ£¬¿ÉÖ´ÐÐÎļþ¡£
     
     
             ¶øµ±ÎÒÃÇʹÓÃgcc -c hello.c -o hello.o±àÒëÉú³ÉµÄÔòÊÇÒ»¸ö¿ÉÖØ¶¨Î»µÄÄ¿±êÎļþ£¬Ò²¿ÉÒÔʹÓÃfileÃüÁîÀ´²é¿´Ëü¡£
     
             ͬÑù£¬ÎÒÃÇÒ²µÃµ½ÁËÒ»¸öELF¸ñʽµÄÎļþ¡£µ«ÊÇÁ½ÕßÂÔÓв»Í¬£¬Ç°ÕßÊÇExecutable¿ÉÖ´ÐÐÎļþ£¬¶øºóÕßÊÇ¿ÉÖØ¶¨Î»µÄRelocatable¡£Èç¹ûÄã¸ÐÐËȤҲ¿ÉÒÔÊÔÊÔ¹²Ïí¿âÎļþ£¬Æä¸ñʽÒÀÈ»ÊÇELF£¬»òÐí»áÊÇÕâÑùELF 32-bit LSB  shared object¡£
     
             ÄÇôELFÎļþÄÚ²¿ÊÇÔõÑù´æ´¢Êý¾ÝµÄÄØ£¿µ±È»²»ÄÜÔÙʹÓÃviÀ²£¬ÎÒÃÇ¿ÉÒÔʹÓÃreadelf¹¤¾ßÀ´²é¿´Ï£¬ÒÔÄ¿±êÎļþhello.oΪÀý£ºreadelf -a hello.o
     
             Êä³ö½á¹û´óÖ¿ɷÖΪËĸö²¿·Ö£ºELF Header(ELFÍ·)¡¢Section Headers(½ÚÍ·±í)¡¢Relocation section(ÖØ¶¨Î»½Ú)¡¢Symbol table(·ûºÅ±í)£¬ÎÒÃÇÒÀ´ÎÀ´¿´¡£
     
           µÚÒ»²¿·Ö£¬ELF HeaderÃèÊöÕû¸öELFÎļþµÄÊý¾Ý´æ´¢¸Å¿ö£¬Èç²Ù×÷ϵͳÊÇUNIX£¬Ìåϵ½á¹¹ÊÇAdvanced Micro Devices X86-64£¬Êý¾Ý´æ´¢ÊǶþ½øÖƲ¹Â룬Сβ¶Ë·¨´æ´¢£¬ÀàÐÍÊÇ¿ÉÖØ¶¨Î»Îļþ£¬Section Header TableÖÐÓÐ13¸öSection Header£¬´ÓÎļþµØÖ·304¿ªÊ¼£¬Ã¿¸öSection HeaderÕ¼64×Ö½Ú£¬Õâ¸öÄ¿±êÎļþûÓгÌÐòÍ·(Program Header)¡£
     
             µÚ¶þ²¿·Ö£¬°¤×ÅELFÍ·µÄÊý¾ÝÐÅÏ¢ÊÇSection Headers(½ÚÍ·±í)£¬¹ËÃû˼Ò壬ËüÓÉÒ»¶¨ÊýÁ¿µÄSection Header×é³É£¬¿É´ÓÖжÁ³ö¸÷¸öSectionµÄÃèÊöÐÅÏ¢£¬ÆäÖв»·¦ÎÒÃDZàдµÄC³ÌÐòÔ´Â롢ȫ¾Ö±äÁ¿¡¢³£Á¿µÈÊý¾ÝµÄ´æ´¢Î»Öá£.text Section¡¢.data Section¡¢bss Section¡¢.rodata Section¶¼ÓëÎÒÃǵijÌÐòÖ±½ÓÏà¹Ø£¬¶øÆäËüSectionÊÇ»ã±àÆ÷×Ô¶¯Ìí¼ÓµÄ¡£ Address ÊÇÕâЩSection¼ÓÔØµ½ÄÚ´æÖеĵØÖ·£¨µ±È»£¬³ÌÐòÖеĵØÖ·¶¼ÊÇÐéÄâµØÖ·£©£¬¼ÓÔØµØÖ·ÒªÔÚÁ´½ÓʱÌîд£¬ÏÖÔÚ¿Õȱ£¬ÓÉÓÚÄ¿±êÎļþÉÐδ×öÁ´½Ó²Ù×÷£¬ËùÒÔÊÇÈ«0¡£ Offset ºÍ Size ÁÐÖ¸³öÁ˸÷SectionµÄÆðʼÎļþµØÖ·ºÍ³¤¶È¡£±ÈÈç .data ¶Î´ÓÎļþµØÖ·0x55¿ªÊ¼£¬Ò»¹²0¸ö×Ö½Ú£¬ÒòΪ²âÊԵijÌÐòÖÐûÓж¨ÒåÈ«¾Ö±äÁ¿£¬Ö»Ê¹ÓÃprintfº¯Êý´òÓ¡ÁË“hello world…\n”ËùÒÔºóÃæµÄ .rodata Section´óСΪ0xfÒ²¾ÍÊÇ15¸ö×Ö½Ú¡£
     
     
             ÎÒÃÇÖªµÀ£¬CÓïÑÔµÄÈ«¾Ö±äÁ¿Èç¹ûÔÚ´úÂëÖÐûÓгõʼ»¯£¬¾Í»áÔÚ³ÌÐò¼ÓÔØÊ±ÓÃ0³õʼ»¯¡£ÕâÖÖÊý¾ÝÊôÓÚ .bss £¬ÔÚ¼ÓÔØÊ±ËüºÍ .dataÒ»Ñù¶¼ÊǿɶÁ¿ÉдµÄÊý¾Ý£¬µ«ÊÇÔÚELFÎļþÖÐ .dataÖÐÈôÓÐÊý¾ÝÔòÐèÒªÕ¼ÓÃÒ»²¿·Ö¿Õ¼ä±£´æ³õʼֵ£¬¶ø .bssÈ´²»ÐèÒª¡£Ò²¾ÍÊÇ˵£¬.bssÔÚÎļþÖÐÖ»Õ¼Ò»¸öSection Header¶øÃ»ÓжÔÓ¦µÄSection£¬³ÌÐò¼ÓÔØÊ± .bss Õ¼¶à´óÄÚ´æ¿Õ¼äÔÚSection HeaderÖÐÃèÊö¡£ÔÚÎÒÃÇÕâ¸öÀý×ÓÖÐûÓÐÓõ½ .bss £¬Òò´ËsizeÒ²ÊÇ0¡£
     
             ÌØ±ðÖ¸³öµÄÊÇ£¬.shstrtab ºÍ .strtab ÕâÁ½¸öSectionÖдæ·ÅµÄ¶¼ÊÇASCIIÂ룬Òò´Ë£¬ÔÚ±¾ÎÄÆðʼʹÓÃvi´ò¿ªµÄELFÎļþ£¬Èç¹û×Ðϸ¿´£¬ÊÇÄܹ»¿´µ½×Ö·û´®µÄ£¬¶ø²¢·Çͨƪ½ÔÊÇ“^@”µÈ¹ÖÒì×Ö·û¡£.shstrtabµÄÈ«³ÆÓ¦¸ÃÊÇ“Section Header String Table”ÓÃÀ´±£´æ¸÷¸öSectionµÄÃû×Ö¡£.strtab Section±£´æ³ÌÐòÖÐÓõ½µÄ·ûºÅµÄÃû×Ö£¬Ã¿¸öÃû×Ö¶¼ÊÇÒÔ '\0' ½áβµÄ×Ö·û´®¡£
     
             µÚÈý²¿·Ö£¬¿ÉÖØ¶¨Î»½Ú¡£¸ÃÄÚÈÝÖ÷ÒªÕë¶ÔÁ´½ÓÆ÷É趨£¬Ö¼ÔÚ¸æËßÁ´½ÓÆ÷Ö¸ÁîÖеÄÄÄЩµØ·½ÐèÒª×öÖØ¶¨Î»¡£µ±Á´½ÓÆ÷Íê³ÉÁ´½Ó¹¤×÷ºó»á×Ô¶¯½«¸ÃSectionɾ³ý¡£
     
     
             µÚËIJ¿·Ö£¬.symtab ÊÇ·ûºÅ±í¡£ ÎÒÃÇÔÚ±àд³ÌÐòʱ¶¨ÒåµÄ±äÁ¿¡¢º¯Êý¶¼ÊÇ·ûºÅ£¬main¾ÍÊÇ·ûºÅµÄµäÐÍ´ú±í¡£µ±È»ÎªÁ˱£Ö¤³ÌÐòÄÜÕý³£µÄ±àÒë¡¢¼ÓÔØÖ´ÐУ¬±àÒëÆ÷»¹°ïÖúÎÒÃǼÓÈëÁËÆäËûÐí¶à±ØÒªµÄ·ûºÅ¡£ÕâЩ·ûºÅ¶¼ÔÚ.symtabÖÐÓÐËùÌåÏÖ¡£
     
    Ndx ÁÐÊÇÿ¸ö·ûºÅËùÔÚµÄSection±àºÅ£¬¸÷SectionµÄ±àºÅÔÚSection Header TableÖÐÓÐÁгö¡£ Value ÁÐÊÇÿ¸ö·ûºÅËù´ú±íµÄµØÖ·£¬ÔÚÄ¿±êÎļþÖУ¬·ûºÅµØÖ·¶¼ÊÇÏà¶ÔÓڸ÷ûºÅËùÔÚSectionµÄÏà¶ÔµØÖ·£¬È綨ÒåÈ«¾Ö±äÁ¿var£¬ÄÇô¸Ã·ûºÅÔÚ.symtabÖеÄValueÔòÊÇÏà¶ÔÓÚ.data Section¿ªÍ·µÄλÖᣠmain λÓÚ .text ¶ÎµÄ¿ªÍ·£¬ËùÒÔµØÖ·Ò²ÊÇ0¡£µ«ÊÇÉÏÀýÖÐËùÓеÄValue¶¼ÊÇ0²»Ò׿´³ö²îÒ죬ËùÒÔÎÒÃÇÊʵ±µÄÐÞ¸ÄÏÂÎÒÃǵIJâÊÔ³ÌÐò£¬Ìí¼ÓÒ»¸ö³õʼ»¯Îª·Ç0µÄÈ«¾Ö±äÁ¿varºÍÒ»¸öº¯Êýfunc¡£
     
     
             Õâʱ.data SectionµÄSizeÒѾ­²»ÔÙΪ0ÁË£¬ÒòΪÎÒÃǶ¨ÒåÁËÈ«¾Ö±äÁ¿var£¬ËüÊÇÒ»¸öintÀàÐ͵ıäÁ¿£¬´æ´¢ÓÚ.data SectionÉÏ£¬Òò´Ë .data SectionµÄSizeÓ¦¸ÃÊÇ4£¬Çë´ó¼Ò×Ô¼ºÑéÖ¤°É¡£
     
    ÎÒÃǼÌÐøÀ´¿´.symtabµÄ±ä»¯¡£ÓÉÓÚ¼ÓÈëÁËÁ½¸ö·ûºÅvarºÍfunc£¬ËùÒÔ .symtab±íµÄ³ÉÔ±¶àÁËÁ½¸ö¡£varÊÇÈ«¾Ö±äÁ¿£¬´æ´¢ÓÚ.data SectionÖУ¬±àºÅÔÚNdxÖÐÖ¸³ö£¬Îª3£¬ÓÉÓÚÖ»ÓÐÕâÒ»¸öÈ«¾Ö±äÁ¿£¬ËùÒÔvarÔÚµÄValueΪ0£¬Ïà¶ÔÓÚ .data Section¿ªÍ·µÄλÖã»·ûºÅmain·¢ÉúÁ˱仯£¬mainÊǺ¯ÊýÃû£¬±£´æÓÚ.text SectionÖУ¬±àºÅΪ1£¬µ«ÆäValueÈ´²»ÔÙÊÇ0£¬ÓÉÓÚ³ÌÐòÖл¹ÓÐÁíÍâÒ»¸ö·ûºÅfunc£¬ËùÒÔ·ûºÅmainµÄValueÓÉÔ­À´µÄ0±äΪ15£¬ÒÀÈ»ÊÇÏà¶ÔÓÚ.text Section ÆðʼλÖöøÑÔ¡£
     
     
     
             µ«Çë´ó¼Ò×¢Ò⣬Symbol table ‘.symtab’ ÖÐValue¼Ç¼µÄÊÇ·ûºÅ¶ÔÓ¦µÄÖµµÄλÖá£varÊÇÒ»¸ö±äÁ¿£¬ÖµÊÇÊý¾ÝλÓÚ.dataÖУ¬funcºÍmainÊǺ¯Êý£¬¶ÔÓ¦µÄÖµÊǺ¯ÊýÈë¿ÚµØÖ·(»òÕß˵º¯ÊýÊ×ÐÐÖ¸ÁîµÄµØÖ·)£¬Î»ÓÚ.textÖС£¶ø“var”¡¢“func”¡¢“main”ÕâЩ·ûºÅÃû±¾Éí´æÔÚÄÄÀïÄØ£¿ÆäʵÕâ¸öÎÊÌâÎÒÃÇÔÚǰÎIJûÊö¹ý£¬ÕâЩ×Ö·û´®±¾Éí±£´æÔÚ .strtabÖС£ÕâÑùÀ´¿´ .strtabºÍ .shstrtabµÄµØÎ»ÊǵÈͬµÄ£¬²î±ðÊÇǰÕß±£´æ³ÌÐòÖÐÓõ½µÄ·ûºÅ£¬¶øºóÕß±£´æSectionÃû³Æ¡£
     
             Æäʵ£¬ELF¸ñʽÌṩÁËÁ½ÖÖ²»Í¬µÄÊӽǣ¬Á´½ÓÆ÷°ÑELFÎļþ¿´³ÉÊÇSectionµÄ¼¯ºÏ£¬¶ø¼ÓÔØÆ÷°ÑELFÎļþ¿´
    ³ÉÊÇSegmentµÄ¼¯ºÏ¡£ÕâÀïÒÔRelocatable µÄSectionΪÀý´ø´ó¼Ò·ÖÎöÁËELFµÄÊý¾Ý´æ´¢¡£´ó¼Ò¿ÉÒÔ½áºÏ¿ÉÖØ¶¨Î»Relocatable µÄELFÎļþÊý¾Ý´æ´¢µÄÐÎʽÀ´Á˽âExecutable¿ÉÖ´ÐÐÎļþµÄÊý¾Ý´æ´¢ÐÎʽ¡£¶ø¶þÕߵĹØÏµ¿ÉÒÔ´ÓÏÂͼ¿´³ö¡£
             ×ó±ßÊÇ´ÓÁ´½ÓÆ÷µÄÊÓ½ÇÀ´¿´ELFÎļþ£¬¿ªÍ·µÄELF HeaderÃèÊöÁËÌåϵ½á¹¹ºÍ²Ù×÷ϵͳµÈ»ù±¾ÐÅÏ¢£¬²¢Ö¸³öSection Header TableºÍProgram Header TableÔÚÎļþÖеÄλÖã¬Program Header TableÔÚÁ´½Ó¹ý³ÌÖÐÓò»µ½£¬ËùÒÔÊÇ¿ÉÓпÉÎ޵ģ¬Section Header TableÖб£´æÁËËùÓÐSectionµÄÃèÊöÐÅÏ¢£¬Í¨¹ýSection Header Table¿ÉÒÔÕÒµ½Ã¿¸öSectionÔÚÎļþÖеÄλÖá£
     
    ÓÒ±ßÊÇ´Ó¼ÓÔØÆ÷µÄÊÓ½ÇÀ´¿´ELFÎļþ£¬¿ªÍ·ÊÇELF Header£¬Program Header TableÖб£´æÁËËùÓÐSegmentµÄÃèÊöÐÅÏ¢£¬Section Header TableÔÚ¼ÓÔØ¹ý³ÌÖÐÓò»µ½£¬ËùÒÔÊÇ¿ÉÓпÉÎ޵ġ£´ÓÉÏͼ¿ÉÒÔ¿´³ö£¬Ò»¸öSegmentÓÉÒ»¸ö»ò¶à¸öSection×é³É£¬ÕâЩSection¼ÓÔØµ½ÄÚ´æÊ±¾ßÓÐÏàͬµÄ·ÃÎÊȨÏÞ£¬Èç .text Section»áºÍ .rodata SectionºÏ²¢ÎªÒ»¸öSegment£¬Í¬Ê±·ÖÅäÖ»¶Á·ÃÎÊȨÏÞ£¬¶ø.data Sectionͨ³£ºÍ .bss SectionºÏ²¢ÎªÒ»¸öSegment£¬·ÖÅä¶ÁдȨÏÞ¡£
     
    ÓÐЩSectionÖ»¶ÔÁ´½ÓÆ÷ÓÐÒâÒ壬ÔÚÔËÐÐʱÓò»µ½£¬Ò²²»ÐèÒª¼ÓÔØµ½Äڴ棬ÄÇôËü¿ÉÒÔ²»ÊôÓÚÈκÎSegment£¬ Èç .rela.text Section ÔÚExecutableÎļþÖоÍÏûʧÁË¡£ÁíÍ⣬Section Header TableºÍProgram Header Table²¢²»ÊÇÒ»¶¨ÒªÎ»ÓÚÎļþµÄ¿ªÍ·ºÍ½á⣬ÆäλÖÃÓÉELF HeaderÖ¸³ö£¬ÉÏͼÕâô»­Ö»ÊÇΪÁËÇåÎú¡£Ä¿±êÎļþÐèÒªÁ´½ÓÆ÷×ö½øÒ»²½´¦Àí£¬ËùÒÔÒ»¶¨ÓÐSection Header Table£»¿ÉÖ´ÐÐÎļþÐèÒª¼ÓÔØÔËÐУ¬ËùÒÔÒ»¶¨ÓÐProgram Header Table£»¶ø¹²Ïí¿â¼ÈÒª¼ÓÔØÔËÐУ¬ÓÖÒªÔÚ¼ÓÔØÊ±×ö¶¯Ì¬Á´½Ó£¬ËùÒÔ¼ÈÓÐSection Header TableÓÖÓÐProgram Header Table¡£

    ±¾ÎİæÈ¨¹éÀÖÓã²¥¿ÍC++ÅàѵѧԺËùÓУ¬»¶Ó­×ªÔØ£¬×ªÔØÇë×¢Ã÷×÷Õß³ö´¦¡£Ð»Ð»£¡
    ×÷ÕߣºÀÖÓã²¥¿ÍC/C++ÅàѵѧԺ
    Ê×·¢£ºhttp://www.itcast.cn/c/
    0 ·ÖÏíµ½£º
    ºÍÎÒÃÇÔÚÏß½»Ì¸£¡
    ¡¾ÍøÕ¾µØÍ¼¡¿¡¾sitemap¡¿