diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-07-24 18:43:55 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-07-24 18:43:55 (GMT) |
commit | 156d2e2f6beda2302552ac79678494d914fda05b (patch) | |
tree | 021825960b7ac3315a336fc085a4f1d07c05df39 /src/format/elf/elf-int.c | |
parent | 21537636cd8318cf5a720211619ad3c3023b52e9 (diff) |
Replaced all remaining raw accesses to binary contents with the GBinContent wrapper in binary formats.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@555 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/format/elf/elf-int.c')
-rw-r--r-- | src/format/elf/elf-int.c | 239 |
1 files changed, 121 insertions, 118 deletions
diff --git a/src/format/elf/elf-int.c b/src/format/elf/elf-int.c index 7ca958b..3e70932 100644 --- a/src/format/elf/elf-int.c +++ b/src/format/elf/elf-int.c @@ -46,22 +46,14 @@ bool read_elf_header(GElfFormat *format, elf_header *header, bool *is_32b, SourceEndian *endian) { bool result; /* Bilan à retourner */ - const bin_t *content; /* Contenu binaire à lire */ - off_t length; /* Taille totale du contenu */ - off_t pos; /* Position de lecture */ + const GBinContent *content; /* Contenu binaire à lire */ + vmpa2t pos; /* Position de lecture */ content = G_BIN_FORMAT(format)->content; - length = G_BIN_FORMAT(format)->length; - result = (length >= EI_NIDENT); + init_vmpa(&pos, 0, VMPA_NO_VIRTUAL); - pos = 0; - - if (result) - { - memcpy(header->hdr32.e_ident, content, EI_NIDENT); - pos += EI_NIDENT; - } + result = g_binary_content_get_raw(content, &pos, EI_NIDENT, (bin_t *)header->hdr32.e_ident); /* Détermination de l'espace d'adressage */ if (result) @@ -95,35 +87,35 @@ bool read_elf_header(GElfFormat *format, elf_header *header, bool *is_32b, Sourc if (*is_32b) { - result &= read_u16(&header->hdr32.e_type, content, &pos, length, *endian); - result &= read_u16(&header->hdr32.e_machine, content, &pos, length, *endian); - result &= read_u32(&header->hdr32.e_version, content, &pos, length, *endian); - result &= read_u32(&header->hdr32.e_entry, content, &pos, length, *endian); - result &= read_u32(&header->hdr32.e_phoff, content, &pos, length, *endian); - result &= read_u32(&header->hdr32.e_shoff, content, &pos, length, *endian); - result &= read_u32(&header->hdr32.e_flags, content, &pos, length, *endian); - result &= read_u16(&header->hdr32.e_ehsize, content, &pos, length, *endian); - result &= read_u16(&header->hdr32.e_phentsize, content, &pos, length, *endian); - result &= read_u16(&header->hdr32.e_phnum, content, &pos, length, *endian); - result &= read_u16(&header->hdr32.e_shentsize, content, &pos, length, *endian); - result &= read_u16(&header->hdr32.e_shnum, content, &pos, length, *endian); - result &= read_u16(&header->hdr32.e_shstrndx, content, &pos, length, *endian); + result &= g_binary_content_read_u16(content, &pos, *endian, &header->hdr32.e_type); + result &= g_binary_content_read_u16(content, &pos, *endian, &header->hdr32.e_machine); + result &= g_binary_content_read_u32(content, &pos, *endian, &header->hdr32.e_version); + result &= g_binary_content_read_u32(content, &pos, *endian, &header->hdr32.e_entry); + result &= g_binary_content_read_u32(content, &pos, *endian, &header->hdr32.e_phoff); + result &= g_binary_content_read_u32(content, &pos, *endian, &header->hdr32.e_shoff); + result &= g_binary_content_read_u32(content, &pos, *endian, &header->hdr32.e_flags); + result &= g_binary_content_read_u16(content, &pos, *endian, &header->hdr32.e_ehsize); + result &= g_binary_content_read_u16(content, &pos, *endian, &header->hdr32.e_phentsize); + result &= g_binary_content_read_u16(content, &pos, *endian, &header->hdr32.e_phnum); + result &= g_binary_content_read_u16(content, &pos, *endian, &header->hdr32.e_shentsize); + result &= g_binary_content_read_u16(content, &pos, *endian, &header->hdr32.e_shnum); + result &= g_binary_content_read_u16(content, &pos, *endian, &header->hdr32.e_shstrndx); } else { - result &= read_u16(&header->hdr64.e_type, content, &pos, length, *endian); - result &= read_u16(&header->hdr64.e_machine, content, &pos, length, *endian); - result &= read_u32(&header->hdr64.e_version, content, &pos, length, *endian); - result &= read_u64(&header->hdr64.e_entry, content, &pos, length, *endian); - result &= read_u64(&header->hdr64.e_phoff, content, &pos, length, *endian); - result &= read_u64(&header->hdr64.e_shoff, content, &pos, length, *endian); - result &= read_u32(&header->hdr64.e_flags, content, &pos, length, *endian); - result &= read_u16(&header->hdr64.e_ehsize, content, &pos, length, *endian); - result &= read_u16(&header->hdr64.e_phentsize, content, &pos, length, *endian); - result &= read_u16(&header->hdr64.e_phnum, content, &pos, length, *endian); - result &= read_u16(&header->hdr64.e_shentsize, content, &pos, length, *endian); - result &= read_u16(&header->hdr64.e_shnum, content, &pos, length, *endian); - result &= read_u16(&header->hdr64.e_shstrndx, content, &pos, length, *endian); + result &= g_binary_content_read_u16(content, &pos, *endian, &header->hdr64.e_type); + result &= g_binary_content_read_u16(content, &pos, *endian, &header->hdr64.e_machine); + result &= g_binary_content_read_u32(content, &pos, *endian, &header->hdr64.e_version); + result &= g_binary_content_read_u64(content, &pos, *endian, &header->hdr64.e_entry); + result &= g_binary_content_read_u64(content, &pos, *endian, &header->hdr64.e_phoff); + result &= g_binary_content_read_u64(content, &pos, *endian, &header->hdr64.e_shoff); + result &= g_binary_content_read_u32(content, &pos, *endian, &header->hdr64.e_flags); + result &= g_binary_content_read_u16(content, &pos, *endian, &header->hdr64.e_ehsize); + result &= g_binary_content_read_u16(content, &pos, *endian, &header->hdr64.e_phentsize); + result &= g_binary_content_read_u16(content, &pos, *endian, &header->hdr64.e_phnum); + result &= g_binary_content_read_u16(content, &pos, *endian, &header->hdr64.e_shentsize); + result &= g_binary_content_read_u16(content, &pos, *endian, &header->hdr64.e_shnum); + result &= g_binary_content_read_u16(content, &pos, *endian, &header->hdr64.e_shstrndx); } return result; @@ -134,7 +126,7 @@ bool read_elf_header(GElfFormat *format, elf_header *header, bool *is_32b, Sourc /****************************************************************************** * * * Paramètres : format = informations chargées à consulter. * -* pos = position de début de lecture. [OUT] * +* phys = position de début de lecture. * * header = structure lue à retourner. [OUT] * * * * Description : Procède à la lecture d'une en-tête de programme ELF. * @@ -145,36 +137,37 @@ bool read_elf_header(GElfFormat *format, elf_header *header, bool *is_32b, Sourc * * ******************************************************************************/ -bool read_elf_program_header(const GElfFormat *format, off_t pos, elf_phdr *header) +bool read_elf_program_header(const GElfFormat *format, phys_t phys, elf_phdr *header) { bool result; /* Bilan à retourner */ - const bin_t *content; /* Contenu binaire à lire */ - off_t length; /* Taille totale du contenu */ + const GBinContent *content; /* Contenu binaire à lire */ + vmpa2t pos; /* Position de lecture */ content = G_BIN_FORMAT(format)->content; - length = G_BIN_FORMAT(format)->length; + + init_vmpa(&pos, phys, VMPA_NO_VIRTUAL); if (format->is_32b) { - result = read_u32(&header->phdr32.p_type, content, &pos, length, format->endian); - result &= read_u32(&header->phdr32.p_offset, content, &pos, length, format->endian); - result &= read_u32(&header->phdr32.p_vaddr, content, &pos, length, format->endian); - result &= read_u32(&header->phdr32.p_paddr, content, &pos, length, format->endian); - result &= read_u32(&header->phdr32.p_filesz, content, &pos, length, format->endian); - result &= read_u32(&header->phdr32.p_memsz, content, &pos, length, format->endian); - result &= read_u32(&header->phdr32.p_flags, content, &pos, length, format->endian); - result &= read_u32(&header->phdr32.p_align, content, &pos, length, format->endian); + result = g_binary_content_read_u32(content, &pos, format->endian, &header->phdr32.p_type); + result &= g_binary_content_read_u32(content, &pos, format->endian, &header->phdr32.p_offset); + result &= g_binary_content_read_u32(content, &pos, format->endian, &header->phdr32.p_vaddr); + result &= g_binary_content_read_u32(content, &pos, format->endian, &header->phdr32.p_paddr); + result &= g_binary_content_read_u32(content, &pos, format->endian, &header->phdr32.p_filesz); + result &= g_binary_content_read_u32(content, &pos, format->endian, &header->phdr32.p_memsz); + result &= g_binary_content_read_u32(content, &pos, format->endian, &header->phdr32.p_flags); + result &= g_binary_content_read_u32(content, &pos, format->endian, &header->phdr32.p_align); } else { - result = read_u32(&header->phdr64.p_type, content, &pos, length, format->endian); - result &= read_u32(&header->phdr64.p_flags, content, &pos, length, format->endian); - result &= read_u64(&header->phdr64.p_offset, content, &pos, length, format->endian); - result &= read_u64(&header->phdr64.p_vaddr, content, &pos, length, format->endian); - result &= read_u64(&header->phdr64.p_paddr, content, &pos, length, format->endian); - result &= read_u64(&header->phdr64.p_filesz, content, &pos, length, format->endian); - result &= read_u64(&header->phdr64.p_memsz, content, &pos, length, format->endian); - result &= read_u64(&header->phdr64.p_align, content, &pos, length, format->endian); + result = g_binary_content_read_u32(content, &pos, format->endian, &header->phdr64.p_type); + result &= g_binary_content_read_u32(content, &pos, format->endian, &header->phdr64.p_flags); + result &= g_binary_content_read_u64(content, &pos, format->endian, &header->phdr64.p_offset); + result &= g_binary_content_read_u64(content, &pos, format->endian, &header->phdr64.p_vaddr); + result &= g_binary_content_read_u64(content, &pos, format->endian, &header->phdr64.p_paddr); + result &= g_binary_content_read_u64(content, &pos, format->endian, &header->phdr64.p_filesz); + result &= g_binary_content_read_u64(content, &pos, format->endian, &header->phdr64.p_memsz); + result &= g_binary_content_read_u64(content, &pos, format->endian, &header->phdr64.p_align); } return result; @@ -185,7 +178,7 @@ bool read_elf_program_header(const GElfFormat *format, off_t pos, elf_phdr *head /****************************************************************************** * * * Paramètres : format = informations chargées à consulter. * -* pos = position de la tête de lecture. * +* phys = position de début de lecture. * * section = section lue. [OUT] * * * * Description : Procède à la lecture d'une en-tête de section ELF. * @@ -196,49 +189,50 @@ bool read_elf_program_header(const GElfFormat *format, off_t pos, elf_phdr *head * * ******************************************************************************/ -bool read_elf_section_header(const GElfFormat *format, off_t pos, elf_shdr *section) +bool read_elf_section_header(const GElfFormat *format, phys_t phys, elf_shdr *section) { bool result; /* Bilan à retourner */ - const bin_t *content; /* Contenu binaire à lire */ - off_t length; /* Taille totale du contenu */ + const GBinContent *content; /* Contenu binaire à lire */ + vmpa2t pos; /* Position de lecture */ elf32_shdr *shdr32; /* Version 32 bits */ elf64_shdr *shdr64; /* Version 32 bits */ result = true; content = G_BIN_FORMAT(format)->content; - length = G_BIN_FORMAT(format)->length; + + init_vmpa(&pos, phys, VMPA_NO_VIRTUAL); if (format->is_32b) { shdr32 = §ion->shdr32; - result = read_u32(&shdr32->sh_name, content, &pos, length, format->endian); - result &= read_u32(&shdr32->sh_type, content, &pos, length, format->endian); - result &= read_u32(&shdr32->sh_flags, content, &pos, length, format->endian); - result &= read_u32(&shdr32->sh_addr, content, &pos, length, format->endian); - result &= read_u32(&shdr32->sh_offset, content, &pos, length, format->endian); - result &= read_u32(&shdr32->sh_size, content, &pos, length, format->endian); - result &= read_u32(&shdr32->sh_link, content, &pos, length, format->endian); - result &= read_u32(&shdr32->sh_info, content, &pos, length, format->endian); - result &= read_u32(&shdr32->sh_addralign, content, &pos, length, format->endian); - result &= read_u32(&shdr32->sh_entsize, content, &pos, length, format->endian); + result = g_binary_content_read_u32(content, &pos, format->endian, &shdr32->sh_name); + result &= g_binary_content_read_u32(content, &pos, format->endian, &shdr32->sh_type); + result &= g_binary_content_read_u32(content, &pos, format->endian, &shdr32->sh_flags); + result &= g_binary_content_read_u32(content, &pos, format->endian, &shdr32->sh_addr); + result &= g_binary_content_read_u32(content, &pos, format->endian, &shdr32->sh_offset); + result &= g_binary_content_read_u32(content, &pos, format->endian, &shdr32->sh_size); + result &= g_binary_content_read_u32(content, &pos, format->endian, &shdr32->sh_link); + result &= g_binary_content_read_u32(content, &pos, format->endian, &shdr32->sh_info); + result &= g_binary_content_read_u32(content, &pos, format->endian, &shdr32->sh_addralign); + result &= g_binary_content_read_u32(content, &pos, format->endian, &shdr32->sh_entsize); } else { shdr64 = §ion->shdr64; - result = read_u32(&shdr64->sh_name, content, &pos, length, format->endian); - result &= read_u32(&shdr64->sh_type, content, &pos, length, format->endian); - result &= read_u64(&shdr64->sh_flags, content, &pos, length, format->endian); - result &= read_u64(&shdr64->sh_addr, content, &pos, length, format->endian); - result &= read_u64(&shdr64->sh_offset, content, &pos, length, format->endian); - result &= read_u64(&shdr64->sh_size, content, &pos, length, format->endian); - result &= read_u32(&shdr64->sh_link, content, &pos, length, format->endian); - result &= read_u32(&shdr64->sh_info, content, &pos, length, format->endian); - result &= read_u64(&shdr64->sh_addralign, content, &pos, length, format->endian); - result &= read_u64(&shdr64->sh_entsize, content, &pos, length, format->endian); + result = g_binary_content_read_u32(content, &pos, format->endian, &shdr64->sh_name); + result &= g_binary_content_read_u32(content, &pos, format->endian, &shdr64->sh_type); + result &= g_binary_content_read_u64(content, &pos, format->endian, &shdr64->sh_flags); + result &= g_binary_content_read_u64(content, &pos, format->endian, &shdr64->sh_addr); + result &= g_binary_content_read_u64(content, &pos, format->endian, &shdr64->sh_offset); + result &= g_binary_content_read_u64(content, &pos, format->endian, &shdr64->sh_size); + result &= g_binary_content_read_u32(content, &pos, format->endian, &shdr64->sh_link); + result &= g_binary_content_read_u32(content, &pos, format->endian, &shdr64->sh_info); + result &= g_binary_content_read_u64(content, &pos, format->endian, &shdr64->sh_addralign); + result &= g_binary_content_read_u64(content, &pos, format->endian, &shdr64->sh_entsize); } @@ -250,7 +244,7 @@ bool read_elf_section_header(const GElfFormat *format, off_t pos, elf_shdr *sect /****************************************************************************** * * * Paramètres : format = informations chargées à consulter. * -* pos = position de début de lecture. [OUT] * +* phys = position de début de lecture. * * dyn = structure lue à retourner. [OUT] * * * * Description : Procède à la lecture d'une entrée de type 'DYNAMIC' ELF. * @@ -261,24 +255,25 @@ bool read_elf_section_header(const GElfFormat *format, off_t pos, elf_shdr *sect * * ******************************************************************************/ -bool read_elf_dynamic_entry(const GElfFormat *format, off_t *pos, elf_dyn *dyn) +bool read_elf_dynamic_entry(const GElfFormat *format, phys_t phys, elf_dyn *dyn) { bool result; /* Bilan à retourner */ - const bin_t *content; /* Contenu binaire à lire */ - off_t length; /* Taille totale du contenu */ + const GBinContent *content; /* Contenu binaire à lire */ + vmpa2t pos; /* Position de lecture */ content = G_BIN_FORMAT(format)->content; - length = G_BIN_FORMAT(format)->length; + + init_vmpa(&pos, phys, VMPA_NO_VIRTUAL); if (format->is_32b) { - result = read_s32(&dyn->dyn32.d_tag, content, pos, length, format->endian); - result &= read_u32(&dyn->dyn32.d_un.d_val, content, pos, length, format->endian); + result = g_binary_content_read_s32(content, &pos, format->endian, &dyn->dyn32.d_tag); + result &= g_binary_content_read_u32(content, &pos, format->endian, &dyn->dyn32.d_un.d_val); } else { - result = read_s64(&dyn->dyn64.d_tag, content, pos, length, format->endian); - result &= read_u64(&dyn->dyn64.d_un.d_val, content, pos, length, format->endian); + result = g_binary_content_read_s64(content, &pos, format->endian, &dyn->dyn64.d_tag); + result &= g_binary_content_read_u64(content, &pos, format->endian, &dyn->dyn64.d_un.d_val); } return result; @@ -300,34 +295,38 @@ bool read_elf_dynamic_entry(const GElfFormat *format, off_t *pos, elf_dyn *dyn) * * ******************************************************************************/ -bool read_elf_symbol(const GElfFormat *format, off_t *pos, elf_sym *sym) +bool read_elf_symbol(const GElfFormat *format, phys_t *phys, elf_sym *sym) { bool result; /* Bilan à retourner */ - const bin_t *content; /* Contenu binaire à lire */ - off_t length; /* Taille totale du contenu */ + const GBinContent *content; /* Contenu binaire à lire */ + vmpa2t pos; /* Position de lecture */ content = G_BIN_FORMAT(format)->content; - length = G_BIN_FORMAT(format)->length; + + init_vmpa(&pos, *phys, VMPA_NO_VIRTUAL); if (format->is_32b) { - result = read_u32(&sym->sym32.st_name, content, pos, length, format->endian); - result &= read_u32(&sym->sym32.st_value, content, pos, length, format->endian); - result &= read_u32(&sym->sym32.st_size, content, pos, length, format->endian); - result &= read_u8(&sym->sym32.st_info, content, pos, length, format->endian); - result &= read_u8(&sym->sym32.st_other, content, pos, length, format->endian); - result &= read_u16(&sym->sym32.st_shndx, content, pos, length, format->endian); + result = g_binary_content_read_u32(content, &pos, format->endian, &sym->sym32.st_name); + result &= g_binary_content_read_u32(content, &pos, format->endian, &sym->sym32.st_value); + result &= g_binary_content_read_u32(content, &pos, format->endian, &sym->sym32.st_size); + result &= g_binary_content_read_u8(content, &pos, &sym->sym32.st_info); + result &= g_binary_content_read_u8(content, &pos, &sym->sym32.st_other); + result &= g_binary_content_read_u16(content, &pos, format->endian, &sym->sym32.st_shndx); } else { - result = read_u32(&sym->sym64.st_name, content, pos, length, format->endian); - result &= read_u8(&sym->sym64.st_info, content, pos, length, format->endian); - result &= read_u8(&sym->sym64.st_other, content, pos, length, format->endian); - result &= read_u16(&sym->sym64.st_shndx, content, pos, length, format->endian); - result &= read_u64(&sym->sym64.st_value, content, pos, length, format->endian); - result &= read_u64(&sym->sym64.st_size, content, pos, length, format->endian); + result = g_binary_content_read_u32(content, &pos, format->endian, &sym->sym64.st_name); + result &= g_binary_content_read_u8(content, &pos, &sym->sym64.st_info); + result &= g_binary_content_read_u8(content, &pos, &sym->sym64.st_other); + result &= g_binary_content_read_u16(content, &pos, format->endian, &sym->sym64.st_shndx); + result &= g_binary_content_read_u64(content, &pos, format->endian, &sym->sym64.st_value); + result &= g_binary_content_read_u64(content, &pos, format->endian, &sym->sym64.st_size); } + if (result) + *phys = get_phy_addr(&pos); + return result; } @@ -336,7 +335,7 @@ bool read_elf_symbol(const GElfFormat *format, off_t *pos, elf_sym *sym) /****************************************************************************** * * * Paramètres : format = informations chargées à consulter. * -* pos = position de début de lecture. [OUT] * +* phys = position de début de lecture. [OUT] * * reloc = structure lue à retourner. [OUT] * * * * Description : Procède à la lecture d'une relocalisation ELF. * @@ -347,26 +346,30 @@ bool read_elf_symbol(const GElfFormat *format, off_t *pos, elf_sym *sym) * * ******************************************************************************/ -bool read_elf_relocation(const GElfFormat *format, off_t *pos, elf_rel *reloc) +bool read_elf_relocation(const GElfFormat *format, phys_t *phys, elf_rel *reloc) { bool result; /* Bilan à retourner */ - const bin_t *content; /* Contenu binaire à lire */ - off_t length; /* Taille totale du contenu */ + const GBinContent *content; /* Contenu binaire à lire */ + vmpa2t pos; /* Position de lecture */ content = G_BIN_FORMAT(format)->content; - length = G_BIN_FORMAT(format)->length; + + init_vmpa(&pos, *phys, VMPA_NO_VIRTUAL); if (format->is_32b) { - result = read_u32(&reloc->rel32.r_offset, content, pos, length, format->endian); - result &= read_u32(&reloc->rel32.r_info, content, pos, length, format->endian); + result = g_binary_content_read_u32(content, &pos, format->endian, &reloc->rel32.r_offset); + result &= g_binary_content_read_u32(content, &pos, format->endian, &reloc->rel32.r_info); } else { - result = read_u64(&reloc->rel64.r_offset, content, pos, length, format->endian); - result &= read_u64(&reloc->rel64.r_info, content, pos, length, format->endian); + result = g_binary_content_read_u64(content, &pos, format->endian, &reloc->rel64.r_offset); + result &= g_binary_content_read_u64(content, &pos, format->endian, &reloc->rel64.r_info); } + if (result) + *phys = get_phy_addr(&pos); + return result; } |