summaryrefslogtreecommitdiff
path: root/src/format/elf/strings.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/format/elf/strings.c')
-rw-r--r--src/format/elf/strings.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/format/elf/strings.c b/src/format/elf/strings.c
index 3d373a6..049f6d4 100644
--- a/src/format/elf/strings.c
+++ b/src/format/elf/strings.c
@@ -56,9 +56,38 @@ bool find_all_elf_strings(elf_format *format)
off_t str_start; /* Début de section */
off_t str_size; /* Taille de section */
uint64_t str_vaddr; /* Adresse virtuelle associée */
+ Elf_Shdr *sections; /* Groupe de sections trouvées */
+ size_t count; /* Quantité de données */
+ size_t i; /* Boucle de parcours */
+
+ /* Données en lecture seule */
+
+ if (find_elf_section_content_by_name(format, ".rodata", &str_start, &str_size, &str_vaddr))
+ parse_elf_string_data(format, str_start, str_size, str_vaddr);
+
+ else
+ {
+ find_elf_section_by_type(format, SHT_PROGBITS, &sections, &count);
- if (find_elf_section(format, ".rodata", &str_start, &str_size, &str_vaddr))
+ for (i = 0; i < count; i++)
+ if (ELF_SHDR(format, &sections[i], sh_flags) == SHF_ALLOC
+ || (ELF_SHDR(format, &sections[i], sh_flags) & SHF_STRINGS))
+ {
+ get_elf_section_content(format, &sections[i], &str_start, &str_size, &str_vaddr);
+ parse_elf_string_data(format, str_start, str_size, str_vaddr);
+ }
+
+ }
+
+ /* Chaîne de caractères déclarées */
+
+ find_elf_section_by_type(format, SHT_STRTAB, &sections, &count);
+
+ for (i = 0; i < count; i++)
+ {
+ get_elf_section_content(format, &sections[i], &str_start, &str_size, &str_vaddr);
parse_elf_string_data(format, str_start, str_size, str_vaddr);
+ }
return true;
@@ -85,6 +114,8 @@ bool parse_elf_string_data(elf_format *format, const off_t start, const off_t si
off_t i; /* Boucle de parcours */
off_t end; /* Position de fin de chaîne */
+ if (vaddress == 0) return false;
+
for (i = start; i < (start + size); i++)
if (isprint(EXE_FORMAT(format)->content[i]))
{