/* OpenIDA - Outil d'analyse de fichiers binaires * utils.h - prototypes pour les fonctions d'aisance vis à vis du format DWARF * * Copyright (C) 2008 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 . */ #include "utils.h" #include "dwarf-int.h" /****************************************************************************** * * * Paramètres : format = informations de débogage à consulter. * * pos = tête de lecture à mettre à jour. [OUT] * * value = valeur au format LEB128 lue. [OUT] * * * * Description : Lit une valeur Little Endian Base 128 signée. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ bool read_leb128(dwarf_format *format, off_t *pos, int64_t *value) { int shift; /* Décallage à appliquer */ off_t i; /* Boucle de parcours */ *value = 0; for (i = 0; i < 8; i++) { /* On évite les débordements... */ if ((*pos + i) >= DBG_FORMAT(format)->length) return false; *value |= (DBG_FORMAT(format)->content[*pos + i] & 0x7f) << shift; shift += 7; (*pos)++; if ((DBG_FORMAT(format)->content[*pos] & 0x80) == 0x00) break; } if ((shift < 64) && (DBG_FORMAT(format)->content[*pos - 1] & 0x40) == 0x40) *value |= - (1 << shift); return (i < 8); }