/* Chrysalide - Outil d'analyse de fichiers binaires
* helper_mips.c - gestion auxiliaire de l'architecture MIPS
*
* Copyright (C) 2009-2017 Cyrille Bagard
*
* This file is part of Chrysalide.
*
* Chrysalide 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.
*
* Chrysalide 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 .
*/
#include "helper_mips.h"
#include
#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 : Bilan de l'opération. *
* *
* 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;
}