diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2009-06-01 17:49:32 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2009-06-01 17:49:32 (GMT) |
commit | f6252e57c770fea10439659f35a69a783ff849d3 (patch) | |
tree | efc64ca7703648e439483ee6f4c14db855d7f952 /src/format/elf/helper_mips.c | |
parent | 1b8152d6f95b03f81aa6a4043c23a45a9f74c418 (diff) |
Provided found MIPS routines.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@69 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/format/elf/helper_mips.c')
-rw-r--r-- | src/format/elf/helper_mips.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/format/elf/helper_mips.c b/src/format/elf/helper_mips.c new file mode 100644 index 0000000..b56db5d --- /dev/null +++ b/src/format/elf/helper_mips.c @@ -0,0 +1,85 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * helper_mips.c - gestion auxiliaire de l'architecture MIPS + * + * Copyright (C) 2009 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include "helper_mips.h" + + +#include <string.h> + + +#include "elf-int.h" + + + +/****************************************************************************** +* * +* Paramètres : format = description de l'exécutable à compléter. * +* dyn_start = début des informations dynamiques associées. * +* dyn_size = taille de la zone associée. * +* str_start = début de la zone de chaîne de caractères. * +* str_size = taille de la zone de chaînes de caractères. * +* * +* Description : Déduit les adresses effectives des appels externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_elf_format_find_mips_dynamic_symbols(elf_format *format, off_t dyn_start, off_t dyn_size, off_t str_start, off_t str_size) +{ + off_t iter; /* Boucle de parcours */ + Elf_Sym symbol; /* Symbole ELF lu */ + off_t name_pos; /* Localisation du nom */ + + if (dyn_size % ELF_SIZEOF_SYM(format) != 0) return false; + + for (iter = dyn_start; iter < (dyn_start + dyn_size); iter += ELF_SIZEOF_SYM(format)) + { + memcpy(&symbol, &EXE_FORMAT(format)->content[iter], ELF_SIZEOF_SYM(format)); + + if (ELF_ST_TYPE(ELF_SYM(format, symbol, st_info)) != STT_FUNC) continue; + + if (ELF_SYM(format, symbol, st_value) == 0) continue; + + name_pos = ELF_SYM(format, symbol, st_name); + + /* Sécurité anti-débordements */ + if (name_pos >= str_size) continue; + + /* Si le symbole possède un nom... */ + if (strlen(&EXE_FORMAT(format)->content[str_start + name_pos]) > 0) + { + format->symbols = (elf_symbol *)realloc(format->symbols, ++format->sym_count * sizeof(elf_symbol)); + + format->symbols[format->sym_count - 1].name = &EXE_FORMAT(format)->content[str_start + name_pos]; + format->symbols[format->sym_count - 1].address = ELF_SYM(format, symbol, st_value); + + } + + } + + return true; + +} |