1 /*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
4 for INTEL64(R), AMD64(R)
6 Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
11 1. Redistributions of source code must retain the above copyright notice,
12 this list of conditions and the following disclaimer.
13 2. Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the
15 documentation and/or other materials provided with the distribution.
17 THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY
18 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 OF THE POSSIBILITY OF SUCH DAMAGE.
29 DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
31 /* File Info -----------------------------------------------------------
35 ----------------------------------------------------------------------*/
37 #define DRD64_SRC_LIBGOBLIN_DWARF_ABBREV
38 #include"drd64_libgoblin.h"
40 /*----------------------------------------------------------------------
41 ----------------------------------------------------------------------*/
42 LIBGOBLIN_DWARF_ABBREV_EXTERN
44 Debug_DWARF_Abbrev_Dump(
45 LibGoblin_BinaryInfo *p_binfo,
50 LibGoblin_BinaryFile *p_bfile;
51 DWARF_AbbrevEntry *p_arvnow;
54 { puts("[DEBUG] DWARF Abbrev ------------------------------------------------"); }
56 p_bfile = BinaryFile_GetBinaryFile( p_binfo->i_binfile );
57 assert( NULL != p_bfile );
59 p_arvnow = p_bfile->dwarf.p_abbrev;
60 for( i_cnt = 0; i_cnt < p_bfile->dwarf.i_abbrevs_max; i_cnt++, p_arvnow++ ) {
62 printf(" [ID= %2d] TAG= %02xh Child=%s\n",
63 p_arvnow->dw_id, p_arvnow->dw_tag,
64 ((0x00 == p_arvnow->b_children) ? "NO" : "YES") );
66 for( i_items = 0; i_items < p_arvnow->i_items; i_items++ ) {
67 printf(" Attribute= %02xh , Format= %02xh\n",
68 p_arvnow->dw_attribute[ i_items ],
69 p_arvnow->dw_format[ i_items ] );
73 if( 0x00 < b_level ) {
74 puts("-----------------------------------------------------------------------");
82 /*----------------------------------------------------------------------
83 ----------------------------------------------------------------------*/
84 LIBGOBLIN_DWARF_ABBREV_EXTERN
86 LibGoblin_DwarfAbbrev_ReadEntry(
87 LibGoblin_Dwarf_AbbrevEntry *p_entry,
96 assert( NULL != p_entry );
97 assert( NULL != pb_src );
101 memset( p_entry, 0x00, sizeof( LibGoblin_Dwarf_AbbrevEntry ) );
103 /* Read Abbrev Number */
104 pb_src = DWARF_Common_DecodeULEB128( &qw_temp, pb_src, pqw_remain );
106 p_entry->dw_id = (DWord)qw_temp;
107 if( 0x00000000 == p_entry->dw_id ) {
112 pb_src = DWARF_Common_DecodeULEB128( &qw_temp, pb_src, pqw_remain );
113 p_entry->dw_tag = (DWord)qw_temp;
115 /* Read IsChildren */
116 pb_src = DWARF_Common_Read_Byte( &(p_entry->b_children), pb_src, pqw_remain );
117 if( NULL == pb_src ) { return NULL; }
120 printf("%04x : TAG=%04x (Children=%x) %ld\n",
121 p_entry->dw_id, p_entry->dw_tag, p_entry->b_children, *pqw_remain);
126 pb_src = DWARF_Common_DecodeULEB128( &qw_temp, pb_src, pqw_remain );
127 dw_attribute = (DWord)qw_temp;
128 p_entry->dw_attribute[i_items] = dw_attribute;
131 pb_src = DWARF_Common_DecodeULEB128( &qw_temp, pb_src, pqw_remain );
132 dw_format = (DWord)qw_temp;
133 p_entry->dw_format[i_items] = dw_format;
136 printf(" Attiribute=%02x Format=%02x\n",
137 dw_attribute, dw_format);
142 }while((0x00 != dw_attribute) && (0x00 != dw_format)
143 && (*pqw_remain > 0) );
145 p_entry->i_items = i_items;
151 /*----------------------------------------------------------------------
152 ----------------------------------------------------------------------*/
153 LIBGOBLIN_DWARF_ABBREV_EXTERN
155 DWARF_Abbrev_ReadAbbrevEntry(
156 DWARF_AbbrevEntry **pp_abbrev,
158 LibGoblin_BinaryInfo *p_binfo,
159 LibGoblin_BinaryFile *p_bfile,
174 LibGoblin_SectionInfo *psec_abbrev;
175 DWARF_AbbrevEntry *p_arvnow;
177 assert( NULL != pp_abbrev );
178 assert( NULL != pi_abbrevs );
179 assert( NULL != p_binfo );
180 assert( NULL != p_bfile );
185 // Get .debug_abbrev section Info ---
186 psec_abbrev = Section_GetSectionInfo( p_binfo, LIBGOBLIN_SECTION_ID_DEBUG_ABBREV );
187 assert( NULL != psec_abbrev );
188 if( NULL == psec_abbrev->pb_data ) {
191 pb_data = psec_abbrev->pb_data + qw_offset;
192 qw_remain = p_bfile->dwarf.qw_abbrev_unreadsz;
194 i_abbrevs = p_bfile->dwarf.i_abbrevs_max;
195 p_arvnow = p_bfile->dwarf.p_abbrev + i_abbrevs;
200 // Read Abbrev Number ---
201 pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_remain );
202 dw_abbrev_num = (DWord)qw_temp;
205 pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_remain );
206 dw_tag = (DWord)qw_temp;
208 if(( 0x00 == dw_tag ) || (dw_abbrev_num < dw_before_num )) { break; }
210 /* Read IsChildren */
211 b_children = *pb_data++;
219 pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_remain );
220 dw_attribute = (DWord)qw_temp;
223 pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_remain );
224 dw_format = (DWord)qw_temp;
226 p_arvnow->dw_attribute[ i_items ] = dw_attribute;
227 p_arvnow->dw_format[ i_items ] = dw_format;
229 }while((0x00 != dw_attribute) && (0x00 != dw_format) && (qw_remain > 0) );
231 // Skip Byte for Abbrev
232 if( 0x00 == *pb_data ) {
237 p_arvnow->dw_id = dw_abbrev_num;
238 p_arvnow->dw_tag = dw_tag;
239 p_arvnow->b_children = b_children;
240 p_arvnow->i_items = i_items;
242 p_bfile->dwarf.i_abbrevs_max++;
243 p_bfile->dwarf.qw_abbrev_unreadsz = qw_remain;
244 dw_before_num = dw_abbrev_num;
247 }while((qw_remain > 0) && (dw_tag != 0x00));
249 *pp_abbrev = p_bfile->dwarf.p_abbrev + i_abbrevs;
250 *pi_abbrevs = i_count;
256 /*----------------------------------------------------------------------
257 ----------------------------------------------------------------------*/
259 DWARF_Abbrev_GetItems(
264 LibGoblin_BinaryInfo *p_binfo )
276 LibGoblin_SectionInfo *psec_abbrev;
278 assert( NULL != p_binfo );
280 // Get .debug_abbrev section Info ---
281 psec_abbrev = Section_GetSectionInfo( p_binfo, LIBGOBLIN_SECTION_ID_DEBUG_ABBREV );
282 assert( NULL != psec_abbrev );
283 if( NULL == psec_abbrev->pb_data ) {
286 pb_data = psec_abbrev->pb_data;
287 qw_size = psec_abbrev->qw_size;
288 *pqw_size = psec_abbrev->qw_size;
297 /* Read Abbrev Number */
298 pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_size );
299 dw_abbrev_num = (DWord)qw_temp;
302 pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_size );
303 dw_tag = (DWord)qw_temp;
304 if( DW_TAG_compile_unit == dw_tag ) {
308 /* Read IsChildren */
309 b_children = *pb_data++;
316 pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_size );
317 dw_attribute = (DWord)qw_temp;
320 pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_size );
321 dw_format = (DWord)qw_temp;
323 }while((0x00 != dw_attribute) && (0x00 != dw_format) && (qw_size > 0) );
325 if( i_maxitems < i_items ) { i_maxitems = i_items; }
327 /* Skip Byte for Next Compile-Unit Abbrev. */
328 if( 0x00 == *pb_data ) {
333 }while((qw_size > 0) && (dw_tag != 0x00));
335 *pi_maxitems = i_maxitems;
341 /*----------------------------------------------------------------------
342 ----------------------------------------------------------------------*/
343 LIBGOBLIN_DWARF_ABBREV_EXTERN
345 DWARF_Abbrev_AllocMemory(
346 LibGoblin_BinaryInfo *p_binfo )
353 DWARF_AbbrevEntry *p_abbrev;
354 LibGoblin_DWARF_DIEValue *p_dievalue;
355 LibGoblin_BinaryFile *p_bfile;
357 p_bfile = BinaryFile_GetBinaryFile( p_binfo->i_binfile );
358 assert( NULL != p_bfile );
361 i_result = DWARF_Abbrev_GetItems( &i_filenums, &i_abbrevs, &i_maxitems, &qw_size, p_binfo );
362 if( 0x00 != i_result ) {
366 // Alloc Abbrev Memory ---
367 p_abbrev = (DWARF_AbbrevEntry *)malloc( sizeof( DWARF_AbbrevEntry ) * i_abbrevs );
368 if( NULL == p_abbrev ) {
371 p_bfile->dwarf.p_abbrev = p_abbrev;
372 p_bfile->dwarf.i_abbrevs_alloc = i_abbrevs;
373 p_bfile->dwarf.i_abbrevs_max = 0;
374 p_bfile->dwarf.qw_abbrev_unreadsz = qw_size;
376 p_bfile->dwarf.i_objfiles = i_filenums;
378 // Alloc Abbrev Memory ---
379 p_dievalue = (LibGoblin_DWARF_DIEValue *)malloc(
380 sizeof( LibGoblin_DWARF_DIEValue ) * i_maxitems );
381 if( NULL == p_dievalue ) {
384 p_bfile->dwarf.i_maxvals = i_maxitems;
386 p_binfo->dwarf.i_maxvals = i_maxitems;
387 p_binfo->dwarf.p_infoval = p_dievalue;
393 /* EOF of drd64_.c ----------------------------------- */