summaryrefslogtreecommitdiff
path: root/src/format/elf
diff options
context:
space:
mode:
Diffstat (limited to 'src/format/elf')
-rw-r--r--src/format/elf/elf.c31
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;
}