diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/format/elf/elf.c | 31 | 
1 files changed, 31 insertions, 0 deletions
| diff --git a/src/format/elf/elf.c b/src/format/elf/elf.c index e2bf37a..34c7521 100644 --- a/src/format/elf/elf.c +++ b/src/format/elf/elf.c @@ -409,6 +409,8 @@ static GBinPart **g_elf_format_get_parts(const GElfFormat *format, size_t *count      uint16_t i;                             /* Boucle de parcours          */      elf_shdr section;                       /* En-tête de section ELF      */      GBinPart *part;                         /* Partie à intégrer à la liste*/ +    off_t offset;                           /* Début de part de programme  */ +    elf_phdr phdr;                          /* En-tête de programme ELF    */      result = NULL;      *count = 0; @@ -439,6 +441,35 @@ static GBinPart **g_elf_format_get_parts(const GElfFormat *format, size_t *count          } +    /* En désespoir de cause, on se rabbat sur les parties de programme directement */ + +    if (*count == 0) +        for (i = 0; i < format->header.e_phnum; i++) +        { +            offset = ELF_OFF(format, format->header.e_phoff) + format->header.e_phentsize * i; + +            if (!read_elf_program_header(format, &offset, &phdr)) +                continue; + +            if (ELF_PHDR(format, phdr, p_flags) & PF_X) +            { +                part = g_binary_part_new(); + +                /* TODO : nom */ + +                g_binary_part_set_values(part, +                                         ELF_PHDR(format, phdr, p_offset), +                                         ELF_PHDR(format, phdr, p_filesz), +                                         ELF_PHDR(format, phdr, p_vaddr)); + +                result = (GBinPart **)realloc(result, ++(*count) * sizeof(GBinPart *)); +                result[*count - 1] = part; + +            } + +        } + +      return result;  } | 
