diff options
Diffstat (limited to 'src/format/elf')
| -rw-r--r-- | src/format/elf/elf_def.h | 23 | ||||
| -rw-r--r-- | src/format/elf/symbols.c | 171 | 
2 files changed, 187 insertions, 7 deletions
| diff --git a/src/format/elf/elf_def.h b/src/format/elf/elf_def.h index 91e1c18..f863257 100644 --- a/src/format/elf/elf_def.h +++ b/src/format/elf/elf_def.h @@ -408,10 +408,25 @@ typedef union _elf_shdr  /* Valeurs possibles pour sh_flags */ -#define SHF_WRITE       (1 << 0)            /* Accessible en écriture      */ -#define SHF_ALLOC       (1 << 1)            /* Copie en mémoire pdt l'exec.*/ -#define SHF_EXECINSTR   (1 << 2)            /* Section exécutable          */ -#define SHF_STRINGS     (1 << 5)            /* Contient des chaînes ('\0') */ +#define SHF_WRITE               (1 << 0)    /* Accessible en écriture      */ +#define SHF_ALLOC               (1 << 1)    /* Copie en mémoire pdt l'exec.*/ +#define SHF_EXECINSTR           (1 << 2)    /* Section exécutable          */ +#define SHF_MERGE               (1 << 4)    /* Peut être fusionné          */ +#define SHF_STRINGS             (1 << 5)    /* Contient des chaînes ('\0') */ +#define SHF_INFO_LINK           (1 << 6)    /* 'sh_info' contient un index */ +#define SHF_LINK_ORDER          (1 << 7)    /* Préservation de l'ordre     */ +#define SHF_OS_NONCONFORMING    (1 << 8)    /* Gestion non standard requise*/ +#define SHF_GROUP               (1 << 9)    /* Section membre d'un groupe  */ +#define SHF_TLS                 (1 << 10)   /* Données pour un thread local*/ + +#define SHF_MASKOS           0x0ff00000 /* OS-specific.  */ +#define SHF_MASKPROC         0xf0000000 /* Processor-specific */ +#define SHF_ORDERED          (1 << 30)  /* Special ordering requirement +                                           (Solaris).  */ +#define SHF_EXCLUDE          (1 << 31)  /* Section is excluded unless +                                           referenced or allocated (Solaris).*/ + + diff --git a/src/format/elf/symbols.c b/src/format/elf/symbols.c index 33a8c3f..dc3fbe0 100644 --- a/src/format/elf/symbols.c +++ b/src/format/elf/symbols.c @@ -912,10 +912,12 @@ static bool annotate_elf_section_header_table(GElfFormat *format)      const bin_t *content;                   /* Contenu binaire à lire      */      off_t length;                           /* Taille totale du contenu    */      off_t offset;                           /* Tête de lecture du bbinaire */ +    elf_shdr strings;                       /* Section des descriptions    */      vmpa2t *pos;                            /* Localisation des symboles   */      uint16_t e_shnum;                       /* Nombre d'éléments 'Program' */      uint16_t i;                             /* Boucle de parcours          */      elf_shdr shdr;                          /* En-tête de programme ELF    */ +    const char *secname;                    /* Nom d'une section analysée  */      ImmOperandDisplay disp;                 /* Afficahge de valeur         */      const char *text;                       /* Texte constant à insérer    */      GArchInstruction *instr;                /* Instruction décodée         */ @@ -928,6 +930,9 @@ static bool annotate_elf_section_header_table(GElfFormat *format)      content = G_BIN_FORMAT(format)->content;      length = G_BIN_FORMAT(format)->length; +    if (!find_elf_section_by_index(format, ELF_HDR(format, format->header, e_shstrndx), &strings)) +        return false; +      offset = ELF_HDR(format, format->header, e_shoff);      pos = make_vmpa(offset, 0x9900); @@ -936,18 +941,30 @@ static bool annotate_elf_section_header_table(GElfFormat *format)      for (i = 0; i < e_shnum; i++)      { -        if (!read_elf_section_header(format, offset, &shdr)) +        if (!read_elf_section_header(format, get_phy_addr(pos), &shdr))              break;          /* Champ "sh_name" */ -        text = _("Section name"); +        secname = extract_name_from_elf_string_section(format, &strings, +                                                       ELF_SHDR(format, shdr, sh_name)); + +        if (secname == NULL) +            dtext = strdup(_("Section name: <invalid>")); +        else +        { +            dtext = strdup(_("Section name: '")); +            dtext = stradd(dtext, secname); +            dtext = stradd(dtext, "'"); +        }          instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian);          SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); -        ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, text); +        ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, dtext); + +        free(dtext);          /* Champ "sh_type" */ @@ -1061,6 +1078,10 @@ static bool annotate_elf_section_header_table(GElfFormat *format)                  disp = IOD_HEX;                  text = _("Section type: application-specific");                  break; +            default: +                disp = IOD_HEX; +                text = _("Section type: unknown"); +                break;          }          instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); @@ -1069,15 +1090,159 @@ static bool annotate_elf_section_header_table(GElfFormat *format)          ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, text); +        /* Champ "sh_flags"... */ +        dtext = strdup(_("Section flags: ")); +        filled = false; + +        if (ELF_SHDR(format, shdr, sh_type) & SHF_WRITE) +        { +            dtext = stradd(dtext, "W"); +            filled = true; +        } +        if (ELF_SHDR(format, shdr, sh_type) & SHF_ALLOC) +        { +            dtext = stradd(dtext, "A"); +            filled = true; +        } +        if (ELF_SHDR(format, shdr, sh_type) & SHF_EXECINSTR) +        { +            dtext = stradd(dtext, "X"); +            filled = true; +        } +        if (ELF_SHDR(format, shdr, sh_type) & SHF_MERGE) +        { +            dtext = stradd(dtext, "M"); +            filled = true; +        } +        if (ELF_SHDR(format, shdr, sh_type) & SHF_LINK_ORDER) +        { +            dtext = stradd(dtext, "L"); +            filled = true; +        } +        if (ELF_SHDR(format, shdr, sh_type) & SHF_TLS) +        { +            dtext = stradd(dtext, "T"); +            filled = true; +        } +        if (!filled) +            dtext = stradd(dtext, _("none")); +        if (format->is_32b) +        { +            /* Champ "sh_flags" (suite) */ +            instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + +            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, dtext); + +            free(dtext); + +            /* Champ "sh_addr" */ + +            instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + +            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section virtual addr at execution")); + +            /* Champ "sh_offset" */ + +            instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + +            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section file offset")); + +            /* Champ "sh_size" */ + +            instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + +            SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + +            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section size in bytes")); + +        } +        else +        { +            /* Champ "sh_flags" (suite) */ + +            instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian); + +            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, dtext); + +            free(dtext); + +            /* Champ "sh_addr" */ + +            instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian); + +            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section virtual addr at execution")); + +            /* Champ "sh_offset" */ + +            instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian); + +            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section file offset")); + +            /* Champ "sh_size" */ + +            instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian); + +            SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + +            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section size in bytes")); + +        } + +        /* Champ "sh_link" */ + +        instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + +        ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Link to another section")); + +        /* Champ "sh_info" */ + +        instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + +        ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Additional section information")); + +        if (format->is_32b) +        { +            /* Champ "sh_addralign" */ + +            instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + +            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section alignment")); + +            /* Champ "sh_entsize" */ + +            instr = g_raw_instruction_new_array(content, MDS_32_BITS, 1, pos, length, format->endian); + +            SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + +            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Entry size if section holds table")); + +        } +        else +        { +            /* Champ "sh_addralign" */ + +            instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian); + +            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Section alignment")); + +            /* Champ "sh_entsize" */ + +            instr = g_raw_instruction_new_array(content, MDS_64_BITS, 1, pos, length, format->endian); + +            SET_IMM_DISPLAY(instr, operand, 0, IOD_DEC); + +            ADD_RAW_AS_SYM(format, symbol, pos, instr, comment, _("Entry size if section holds table")); + +        }      } | 
