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_INFO
38 #include"drd64_libgoblin.h"
40 /*----------------------------------------------------------------------
41 ----------------------------------------------------------------------*/
43 DWARF_Info_ReadFormat_Ref_inCU(
44 LibGoblin_DWARF_DIEValue *p_val,
55 assert( NULL != pb_src );
56 assert( NULL != p_val );
59 pb_src = DWARF_Common_Read_Byte( &b_size, pb_src, pqw_remain );
60 qw_size = (QWord)b_size;
62 else if( 2 == b_bytes ) {
63 pb_src = DWARF_Common_Read_Word( &w_size, pb_src, pqw_remain );
64 qw_size = (QWord)w_size;
66 else if( 4 == b_bytes ) {
67 pb_src = DWARF_Common_Read_DWord( &dw_size, pb_src, pqw_remain );
68 qw_size = (QWord)dw_size;
70 else if( 8 == b_bytes ) {
71 pb_src = DWARF_Common_Read_QWord( &qw_size, pb_src, pqw_remain );
74 pb_src = DWARF_Common_DecodeULEB128( &qw_size, pb_src, pqw_remain );
76 if( NULL == pb_src ) { return NULL; }
78 p_val->value.pb_link = pb_custart + qw_size;
79 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_LINK;
80 p_val->qw_size = (QWord)b_bytes;
86 /*----------------------------------------------------------------------
87 ----------------------------------------------------------------------*/
89 DWARF_Info_ReadFormat_Block(
90 LibGoblin_DWARF_DIEValue *p_val,
100 assert( NULL != pb_src );
101 assert( NULL != p_val );
103 if( 1 == i_sizebytes ) {
104 pb_src = DWARF_Common_Read_Byte( &b_size, pb_src, pqw_remain );
105 qw_size = (QWord)b_size;
107 else if( 2 == i_sizebytes ) {
108 pb_src = DWARF_Common_Read_Word( &w_size, pb_src, pqw_remain );
109 qw_size = (QWord)w_size;
111 else if( 4 == i_sizebytes ) {
112 pb_src = DWARF_Common_Read_DWord( &dw_size, pb_src, pqw_remain );
113 qw_size = (QWord)dw_size;
115 else if( 8 == i_sizebytes ) {
116 pb_src = DWARF_Common_Read_QWord( &qw_size, pb_src, pqw_remain );
119 pb_src = DWARF_Common_DecodeULEB128( &qw_size, pb_src, pqw_remain );
122 if( *pqw_remain >= qw_size ) {
123 p_val->qw_size = qw_size;
124 p_val->value.pb_data = pb_src;
125 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_BLOCK;
127 *pqw_remain -= qw_size;
129 else { pb_src = NULL; }
134 /*----------------------------------------------------------------------
135 ----------------------------------------------------------------------*/
137 DWARF_Info_ReadFormat_Strp(
138 LibGoblin_DWARF_DIEValue *p_val,
141 LibGoblin_BinaryInfo *p_binfo,
144 Byte *pb_string = NULL;
147 LibGoblin_SectionInfo *psec_dbgstr;
149 assert( NULL != pb_src );
150 assert( NULL != p_val );
152 psec_dbgstr = Section_GetSectionInfo( p_binfo, LIBGOBLIN_SECTION_ID_DEBUG_STR );
153 assert( NULL != psec_dbgstr );
154 assert( NULL != psec_dbgstr->pb_data );
157 pb_src = DWARF_Common_Read_QWord( &qw_offset, pb_src, pqw_remain );
158 pb_string = psec_dbgstr->pb_data + qw_offset;
160 else if( 4 == b_bits ) {
161 pb_src = DWARF_Common_Read_DWord( &dw_offset, pb_src, pqw_remain );
162 pb_string = psec_dbgstr->pb_data + dw_offset;
165 p_val->value.pstr_value = (char *)pb_string;
166 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_STRING;
173 /*----------------------------------------------------------------------
174 ----------------------------------------------------------------------*/
176 DWARF_Info_ReadFormat_String(
177 LibGoblin_DWARF_DIEValue *p_val,
184 assert( NULL != pb_src );
185 assert( NULL != p_val );
189 while( (0 < *pqw_remain) && ('\0' != *pb_now) ) {
195 if( 0 < *pqw_remain ) {
196 p_val->value.pstr_value = (char *)pb_src;
197 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_STRING;
198 p_val->qw_size = qw_size;
208 /*----------------------------------------------------------------------
209 ----------------------------------------------------------------------*/
211 DWARF_Info_ReadFormat_Address(
212 LibGoblin_DWARF_DIEValue *p_val,
217 assert( NULL != pb_src );
218 assert( NULL != p_val );
220 if( 8 == b_pointersize ) {
221 pb_src = DWARF_Common_Read_QWord(
222 &(p_val->value.qw_value), pb_src, pqw_remain );
223 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_QWORD;
226 else if( 4 == b_pointersize ) {
227 pb_src = DWARF_Common_Read_DWord(
228 &(p_val->value.dw_value), pb_src, pqw_remain );
229 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_DWORD;
232 else if( 2 == b_pointersize ) {
233 pb_src = DWARF_Common_Read_Word(
234 &(p_val->value.w_value), pb_src, pqw_remain );
235 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_WORD;
243 /*----------------------------------------------------------------------
244 ----------------------------------------------------------------------*/
246 DWARF_Info_ReadFormat_Offset(
247 LibGoblin_DWARF_DIEValue *p_val,
250 LibGoblin_BinaryInfo *p_binfo,
253 assert( NULL != pb_src );
254 assert( NULL != p_val );
257 pb_src = DWARF_Common_Read_QWord( &(p_val->value.qw_value), pb_src, pqw_remain );
258 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_QWORD;
261 else if( 4 == b_bits ) {
262 pb_src = DWARF_Common_Read_DWord( &(p_val->value.dw_value), pb_src, pqw_remain );
263 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_DWORD;
271 /*----------------------------------------------------------------------
272 ----------------------------------------------------------------------*/
274 DWARF_Info_ReadFormat_InDirect(
275 LibGoblin_DWARF_DIEValue *p_val,
278 LibGoblin_BinaryInfo *p_binfo,
279 LibGoblin_DWARF_Info_CUHeader *p_cuheader )
284 // Get InDirect DW_FORM_*** value. ---
285 pb_info = DWARF_Common_DecodeULEB128( &qw_size, pb_info, pqw_remains );
286 dw_form = (DWord)qw_size;
288 // Re-Call Read FormatData Function ---
289 pb_info = DWARF_Info_ReadFormat_Data(
290 p_val, pb_info, pqw_remains, dw_form, p_binfo, p_cuheader );
296 /*----------------------------------------------------------------------
297 ----------------------------------------------------------------------*/
299 DWARF_Info_ReadFormat_Data(
300 LibGoblin_DWARF_DIEValue *p_val,
304 LibGoblin_BinaryInfo *p_binfo,
305 LibGoblin_DWARF_Info_CUHeader *p_cuheader )
307 switch( dw_format ) {
308 case DW_FORM_addr: // 0x01: address
309 pb_info = DWARF_Info_ReadFormat_Address(
310 p_val, pb_info, pqw_remains, p_cuheader->b_pointersize );
312 case DW_FORM_block2: // 0x03: block
313 pb_info = DWARF_Info_ReadFormat_Block( p_val, pb_info, pqw_remains, 2);
315 case DW_FORM_block4: // 0x04: block
316 pb_info = DWARF_Info_ReadFormat_Block( p_val, pb_info, pqw_remains, 4);
318 case DW_FORM_data2: // 0x05: const.
319 pb_info = DWARF_Common_Read_Word( &(p_val->value.w_value), pb_info, pqw_remains );
320 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_WORD;
323 case DW_FORM_data4: // 0x06: const. line/loc/mac/rng-ptr
324 pb_info = DWARF_Common_Read_DWord( &(p_val->value.dw_value), pb_info, pqw_remains );
325 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_DWORD;
328 case DW_FORM_data8: // 0x07: const. line/loc/mac/rng-ptr
329 pb_info = DWARF_Common_Read_QWord( &(p_val->value.qw_value), pb_info, pqw_remains );
330 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_QWORD;
333 case DW_FORM_string: // 0x08: string
334 pb_info = DWARF_Info_ReadFormat_String( p_val, pb_info, pqw_remains );
336 case DW_FORM_block: // 0x09: block
337 pb_info = DWARF_Info_ReadFormat_Block( p_val, pb_info, pqw_remains, -1);
339 case DW_FORM_block1: // 0x0a: block
340 pb_info = DWARF_Info_ReadFormat_Block( p_val, pb_info, pqw_remains, 1);
342 case DW_FORM_data1: // 0x0b: const.
343 pb_info = DWARF_Common_Read_Byte( &(p_val->value.b_value), pb_info, pqw_remains );
344 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_BYTE;
347 case DW_FORM_flag: // 0x0c: flag
348 pb_info = DWARF_Common_Read_Byte( &(p_val->value.b_value), pb_info, pqw_remains );
349 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_BYTE;
352 case DW_FORM_sdata: // 0x0d: sdata
353 pb_info = DWARF_Common_DecodeLEB128( &(p_val->value.ii_value), pb_info, pqw_remains );
354 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_INT64;
357 case DW_FORM_strp: // 0x0e: string (in .debug_str section)
358 pb_info = DWARF_Info_ReadFormat_Strp(
359 p_val, pb_info, pqw_remains, p_binfo, p_cuheader->b_offsetsize );
361 case DW_FORM_udata: // 0x0f: const.
362 pb_info = DWARF_Common_DecodeULEB128( &(p_val->value.qw_value), pb_info, pqw_remains );
363 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_QWORD;
366 case DW_FORM_ref_addr: // 0x10: ref.
367 pb_info = DWARF_Info_ReadFormat_Address(
368 p_val, pb_info, pqw_remains, p_cuheader->b_pointersize );
370 case DW_FORM_ref1: // 0x11: ref.
371 pb_info = DWARF_Info_ReadFormat_Ref_inCU(
372 p_val, pb_info, pqw_remains, 1, p_cuheader->pb_custart );
374 case DW_FORM_ref2: // 0x12: ref.
375 pb_info = DWARF_Info_ReadFormat_Ref_inCU(
376 p_val, pb_info, pqw_remains, 2, p_cuheader->pb_custart );
378 case DW_FORM_ref4: // 0x13: ref.
379 pb_info = DWARF_Info_ReadFormat_Ref_inCU(
380 p_val, pb_info, pqw_remains, 4, p_cuheader->pb_custart );
382 case DW_FORM_ref8: // 0x14: ref.
383 pb_info = DWARF_Info_ReadFormat_Ref_inCU(
384 p_val, pb_info, pqw_remains, 8, p_cuheader->pb_custart );
386 case DW_FORM_ref_udata: // 0x15: ref.
387 pb_info = DWARF_Info_ReadFormat_Ref_inCU(
388 p_val, pb_info, pqw_remains, -1, p_cuheader->pb_custart );
390 case DW_FORM_indirect: // 0x16: ref.
391 pb_info = DWARF_Info_ReadFormat_InDirect(
392 p_val, pb_info, pqw_remains, p_binfo, p_cuheader );
394 case DW_FORM_sec_offset: // 0x17:
395 // offset from the beginning of the .debug_line section
396 // to the first byte of the data making up the line number list for the compilation unit.
397 // 1: const. value (size: offsetsize)
398 pb_info = DWARF_Info_ReadFormat_Offset(
399 p_val, pb_info, pqw_remains, p_binfo, p_cuheader->b_offsetsize );
401 case DW_FORM_exprloc: // 0x18:
402 // 1: uLEB128 = length
403 // 2: info. bytes specified by the length(1:) (DWARF expression)
404 pb_info = DWARF_Info_ReadFormat_Block( p_val, pb_info, pqw_remains, -1);
406 case DW_FORM_flag_present: // 0x19:
407 // have NONE value because implicitly flag is TRUE.
410 case DW_FORM_ref_sig8: // 0x20:
411 // 1: pointer (8byte)
412 pb_info = DWARF_Common_Read_QWord( &(p_val->value.qw_value), pb_info, pqw_remains );
413 p_val->b_type = LIBGOBLIN_DWARF_INFO_TYPE_QWORD;
416 case DW_FORM_GNU_ref_alt: // 0x1f20:
417 pb_info = DWARF_Info_ReadFormat_Offset(
418 p_val, pb_info, pqw_remains, p_binfo, p_cuheader->b_offsetsize );
420 case DW_FORM_GNU_strp_alt: // 0x1f21:
421 pb_info = DWARF_Info_ReadFormat_Offset(
422 p_val, pb_info, pqw_remains, p_binfo, p_cuheader->b_offsetsize );
432 /*----------------------------------------------------------------------
433 ----------------------------------------------------------------------*/
435 DWARF_Info_ReadCUHeader(
436 LibGoblin_DWARF_Info_CUHeader *p_cuhead,
438 QWord *pqw_size_info )
445 assert( NULL != p_cuhead );
446 assert( NULL != pb_info );
451 // Read unit_length (4Byte + 8Byte(64bit)) ---
452 pb_info = DWARF_Common_Read_DWord( &dw_dword, pb_info, pqw_size_info );
453 if( NULL == pb_info ) { return NULL; }
455 // 64bit - First 4Byte = 0xffffffff
456 if( ((DWord)0xffffffff) == dw_dword ) {
457 pb_info = DWARF_Common_Read_QWord( &qw_qword, pb_info, pqw_size_info );
458 if( NULL == pb_info ) { return NULL; }
460 p_cuhead->qw_unitsize = (QWord)qw_qword;
462 p_cuhead->b_bits = 64;
463 p_cuhead->b_offsetsize = 8;
465 // 32bit - First 4Byte = value.
467 p_cuhead->qw_unitsize = (QWord)dw_dword;
468 p_cuhead->b_bits = 32;
469 p_cuhead->b_offsetsize = 4;
472 // Read version (2Byte) ---
473 pb_info = DWARF_Common_Read_Word( &(p_cuhead->w_version), pb_info, pqw_size_info );
474 if( NULL == pb_info ) { return NULL; }
477 // Read abbrev_offset (4Byte(32bit), 8Byte(64bit)) ---
478 if( 64 == i_bitflag ) {
479 pb_info = DWARF_Common_Read_QWord( &qw_qword, pb_info, pqw_size_info );
480 if( NULL == pb_info ) { return NULL; }
483 p_cuhead->qw_abbrev_offset = qw_qword;
486 pb_info = DWARF_Common_Read_DWord( &dw_dword, pb_info, pqw_size_info );
487 if( NULL == pb_info ) { return NULL; }
490 p_cuhead->qw_abbrev_offset = (QWord)dw_dword;
493 // Read address_size (1Byte) ---
494 pb_info = DWARF_Common_Read_Byte( &(p_cuhead->b_pointersize), pb_info, pqw_size_info);
495 if( NULL == pb_info ) { return NULL; }
498 p_cuhead->qw_unitsize -= i_readbytes;
501 if( 4 == p_cuhead->w_version ) {
502 // Read type-signature (8Byte) ---
503 pb_info = DWARF_Common_Read_QWord( &qw_qword, pb_info, pqw_size_info );
504 if( NULL == pb_info ) { return NULL; }
507 p_cuhead->qw_type_signature = qw_qword;
509 // Read type_offset (4Byte(32bit), 8Byte(64bit)) ---
510 if( 64 == i_bitflag ) {
511 pb_info = DWARF_Common_Read_QWord( &qw_qword, pb_info, pqw_size_info );
512 if( NULL == pb_info ) { return NULL; }
515 p_cuhead->qw_type_offset = qw_qword;
518 pb_info = DWARF_Common_Read_DWord( &dw_dword, pb_info, pqw_size_info );
519 if( NULL == pb_info ) { return NULL; }
522 p_cuhead->qw_type_offset = (QWord)dw_dword;
531 /*----------------------------------------------------------------------
532 ----------------------------------------------------------------------*/
534 DWARF_Info_RegistSrcFile_fromTagCompileUnit(
535 LibGoblin_BinaryInfo *p_binfo,
536 LibGoblin_BinaryFile *p_bfile,
538 DWARF_AbbrevEntry *p_abbrev,
540 LibGoblin_DWARF_Info_CUHeader *pt_cuheader )
544 char *pstr_srcpath = NULL;
545 char str_temp[DRD64_MAX_PATH+1];
550 DWARF_AbbrevEntry *p_arvnow;
551 LibGoblin_DWARF_DIEValue *p_infoval;
552 LibGoblin_DWARF_DIEValue *p_val;
553 LibGoblin_SrcFile *p_srcfile;
555 assert( NULL != p_binfo );
556 assert( NULL != p_bfile );
558 p_infoval = p_binfo->dwarf.p_infoval;
561 // Read Reference Abbrev-ID ---
562 pb_info = DWARF_Common_DecodeULEB128( &qw_temp, pb_info, &qw_size_cu );
563 dw_arvid = (DWord)qw_temp;
565 if( 0 == dw_arvid ) {
570 p_arvnow = p_abbrev + (dw_arvid - 1);
572 // Read Debug Information Entry (DIE) ---
573 memset( p_infoval, 0x00, sizeof( LibGoblin_DWARF_DIEValue ) * p_arvnow->i_items );
576 for( i_cnt = 0; i_cnt < p_arvnow->i_items; i_cnt++, p_val++ ) {
577 dw_attribute = p_arvnow->dw_attribute[ i_cnt ];
578 dw_format = p_arvnow->dw_format[ i_cnt ];
580 pb_info = DWARF_Info_ReadFormat_Data(
581 p_val, pb_info, &qw_size_cu, dw_format, p_binfo, pt_cuheader );
584 if( 0x00 != p_arvnow->b_children ) { i_childlv++; }
586 // Check compile unit tag ---
587 if( DW_TAG_compile_unit == p_arvnow->dw_tag ) { break; }
589 }while( 0 != qw_size_cu );
591 if( DW_TAG_compile_unit != p_arvnow->dw_tag ) {
595 p_val = p_binfo->dwarf.p_infoval;
596 for( i_cnt = 0; i_cnt < p_arvnow->i_items; i_cnt++, p_val++ ) {
597 if( DW_AT_name == p_arvnow->dw_attribute[ i_cnt ] ) {
598 pstr_srcpath = p_val->value.pstr_value;
603 if( NULL == pstr_srcpath ) {
607 strncpy( str_temp, pstr_srcpath, DRD64_MAX_PATH );
608 p_srcfile = SrcFile_DispenseSrcFile( p_bfile, basename( str_temp ) );
609 if( NULL == p_srcfile ) {
613 strncpy( p_srcfile->str_srcpath, dirname( str_temp ), DRD64_MAX_PATH );
619 /*----------------------------------------------------------------------
620 ----------------------------------------------------------------------*/
621 LIBGOBLIN_DWARF_INFO_EXTERN
624 LibGoblin_BinaryInfo *p_binfo )
639 LibGoblin_SectionInfo *psec_info;
640 LibGoblin_BinaryFile *p_bfile;
641 DWARF_AbbrevEntry *p_abbrev;
642 DWARF_AbbrevEntry *p_arvnow;
643 LibGoblin_DWARF_DIEValue *p_infoval;
644 LibGoblin_DWARF_DIEValue *p_val;
645 LibGoblin_DWARF_Info_CUHeader t_cuheader;
646 LibGoblin_SrcFile *p_srcfile;
648 assert( NULL != p_binfo );
650 p_bfile = BinaryFile_GetBinaryFile( p_binfo->i_binfile );
651 assert( NULL != p_bfile );
653 i_srcfiles = p_bfile->dwarf.i_srcfiles;
655 p_infoval = p_binfo->dwarf.p_infoval;
657 // Get section Info ---
658 psec_info = Section_GetSectionInfo( p_binfo, LIBGOBLIN_SECTION_ID_DEBUG_INFO );
659 assert( NULL != psec_info );
660 if( NULL == psec_info->pb_data ) {
663 pb_info = psec_info->pb_data;
664 qw_size_info = psec_info->qw_size;
667 // Read Compile Unit Header ---
668 pb_custart = pb_info;
669 pb_info = DWARF_Info_ReadCUHeader( &t_cuheader, pb_info, &qw_size_info );
670 if( NULL == pb_info ) {
674 t_cuheader.pb_custart = pb_custart;
675 qw_size_cu = t_cuheader.qw_unitsize;
677 // Read Abbrev for the now compile unit ---
678 i_result = DWARF_Abbrev_ReadAbbrevEntry(
679 &p_abbrev, &i_abbrevs,
680 p_binfo, p_bfile, t_cuheader.qw_abbrev_offset );
682 // Read DW_TAG_compile_unit & Regist SrcFile struct. ---
683 p_srcfile = DWARF_Info_RegistSrcFile_fromTagCompileUnit(
684 p_binfo, p_bfile, pb_info, p_abbrev, qw_size_cu, &t_cuheader );
685 if( NULL != p_srcfile ) {
686 p_srcfile->dwarf.i_abbrevs = i_abbrevs;
687 p_srcfile->dwarf.p_abbrev = p_abbrev;
689 printf( "\n SrcFile: %s, Orig.Path: %s\n",
690 p_srcfile->str_filename, p_srcfile->str_srcpath );
693 printf( " size: %ld, ver:%d, abbrev off.:%ld, addr.size: %d\n",
694 t_cuheader.qw_unitsize,
695 t_cuheader.w_version,
696 t_cuheader.qw_abbrev_offset,
697 t_cuheader.b_pointersize);
700 // Read & Process DWARF info TAG ---
703 // Read Reference Abbrev-ID ---
704 pb_info = DWARF_Common_DecodeULEB128( &qw_temp, pb_info, &qw_size_cu );
705 dw_arvid = (DWord)qw_temp;
707 if( 0 == dw_arvid ) {
712 p_arvnow = p_abbrev + (dw_arvid - 1);
714 // Read Debug Information Entry (DIE) ---
715 memset( p_infoval, 0x00, sizeof( LibGoblin_DWARF_DIEValue ) * p_arvnow->i_items );
718 for( i_cnt = 0; i_cnt < p_arvnow->i_items; i_cnt++, p_val++ ) {
719 dw_attribute = p_arvnow->dw_attribute[ i_cnt ];
720 dw_format = p_arvnow->dw_format[ i_cnt ];
722 pb_info = DWARF_Info_ReadFormat_Data(
723 p_val, pb_info, &qw_size_cu, dw_format, p_binfo, &t_cuheader );
726 if( 0x00 != p_arvnow->b_children ) { i_childlv++; }
728 // Dispatch for generate Rapid-Access Table by DIE-tag
729 i_result = DWARF_Tag_Dispatch( p_binfo, p_bfile, p_srcfile, p_arvnow );
731 Debug_DWARF_PrintDIE( p_binfo, p_abbrev, dw_arvid, i_childlv );
733 }while( 0 != qw_size_cu );
734 qw_size_info -= t_cuheader.qw_unitsize;
736 }while((qw_size_info > 0) && (i_srcfiles > 0));
744 /* EOF of drd64_.c ----------------------------------- */