diff options
Diffstat (limited to 'src/format/elf')
-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; } |