/* Chrysalide - Outil d'analyse de fichiers binaires
* symbol.c - gestion des symboles dans un binaire
*
* Copyright (C) 2009-2012 Cyrille Bagard
*
* This file is part of Chrysalide.
*
* 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 .
*/
#include "symbol.h"
#include
/* Symbole d'exécutable (instance) */
struct _GBinSymbol
{
GObject parent; /* A laisser en premier */
SymbolType type; /* Type du symbole */
const char *name; /* Désignation du symbole */
vmpa_t address; /* Adresse du symbole */
char *alt; /* Nom alternatif */
union
{
GArchInstruction *instr; /* Instruction correspondante */
GBinRoutine *routine; /* Compléments pour fonction */
} extra;
GDbComment *comment; /* Eventuel commentaire lié */
};
/* Symbole d'exécutable (classe) */
struct _GBinSymbolClass
{
GObjectClass parent; /* A laisser en premier */
};
/* Initialise la classe des symboles d'exécutables. */
static void g_binary_symbol_class_init(GBinSymbolClass *);
/* Initialise une instance de symbole d'exécutable. */
static void g_binary_symbol_init(GBinSymbol *);
/* Indique le type défini pour un symbole d'exécutable. */
G_DEFINE_TYPE(GBinSymbol, g_binary_symbol, G_TYPE_OBJECT);
/******************************************************************************
* *
* Paramètres : klass = classe à initialiser. *
* *
* Description : Initialise la classe des symboles d'exécutables. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
static void g_binary_symbol_class_init(GBinSymbolClass *klass)
{
}
/******************************************************************************
* *
* Paramètres : symbol = instance à initialiser. *
* *
* Description : Initialise une instance de symbole d'exécutable. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
static void g_binary_symbol_init(GBinSymbol *symbol)
{
}
/******************************************************************************
* *
* Paramètres : type = type de symbole à créer. *
* name = désignation humaine du symbole. *
* address = adresse associée au symbole. *
* *
* Description : Crée un nouveau symbole d'exécutable. *
* *
* Retour : Adresse de l'instance mise en place ou NULL en cas d'échec. *
* *
* Remarques : - *
* *
******************************************************************************/
GBinSymbol *g_binary_symbol_new(SymbolType type, const char *name, vmpa_t address)
{
GBinSymbol *result; /* Nouveau symbole à renvoyer */
result = g_object_new(G_TYPE_BIN_SYMBOL, NULL);
result->type = type;
result->name = name;
result->address = address;
return result;
}
/******************************************************************************
* *
* Paramètres : symbol = symbole à venir consulter. *
* *
* Description : Fournit le type du symbole. *
* *
* Retour : Type de symbole représenté. *
* *
* Remarques : - *
* *
******************************************************************************/
SymbolType g_binary_symbol_get_target_type(const GBinSymbol *symbol)
{
return symbol->type;
}
/******************************************************************************
* *
* Paramètres : symbol = symbole à venir consulter. *
* *
* Description : Fournit la description humaine du symbole. *
* *
* Retour : Nom du symbole sous forme de chaîne de caractères. *
* *
* Remarques : - *
* *
******************************************************************************/
const char *g_binary_symbol_to_string(const GBinSymbol *symbol)
{
const char *result; /* Désignation à retourner */
if (symbol->extra.routine != NULL)
result = g_binary_routine_get_name(symbol->extra.routine);
else result = (symbol->alt != NULL ? symbol->alt : symbol->name);
return result;
}
vmpa_t g_binary_symbol_get_address(const GBinSymbol *symbol)
{
return 0;
}
/******************************************************************************
* *
* Paramètres : symbol = symbole à venir consulter. *
* length = taille de l'instruction ou NULL. [OUT] *
* *
* Description : Fournit l'emplacement où se situe un symbole. *
* *
* Retour : Adresse virtuelle ou physique associée. *
* *
* Remarques : - *
* *
******************************************************************************/
const vmpa2t *g_binary_symbol_get_location(const GBinSymbol *symbol, off_t *length)
{
const vmpa2t *result; /* Localisation à retourner */
result = NULL;
switch (symbol->type)
{
case STP_DATA:
result = g_arch_instruction_get_location2(symbol->extra.instr, length);
break;
case STP_ROUTINE:
result = g_binary_routine_get_address(symbol->extra.routine);
if (length != NULL)
*length = g_binary_routine_get_size(symbol->extra.routine);
break;
default:
result = NULL;
break;
}
return result;
}
/******************************************************************************
* *
* Paramètres : symbol = symbole à venir consulter. *
* *
* Description : Fournit la taille officielle d'un symbole. *
* *
* Retour : Taille de symbole. *
* *
* Remarques : - *
* *
******************************************************************************/
off_t g_binary_symbol_get_size(const GBinSymbol *symbol)
{
off_t result; /* Taille à renvoyer */
switch (symbol->type)
{
case STP_OBJECT:
result = 1; /* FIXME */
break;
case STP_FUNCTION:
/* FIXME */if (symbol->extra.routine == NULL) result = 1; else
result = g_binary_routine_get_size(symbol->extra.routine);
break;
case STP_STRING:
result = strlen(g_binary_symbol_to_string(symbol));
break;
}
return result;;
}
/******************************************************************************
* *
* Paramètres : symbol = symbole à venir consulter. *
* alt = désignation humaine alternative à favoriser. *
* *
* Description : Définit un autre nom pour le symbole. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void g_binary_symbol_set_alt_name(GBinSymbol *symbol, char *alt)
{
symbol->alt = alt;
}
/******************************************************************************
* *
* Paramètres : symbol = symbole à venir consulter. *
* routine = prototype de la fonction représentée. *
* *
* Description : Attache la routine associée au symbole. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void g_binary_symbol_attach_routine(GBinSymbol *symbol, GBinRoutine *routine)
{
symbol->extra.routine = routine;
}
/******************************************************************************
* *
* Paramètres : symbol = symbole à venir manipuler. *
* instr = représentation du symbole associé. *
* *
* Description : Attache l'instruction associée au symbole. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void g_binary_symbol_attach_instruction(GBinSymbol *symbol, GArchInstruction *instr)
{
symbol->type = STP_DATA;
symbol->extra.instr = instr;
}
/******************************************************************************
* *
* Paramètres : symbol = symbole à venir consulter. *
* *
* Description : Fournit l'éventuelle instruction associée au symbole. *
* *
* Retour : - *
* *
* Remarques : Il n'y a pas de transfert de propriété ici ! *
* *
******************************************************************************/
GArchInstruction *g_binary_symbol_get_instruction(const GBinSymbol *symbol)
{
return symbol->extra.instr;
}
/******************************************************************************
* *
* Paramètres : symbol = symbole à venir manipuler. *
* comment = commentaire construit à propos du symbole. *
* *
* Description : Ajoute un commentaire facultatif au symbole. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void g_binary_symbol_set_comment(GBinSymbol *symbol, GDbComment *comment)
{
symbol->comment = comment;
}
/******************************************************************************
* *
* Paramètres : symbol = symbole à venir consulter. *
* *
* Description : Fournit l'éventuel commentaire associé au symbole. *
* *
* Retour : - *
* *
* Remarques : Il n'y a pas de transfert de propriété ici ! *
* *
******************************************************************************/
GDbComment *g_binary_symbol_get_comment(const GBinSymbol *symbol)
{
return symbol->comment;
}