From 9f6a5f02c49da093ba0e56038ec9819609c9ffd7 Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Sat, 18 May 2019 19:48:20 +0900 Subject: [PATCH] 2019/05/18(Sat) 19:48 (LibGoblin) * WorkBackup (Changing .dwarf_info reading mechanism) --- libgoblin/Makefile | 6 + libgoblin/drd64_libgoblin.h | 1 + libgoblin/drd64_libgoblin_binaryfile.c | 5 +- libgoblin/drd64_libgoblin_dwarf.c | 9 +- libgoblin/drd64_libgoblin_dwarf_abbrev.c | 72 ++++++---- libgoblin/drd64_libgoblin_dwarf_abbrev.h | 6 +- libgoblin/drd64_libgoblin_dwarf_common.c | 11 +- libgoblin/drd64_libgoblin_dwarf_info.c | 230 ++++++++++++++++++++----------- libgoblin/drd64_libgoblin_dwarf_info.h | 6 +- libgoblin/drd64_libgoblin_dwarf_tag.c | 49 +++++++ libgoblin/drd64_libgoblin_dwarf_tag.h | 139 +++++++++++++++++++ libgoblin/drd64_libgoblin_srcfile.c | 8 +- libgoblin/drd64_libgoblin_type.h | 13 +- 13 files changed, 433 insertions(+), 122 deletions(-) create mode 100644 libgoblin/drd64_libgoblin_dwarf_tag.c create mode 100644 libgoblin/drd64_libgoblin_dwarf_tag.h diff --git a/libgoblin/Makefile b/libgoblin/Makefile index 23629a5..f12b6df 100644 --- a/libgoblin/Makefile +++ b/libgoblin/Makefile @@ -72,6 +72,7 @@ OBJS = drd64_libgoblin_api.o \ drd64_libgoblin_dwarf_abbrev.o \ drd64_libgoblin_dwarf_info.o \ drd64_libgoblin_dwarf_line.o \ + drd64_libgoblin_dwarf_tag.o \ drd64_libgoblin_dwarf_common.o \ drd64_libgoblin_debug_elf.o \ drd64_libgoblin_debug_objinfo.o @@ -102,6 +103,7 @@ HEADER = drd64_libgoblin.h \ drd64_libgoblin_dwarf_abbrev.h \ drd64_libgoblin_dwarf_info.h \ drd64_libgoblin_dwarf_line.h \ + drd64_libgoblin_dwarf_tag.h \ drd64_libgoblin_dwarf_common.h \ drd64_libgoblin_dwarf_str.h \ drd64_libgoblin_debug_elf.h \ @@ -220,6 +222,10 @@ drd64_libgoblin_dwarf_line.o: \ drd64_libgoblin_dwarf_line.c $(HEADER) $(CC) -c -o drd64_libgoblin_dwarf_line.o $(FLAGS_DEBUG) \ drd64_libgoblin_dwarf_line.c +drd64_libgoblin_dwarf_tag.o: \ + drd64_libgoblin_dwarf_tag.c $(HEADER) + $(CC) -c -o drd64_libgoblin_dwarf_tag.o $(FLAGS_DEBUG) \ + drd64_libgoblin_dwarf_tag.c drd64_libgoblin_dwarf_common.o: drd64_libgoblin_dwarf_common.c $(HEADER) $(CC) -c -o drd64_libgoblin_dwarf_common.o $(FLAGS_DEBUG) \ drd64_libgoblin_dwarf_common.c diff --git a/libgoblin/drd64_libgoblin.h b/libgoblin/drd64_libgoblin.h index f4a41a4..781dc0e 100644 --- a/libgoblin/drd64_libgoblin.h +++ b/libgoblin/drd64_libgoblin.h @@ -96,6 +96,7 @@ Comment: #include"drd64_libgoblin_dwarf_abbrev.h" #include"drd64_libgoblin_dwarf_info.h" #include"drd64_libgoblin_dwarf_line.h" +#include"drd64_libgoblin_dwarf_tag.h" #include"drd64_libgoblin_dwarf.h" #include"drd64_libgoblin_dwarf_str.h" #include"drd64_libgoblin_debug_elf.h" diff --git a/libgoblin/drd64_libgoblin_binaryfile.c b/libgoblin/drd64_libgoblin_binaryfile.c index 1bf754b..3f5a331 100644 --- a/libgoblin/drd64_libgoblin_binaryfile.c +++ b/libgoblin/drd64_libgoblin_binaryfile.c @@ -92,8 +92,9 @@ void if( NULL != p_binfile->dwarf.p_abbrev ) { free( p_binfile->dwarf.p_abbrev ); - p_binfile->dwarf.p_abbrev = NULL; - p_binfile->dwarf.i_abbrevs = 0; + p_binfile->dwarf.p_abbrev = NULL; + p_binfile->dwarf.i_abbrevs_alloc = 0; + p_binfile->dwarf.i_abbrevs_max = 0; } memset( p_binfile, 0x00, sizeof( LibGoblin_BinaryFile ) ); diff --git a/libgoblin/drd64_libgoblin_dwarf.c b/libgoblin/drd64_libgoblin_dwarf.c index b8eaccb..8fd52c3 100644 --- a/libgoblin/drd64_libgoblin_dwarf.c +++ b/libgoblin/drd64_libgoblin_dwarf.c @@ -129,7 +129,7 @@ int LibGoblin_DwarfAbbrev_Read( p_bin, i_abbrevs ); */ // Read .debug_abbrev section - LibGoblin_DwarfInfo_Analyze( p_bin ); +// LibGoblin_DwarfInfo_Analyze( p_bin ); // Read .debug_line section LibGoblin_DwarfLine_Analyze( p_bin ); @@ -150,7 +150,12 @@ int { int i_result; - i_result = DWARF_Abbrev_Read( p_binfo ); + i_result = DWARF_Abbrev_AllocMemory( p_binfo ); + if( 0x00 != i_result ) { + return 0x01; + } + + i_result = DWARF_Info_Read( p_binfo ); if( 0x00 != i_result ) { return 0x01; } diff --git a/libgoblin/drd64_libgoblin_dwarf_abbrev.c b/libgoblin/drd64_libgoblin_dwarf_abbrev.c index f017b35..3528699 100644 --- a/libgoblin/drd64_libgoblin_dwarf_abbrev.c +++ b/libgoblin/drd64_libgoblin_dwarf_abbrev.c @@ -57,7 +57,7 @@ void assert( NULL != p_bfile ); p_arvnow = p_bfile->dwarf.p_abbrev; - for( i_cnt = 0; i_cnt < p_bfile->dwarf.i_abbrevs; i_cnt++, p_arvnow++ ) { + for( i_cnt = 0; i_cnt < p_bfile->dwarf.i_abbrevs_max; i_cnt++, p_arvnow++ ) { printf(" [ID= %2d] TAG= %02xh Child=%s\n", p_arvnow->dw_id, p_arvnow->dw_tag, @@ -151,39 +151,52 @@ Byte * /*---------------------------------------------------------------------- ----------------------------------------------------------------------*/ +LIBGOBLIN_DWARF_ABBREV_EXTERN int DWARF_Abbrev_ReadAbbrevEntry( + DWARF_AbbrevEntry **pp_abbrev, + int *pi_abbrevs, LibGoblin_BinaryInfo *p_binfo, - LibGoblin_BinaryFile *p_bfile ) + LibGoblin_BinaryFile *p_bfile, + QWord qw_offset ) { int i_abbrevs; int i_items; + int i_count; Byte *pb_data; Byte b_children; QWord qw_temp; QWord qw_remain; DWord dw_abbrev_num; + DWord dw_before_num; DWord dw_tag; DWord dw_attribute; DWord dw_format; LibGoblin_SectionInfo *psec_abbrev; DWARF_AbbrevEntry *p_arvnow; + assert( NULL != pp_abbrev ); + assert( NULL != pi_abbrevs ); assert( NULL != p_binfo ); assert( NULL != p_bfile ); + *pp_abbrev = NULL; + *pi_abbrevs = 0; + // Get .debug_abbrev section Info --- psec_abbrev = Section_GetSectionInfo( p_binfo, LIBGOBLIN_SECTION_ID_DEBUG_ABBREV ); assert( NULL != psec_abbrev ); if( NULL == psec_abbrev->pb_data ) { return 0x01; } - pb_data = psec_abbrev->pb_data; - qw_remain = psec_abbrev->qw_size; + pb_data = psec_abbrev->pb_data + qw_offset; + qw_remain = p_bfile->dwarf.qw_abbrev_unreadsz; - i_abbrevs = p_bfile->dwarf.i_abbrevs; - p_arvnow = p_bfile->dwarf.p_abbrev; + i_abbrevs = p_bfile->dwarf.i_abbrevs_max; + p_arvnow = p_bfile->dwarf.p_abbrev + i_abbrevs; + i_count = 0; + dw_before_num = 0; do { // Read Abbrev Number --- pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_remain ); @@ -193,14 +206,12 @@ int pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_remain ); dw_tag = (DWord)qw_temp; + if(( 0x00 == dw_tag ) || (dw_abbrev_num < dw_before_num )) { break; } + /* Read IsChildren */ b_children = *pb_data++; qw_remain--; - p_arvnow->dw_id = dw_abbrev_num; - p_arvnow->dw_tag = dw_tag; - p_arvnow->b_children = b_children; - i_items = -1; do { i_items++; @@ -218,17 +229,27 @@ int }while((0x00 != dw_attribute) && (0x00 != dw_format) && (qw_remain > 0) ); - p_arvnow->i_items = i_items; - p_arvnow++; - - /* Skip Byte for Next Compile-Unit Abbrev. */ + // Skip Byte for Abbrev if( 0x00 == *pb_data ) { pb_data++; qw_remain--; } + p_arvnow->dw_id = dw_abbrev_num; + p_arvnow->dw_tag = dw_tag; + p_arvnow->b_children = b_children; + p_arvnow->i_items = i_items; + p_arvnow++; + p_bfile->dwarf.i_abbrevs_max++; + p_bfile->dwarf.qw_abbrev_unreadsz = qw_remain; + dw_before_num = dw_abbrev_num; + i_count++; + }while((qw_remain > 0) && (dw_tag != 0x00)); + *pp_abbrev = p_bfile->dwarf.p_abbrev + i_abbrevs; + *pi_abbrevs = i_count; + return 0x00; } @@ -239,6 +260,7 @@ int DWARF_Abbrev_GetItems( int *pi_filenum, int *pi_abbrevs, + QWord *pqw_size, LibGoblin_BinaryInfo *p_binfo ) { Byte *pb_data; @@ -259,8 +281,9 @@ int if( NULL == psec_abbrev->pb_data ) { return 0x01; } - pb_data = psec_abbrev->pb_data; - qw_size = psec_abbrev->qw_size; + pb_data = psec_abbrev->pb_data; + qw_size = psec_abbrev->qw_size; + *pqw_size = psec_abbrev->qw_size; *pi_filenum = 0; *pi_abbrevs = 0; @@ -311,12 +334,13 @@ int ----------------------------------------------------------------------*/ LIBGOBLIN_DWARF_ABBREV_EXTERN int - DWARF_Abbrev_Read( + DWARF_Abbrev_AllocMemory( LibGoblin_BinaryInfo *p_binfo ) { int i_result; int i_filenums = 0; int i_abbrevs = 0; + QWord qw_size; DWARF_AbbrevEntry *p_abbrev; LibGoblin_BinaryFile *p_bfile; @@ -324,7 +348,7 @@ int assert( NULL != p_bfile ); // Count Abbrevs --- - i_result = DWARF_Abbrev_GetItems( &i_filenums, &i_abbrevs, p_binfo ); + i_result = DWARF_Abbrev_GetItems( &i_filenums, &i_abbrevs, &qw_size, p_binfo ); if( 0x00 != i_result ) { return 0x01; } @@ -334,14 +358,12 @@ int if( NULL == p_abbrev ) { return 0x02; } - p_bfile->dwarf.p_abbrev = p_abbrev; - p_bfile->dwarf.i_abbrevs = i_abbrevs; + p_bfile->dwarf.p_abbrev = p_abbrev; + p_bfile->dwarf.i_abbrevs_alloc = i_abbrevs; + p_bfile->dwarf.i_abbrevs_max = 0; + p_bfile->dwarf.qw_abbrev_unreadsz = qw_size; - // Read Abbrev --- - i_result = DWARF_Abbrev_ReadAbbrevEntry( p_binfo, p_bfile ); - if( 0x00 != i_result ) { - return 0x01; - } + p_bfile->dwarf.i_srcfiles = i_filenums; return 0x00; } diff --git a/libgoblin/drd64_libgoblin_dwarf_abbrev.h b/libgoblin/drd64_libgoblin_dwarf_abbrev.h index c95a75a..cb68e57 100644 --- a/libgoblin/drd64_libgoblin_dwarf_abbrev.h +++ b/libgoblin/drd64_libgoblin_dwarf_abbrev.h @@ -51,7 +51,11 @@ LIBGOBLIN_DWARF_ABBREV_EXTERN void Debug_DWARF_Abbrev_Dump( LibGoblin_BinaryInfo *p_binfo, Byte b_level ); LIBGOBLIN_DWARF_ABBREV_EXTERN - int DWARF_Abbrev_Read( LibGoblin_BinaryInfo *p_binfo ); + int DWARF_Abbrev_ReadAbbrevEntry( + DWARF_AbbrevEntry **pp_abbrev, int *pi_abbrevs, + LibGoblin_BinaryInfo *p_binfo, LibGoblin_BinaryFile *p_bfile, QWord qw_offset ); +LIBGOBLIN_DWARF_ABBREV_EXTERN + int DWARF_Abbrev_AllocMemory( LibGoblin_BinaryInfo *p_binfo ); // old --- diff --git a/libgoblin/drd64_libgoblin_dwarf_common.c b/libgoblin/drd64_libgoblin_dwarf_common.c index dc21d1d..cf9f6bb 100644 --- a/libgoblin/drd64_libgoblin_dwarf_common.c +++ b/libgoblin/drd64_libgoblin_dwarf_common.c @@ -115,6 +115,7 @@ Byte * /*---------------------------------------------------------------------- ----------------------------------------------------------------------*/ +/* LIBGOBLIN_DWARF_COMMON_EXTERN Byte * LibGoblin_DwarfCommon_Read_CUHeader( @@ -133,7 +134,7 @@ Byte * i_readbytes = 0; i_bitflag = 32; - /* Read unit_length (4Byte + 8Byte(64bit)) */ + // Read unit_length (4Byte + 8Byte(64bit)) pb_data = LibGoblin_DwarfCommon_Read_DWord( &dw_dword, pb_data, &qw_size_info ); if( NULL == pb_data ) { return NULL; } @@ -152,13 +153,13 @@ Byte * p_cuhead->b_bits = 32; } - /* Read version (2Byte) */ + // Read version (2Byte) pb_data = LibGoblin_DwarfCommon_Read_Word( &(p_cuhead->w_version), pb_data, &qw_size_info ); if( NULL == pb_data ) { return NULL; } i_readbytes = 2; - /* Read abbrev_offset (4Byte(32bit), 8Byte(64bit)) */ + // Read abbrev_offset (4Byte(32bit), 8Byte(64bit)) if( 64 == i_bitflag ) { pb_data = LibGoblin_DwarfCommon_Read_QWord( &qw_qword, pb_data, &qw_size_info ); @@ -176,7 +177,7 @@ Byte * p_cuhead->qw_abbrev_offset = (QWord)dw_dword; } - /* Read address_size (1Byte) */ + // Read address_size (1Byte) pb_data = LibGoblin_DwarfCommon_Read_Byte( &(p_cuhead->b_pointersize), pb_data, &qw_size_info); if( NULL == pb_data ) { return NULL; } @@ -186,7 +187,7 @@ Byte * return pb_data; } - +*/ /*---------------------------------------------------------------------- ----------------------------------------------------------------------*/ diff --git a/libgoblin/drd64_libgoblin_dwarf_info.c b/libgoblin/drd64_libgoblin_dwarf_info.c index ed0fe8a..f45b654 100644 --- a/libgoblin/drd64_libgoblin_dwarf_info.c +++ b/libgoblin/drd64_libgoblin_dwarf_info.c @@ -263,7 +263,7 @@ Byte * LibGoblin_Dwarf_AbbrevEntry t_abbentry; //printf(" pnt: %p ", pb_src); - /* Read Reference Abbrev-ID */ + // Read Reference Abbrev-ID pb_src = DWARF_Common_DecodeULEB128( &qw_temp, pb_src, pqw_remains ); dw_abbrev = (DWord)qw_temp; @@ -272,7 +272,7 @@ Byte * if( 0x00000000 == dw_abbrev ) { return pb_src; } - /* Set Reference Abbrev */ + // Set Reference Abbrev p_abbrev = (pt_srcfile->p_abbrev_info) + (dw_abbrev - 1 ); if( NULL == p_abbrev ) { return NULL; } @@ -295,121 +295,121 @@ Byte * p_die->dw_format[ i_cnt ] = dw_format; switch( dw_format ) { - case DW_FORM_addr: /* 0x01: address */ + case DW_FORM_addr: // 0x01: address pb_src = LibGoblin_DwarfInfo_ReadFormat_Address( &(p_die->t_value[i_cnt]), pb_src, pqw_remains, &b_type, (int)(p_cuheader->b_pointersize) ); break; - case DW_FORM_block2: /* 0x03: block */ + case DW_FORM_block2: // 0x03: block pb_src = LibGoblin_DwarfInfo_ReadFormat_Block( &(p_die->t_value[i_cnt]), pb_src, pqw_remains, &b_type, 2); break; - case DW_FORM_block4: /* 0x04: block */ + case DW_FORM_block4: // 0x04: block pb_src = LibGoblin_DwarfInfo_ReadFormat_Block( &(p_die->t_value[i_cnt]), pb_src, pqw_remains, &b_type, 4); break; - case DW_FORM_data2: /* 0x05: const. */ + case DW_FORM_data2: // 0x05: const. pb_src = LibGoblin_DwarfCommon_Read_Word( &(p_die->t_value[i_cnt].w_value), pb_src, pqw_remains ); b_type = LIBGOBLIN_DWARF_INFO_TYPE_WORD; break; - case DW_FORM_data4: /* 0x06: const. line/loc/mac/rng-ptr */ + case DW_FORM_data4: // 0x06: const. line/loc/mac/rng-ptr pb_src = LibGoblin_DwarfCommon_Read_DWord( &(p_die->t_value[i_cnt].dw_value), pb_src, pqw_remains ); b_type = LIBGOBLIN_DWARF_INFO_TYPE_DWORD; break; - case DW_FORM_data8: /* 0x07: const. line/loc/mac/rng-ptr */ + case DW_FORM_data8: // 0x07: const. line/loc/mac/rng-ptr pb_src = LibGoblin_DwarfCommon_Read_QWord( &(p_die->t_value[i_cnt].qw_value), pb_src, pqw_remains ); b_type = LIBGOBLIN_DWARF_INFO_TYPE_QWORD; break; - case DW_FORM_string: /* 0x08: string */ + case DW_FORM_string: // 0x08: string pb_src = LibGoblin_DwarfInfo_ReadFormat_String( &(p_die->t_value[i_cnt]), pb_src, pqw_remains, &b_type); break; - case DW_FORM_block: /* 0x09: block */ + case DW_FORM_block: // 0x09: block pb_src = LibGoblin_DwarfInfo_ReadFormat_Block( &(p_die->t_value[i_cnt]), pb_src, pqw_remains, &b_type, -1); break; - case DW_FORM_block1: /* 0x0a: block */ + case DW_FORM_block1: // 0x0a: block pb_src = LibGoblin_DwarfInfo_ReadFormat_Block( &(p_die->t_value[i_cnt]), pb_src, pqw_remains, &b_type, 1); break; - case DW_FORM_data1: /* 0x0b: const. */ + case DW_FORM_data1: // 0x0b: const. pb_src = LibGoblin_DwarfCommon_Read_Byte( &(p_die->t_value[i_cnt].b_value), pb_src, pqw_remains ); b_type = LIBGOBLIN_DWARF_INFO_TYPE_BYTE; break; - case DW_FORM_flag: /* 0x0c: flag */ + case DW_FORM_flag: // 0x0c: flag pb_src = LibGoblin_DwarfCommon_Read_Byte( &(p_die->t_value[i_cnt].b_value), pb_src, pqw_remains ); b_type = LIBGOBLIN_DWARF_INFO_TYPE_BYTE; break; - case DW_FORM_sdata: /* 0x0d: sdata */ + case DW_FORM_sdata: // 0x0d: sdata pb_src = DWARF_Common_DecodeLEB128( &(p_die->t_value[i_cnt].ii_value), pb_src, pqw_remains ); b_type = LIBGOBLIN_DWARF_INFO_TYPE_INT64; break; - case DW_FORM_strp: /* 0x0e: string */ + case DW_FORM_strp: // 0x0e: string pb_src = LibGoblin_DwarfInfo_ReadFormat_Strp( &(p_die->t_value[i_cnt]), pb_src, pqw_remains, &b_type, p_cuheader->b_bits ); // XXX reference for .debug_str break; - case DW_FORM_udata: /* 0x0f: const. */ + case DW_FORM_udata: // 0x0f: const. pb_src = DWARF_Common_DecodeULEB128( &(p_die->t_value[i_cnt].qw_value), pb_src, pqw_remains ); b_type = LIBGOBLIN_DWARF_INFO_TYPE_QWORD; break; - case DW_FORM_ref_addr: /* 0x10: ref. */ + case DW_FORM_ref_addr: // 0x10: ref. pb_src = LibGoblin_DwarfInfo_ReadFormat_Address( &(p_die->t_value[i_cnt]),pb_src, pqw_remains, &b_type, (int)(p_cuheader->b_pointersize) ); break; - case DW_FORM_ref1: /* 0x11: ref. */ + case DW_FORM_ref1: // 0x11: ref. pb_src = LibGoblin_DwarfInfo_ReadFormat_Ref_inCU( &(p_die->t_value[i_cnt]), pb_src, pqw_remains, &b_type, 1, pt_srcfile->t_infosec.pb_pos ); break; - case DW_FORM_ref2: /* 0x12: ref. */ + case DW_FORM_ref2: // 0x12: ref. pb_src = LibGoblin_DwarfInfo_ReadFormat_Ref_inCU( &(p_die->t_value[i_cnt]), pb_src, pqw_remains, &b_type, 2, pt_srcfile->t_infosec.pb_pos ); break; - case DW_FORM_ref4: /* 0x13: ref. */ + case DW_FORM_ref4: // 0x13: ref. pb_src = LibGoblin_DwarfInfo_ReadFormat_Ref_inCU( &(p_die->t_value[i_cnt]), pb_src, pqw_remains, &b_type, 4, pt_srcfile->t_infosec.pb_pos ); break; - case DW_FORM_ref8: /* 0x14: ref. */ + case DW_FORM_ref8: // 0x14: ref. pb_src = LibGoblin_DwarfInfo_ReadFormat_Ref_inCU( &(p_die->t_value[i_cnt]), pb_src, pqw_remains, &b_type, 8, pt_srcfile->t_infosec.pb_pos ); break; - case DW_FORM_ref_udata: /* 0x15: ref. */ + case DW_FORM_ref_udata: // 0x15: ref. pb_src = LibGoblin_DwarfInfo_ReadFormat_Ref_inCU( &(p_die->t_value[i_cnt]), pb_src, pqw_remains, &b_type, -1, pt_srcfile->t_infosec.pb_pos ); break; - case DW_FORM_indirect: /* 0x16: ref. */ + case DW_FORM_indirect: // 0x16: ref. puts("a"); break; default: @@ -425,46 +425,76 @@ Byte * /*---------------------------------------------------------------------- ----------------------------------------------------------------------*/ Byte * - LibGoblin_DwarfInfo_ReadCompileUnit( - LibGoblin_Dwarf_SourceFile *p_src, - Byte *pb_data, + DWARF_Info_ReadCUHeader( + LibGoblin_DwarfCommon_CUHeader *p_cuhead, + Byte *pb_info, QWord *pqw_size_info ) { - QWord qw_unitsize; - LibGoblin_DwarfCommon_CUHeader t_cuheader; - LibGoblin_Dwarf_DIE t_die; - - assert( NULL != p_src ); - assert( NULL != pb_data ); - - if( 0 == *pqw_size_info ) { return NULL; } - - /* Read Compile Unit Header */ - pb_data = LibGoblin_DwarfCommon_Read_CUHeader( - &t_cuheader, pb_data, *pqw_size_info); - if( NULL == pb_data ) { return NULL; } - - qw_unitsize = t_cuheader.qw_unitsize; + int i_bitflag; + int i_readbytes; + DWord dw_dword; + QWord qw_qword; + + assert( NULL != p_cuhead ); + assert( NULL != pb_info ); + + i_readbytes = 0; + i_bitflag = 32; + + // Read unit_length (4Byte + 8Byte(64bit)) --- + pb_info = LibGoblin_DwarfCommon_Read_DWord( + &dw_dword, pb_info, pqw_size_info ); + if( NULL == pb_info ) { return NULL; } + + // 64bit - First 4Byte = 0xffffffff + if( ((DWord)0xffffffff) == dw_dword ) { + pb_info = LibGoblin_DwarfCommon_Read_QWord( + &qw_qword, pb_info, pqw_size_info ); + if( NULL == pb_info ) { return NULL; } + + p_cuhead->qw_unitsize = (QWord)qw_qword; + i_bitflag = 64; + p_cuhead->b_bits = 64; + } + // 32bit - First 4Byte = value. + else { + p_cuhead->qw_unitsize = (QWord)dw_dword; + p_cuhead->b_bits = 32; + } -/* printf( "size: %ld, ver:%d, abbrev off.:%ld, addr.size: %d\n", - t_cuheader.qw_unitsize, - t_cuheader.w_version, - t_cuheader.qw_abbrev_offset, - t_cuheader.b_pointersize); */ + // Read version (2Byte) --- + pb_info = LibGoblin_DwarfCommon_Read_Word( + &(p_cuhead->w_version), pb_info, pqw_size_info ); + if( NULL == pb_info ) { return NULL; } + i_readbytes = 2; - do { - /* Read Debug Information Entry (DIE */ - pb_data = LibGoblin_DwarfInfo_ReadDIE( - &t_die, pb_data, &qw_unitsize, p_src, &t_cuheader ); + // Read abbrev_offset (4Byte(32bit), 8Byte(64bit)) --- + if( 64 == i_bitflag ) { + pb_info = LibGoblin_DwarfCommon_Read_QWord( + &qw_qword, pb_info, pqw_size_info ); + if( NULL == pb_info ) { return NULL; } + i_readbytes += 8; - /* Dispatch for generate Rapid-Access Table by DIE-tag */ + p_cuhead->qw_abbrev_offset = qw_qword; + } + else { + pb_info = LibGoblin_DwarfCommon_Read_DWord( + &dw_dword, pb_info, pqw_size_info ); + if( NULL == pb_info ) { return NULL; } + i_readbytes += 4; - }while( 0 != qw_unitsize ); + p_cuhead->qw_abbrev_offset = (QWord)dw_dword; + } - puts( "OKOK"); - *pqw_size_info -= t_cuheader.qw_unitsize; + // Read address_size (1Byte) --- + pb_info = LibGoblin_DwarfCommon_Read_Byte( + &(p_cuhead->b_pointersize), pb_info, pqw_size_info); + if( NULL == pb_info ) { return NULL; } + i_readbytes += 1; - return pb_data; + p_cuhead->qw_unitsize -= i_readbytes; + + return pb_info; } @@ -472,43 +502,79 @@ Byte * ----------------------------------------------------------------------*/ LIBGOBLIN_DWARF_INFO_EXTERN int - LibGoblin_DwarfInfo_Analyze( - LibGoblin_BinaryInfo *p_bin ) + DWARF_Info_Read( + LibGoblin_BinaryInfo *p_binfo ) { - int i_srcfiles; - Byte *pb_data; - QWord qw_size_info; - LibGoblin_Dwarf_SourceFile *p_src; - LibGoblin_Debug_Dwarf *p_dwarf; + int i_result; + int i_srcfiles; + Byte *pb_info; + Byte *pb_abbrev; + DWord dw_arvid; + QWord qw_temp; + QWord qw_size_cu; + QWord qw_size_info; + LibGoblin_SectionInfo *psec_info; + LibGoblin_SectionInfo *psec_abbrev; + LibGoblin_BinaryFile *p_bfile; + LibGoblin_DwarfCommon_CUHeader t_cuheader; + LibGoblin_Dwarf_DIE t_die; + DWARF_AbbrevEntry *p_abbrev; + DWARF_AbbrevEntry *p_arvnow; + int i_abbrevs; - assert( NULL != p_bin ); + assert( NULL != p_binfo ); - p_dwarf = (LibGoblin_Debug_Dwarf *)p_bin->p_debug; - assert( NULL != p_dwarf ); + p_bfile = BinaryFile_GetBinaryFile( p_binfo->i_binfile ); + assert( NULL != p_bfile ); + + i_srcfiles = p_bfile->dwarf.i_srcfiles; + + // Get section Info --- + psec_info = Section_GetSectionInfo( p_binfo, LIBGOBLIN_SECTION_ID_DEBUG_INFO ); + assert( NULL != psec_info ); + if( NULL == psec_info->pb_data ) { + return 0x01; + } + pb_info = psec_info->pb_data; + qw_size_info = psec_info->qw_size; + + //do { + // Read Compile Unit Header --- + pb_info = DWARF_Info_ReadCUHeader( &t_cuheader, pb_info, &qw_size_info ); + if( NULL == pb_info ) { return NULL; } + + qw_size_cu = t_cuheader.qw_unitsize; + +/* + printf( "size: %ld, ver:%d, abbrev off.:%ld, addr.size: %d\n", + t_cuheader.qw_unitsize, + t_cuheader.w_version, + t_cuheader.qw_abbrev_offset, + t_cuheader.b_pointersize); +*/ - i_srcfiles = p_dwarf->i_srcfilenum; + // Read Abbrev --- + i_result = DWARF_Abbrev_ReadAbbrevEntry( + &p_abbrev, &i_abbrevs, + p_binfo, p_bfile, t_cuheader.qw_abbrev_offset ); - p_src = p_dwarf->p_src; - assert( NULL != p_src ); + do { + // Read Reference Abbrev-ID --- + pb_info = DWARF_Common_DecodeULEB128( &qw_temp, pb_info, &qw_size_cu ); + dw_arvid = (DWord)qw_temp; + //assert( 0 < dw_arvid ); + p_arvnow = p_abbrev + (dw_arvid - 1); - /* Get .debug_abbrev section Info */ - pb_data = ELF_GetSection( - &qw_size_info, p_bin, - LIBGOBLIN_SECTION_ID_DEBUG_INFO ); - if( NULL == pb_data ) { return 0x01; } - do { - p_src->t_infosec.pb_pos = pb_data; + // Read Debug Information Entry (DIE) + //pb_data = LibGoblin_DwarfInfo_ReadDIE( &t_die, pb_data, &qw_size_cu, p_src, &t_cuheader ); - /* Analyze .debug_info compile unit */ - pb_data = LibGoblin_DwarfInfo_ReadCompileUnit( - p_src, pb_data, &qw_size_info ); - if( NULL == pb_data) { return 0x02; } + // Dispatch for generate Rapid-Access Table by DIE-tag - p_src++; - i_srcfiles--; + }while( 0 != qw_size_cu ); + qw_size_info -= t_cuheader.qw_unitsize; - }while((qw_size_info > 0) && (i_srcfiles > 0)); + //}while((qw_size_info > 0) && (i_srcfiles > 0)); return 0x00; } diff --git a/libgoblin/drd64_libgoblin_dwarf_info.h b/libgoblin/drd64_libgoblin_dwarf_info.h index e1bba21..a8593a2 100644 --- a/libgoblin/drd64_libgoblin_dwarf_info.h +++ b/libgoblin/drd64_libgoblin_dwarf_info.h @@ -93,11 +93,15 @@ typedef struct { Byte *pb_pos; } LibGoblin_Dwarf_InfoSection; - +/* LIBGOBLIN_DWARF_INFO_EXTERN int LibGoblin_DwarfInfo_Analyze( LibGoblin_BinaryInfo *p_bin ); +*/ + +LIBGOBLIN_DWARF_INFO_EXTERN + int DWARF_Info_Read( LibGoblin_BinaryInfo *p_binfo ); #endif /* DRD64_HEADER_LIBGOBLIN_BINFO */ diff --git a/libgoblin/drd64_libgoblin_dwarf_tag.c b/libgoblin/drd64_libgoblin_dwarf_tag.c new file mode 100644 index 0000000..fd3833d --- /dev/null +++ b/libgoblin/drd64_libgoblin_dwarf_tag.c @@ -0,0 +1,49 @@ +/*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64 + + D r . D e a m o n 6 4 + for INTEL64(R), AMD64(R) + + Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/ + +/* File Info ----------------------------------------------------------- +File: drd64_.c +Function: +Comment: +----------------------------------------------------------------------*/ + +#define DRD64_SRC_LIBGOBLIN_DWARF_TAG +#include"drd64_libgoblin.h" + +/*---------------------------------------------------------------------- +----------------------------------------------------------------------*/ + + +/*---------------------------------------------------------------------- +----------------------------------------------------------------------*/ + + + +/* EOF of drd64_.c ----------------------------------- */ diff --git a/libgoblin/drd64_libgoblin_dwarf_tag.h b/libgoblin/drd64_libgoblin_dwarf_tag.h new file mode 100644 index 0000000..376932b --- /dev/null +++ b/libgoblin/drd64_libgoblin_dwarf_tag.h @@ -0,0 +1,139 @@ +/*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64 + + D r . D e a m o n 6 4 + for INTEL64(R), AMD64(R) + + Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/ + +/* File Info ----------------------------------------------------------- +File: drd64_.h +Function: Header +Comment: +----------------------------------------------------------------------*/ + +#ifndef DRD64_HEADER_LIBGOBLIN_DWARF_TAG +#define DRD64_HEADER_LIBGOBLIN_DWARF_TAG + +#include"drd64_libgoblin.h" + +#ifdef DRD64_SRC_LIBGOBLIN_DWARF_TAG + #define LIBGOBLIN_DWARF_TAG_EXTERN +#else + #define LIBGOBLIN_DWARF_TAG_EXTERN extern +#endif + +#define LIBGOBLIN_DWARF_TAG_MAX 128 +#define LIBGOBLIN_DWARF_TAG_DEFAULT_MAX 0x43 + +typedef struct { + DWord dw_tag; + int (* DWARF_Tag_Proc)( LibGoblin_BinaryInfo *p_binfo ); +} DWARF_TagFunction; + +#ifdef DRD64_SRC_LIBGOBLIN_DWARF_TAG +DWARF_TagFunction dwarf_tag[LIBGOBLIN_DWARF_TAG_MAX] = { + { DW_TAG_array_type, NULL }, // 0x01 + { DW_TAG_class_type, NULL }, // 0x02 + { DW_TAG_entry_point, NULL }, // 0x03 + { DW_TAG_enumeration_type, NULL }, // 0x04 + { DW_TAG_formal_parameter, NULL }, // 0x05 + { DW_TAG_imported_declaration, NULL }, // 0x08 + { DW_TAG_label, NULL }, // 0x0a + { DW_TAG_lexical_block, NULL }, // 0x0b + { DW_TAG_member, NULL }, // 0x0d + { DW_TAG_pointer_type, NULL }, // 0x0f + { DW_TAG_reference_type, NULL }, // 0x10 + { DW_TAG_compile_unit, NULL }, // 0x11 + { DW_TAG_string_type, NULL }, // 0x12 + { DW_TAG_structure_type, NULL }, // 0x13 + { DW_TAG_subroutine_type, NULL }, // 0x15 + { DW_TAG_typedef, NULL }, // 0x16 + { DW_TAG_union_type, NULL }, // 0x17 + { DW_TAG_unspecified_parameters, NULL }, // 0x18 + { DW_TAG_variant, NULL }, // 0x19 + { DW_TAG_common_block, NULL }, // 0x1a + { DW_TAG_common_inclusion, NULL }, // 0x1b + { DW_TAG_inheritance, NULL }, // 0x1c + { DW_TAG_inlined_subroutine, NULL }, // 0x1d + { DW_TAG_module, NULL }, // 0x1e + { DW_TAG_ptr_to_member_type, NULL }, // 0x1f + { DW_TAG_set_type, NULL }, // 0x20 + { DW_TAG_subrange_type, NULL }, // 0x21 + { DW_TAG_with_stmt, NULL }, // 0x22 + { DW_TAG_access_declaration, NULL }, // 0x23 + { DW_TAG_base_type, NULL }, // 0x24 + { DW_TAG_catch_block, NULL }, // 0x25 + { DW_TAG_const_type, NULL }, // 0x26 + { DW_TAG_constant, NULL }, // 0x27 + { DW_TAG_enumerator, NULL }, // 0x28 + { DW_TAG_friend, NULL }, // 0x2a + { DW_TAG_namelist, NULL }, // 0x2b + { DW_TAG_namelist_item, NULL }, // 0x2c + { DW_TAG_packed_type, NULL }, // 0x2d + { DW_TAG_subprogram, NULL }, // 0x2e + { DW_TAG_template_type_parameter, NULL }, // 0x2f + { DW_TAG_template_type_param, NULL }, // 0x2f + { DW_TAG_template_value_parameter, NULL }, // 0x30 + { DW_TAG_template_value_param, NULL }, // 0x30 + { DW_TAG_thrown_type, NULL }, // 0x31 + { DW_TAG_try_block, NULL }, // 0x32 + { DW_TAG_variant_part, NULL }, // 0x33 + { DW_TAG_variable, NULL }, // 0x34 + { DW_TAG_volatile_type, NULL }, // 0x35 + { DW_TAG_dwarf_procedure, NULL }, // 0x36 + { DW_TAG_restrict_type, NULL }, // 0x37 + { DW_TAG_interface_type, NULL }, // 0x38 + { DW_TAG_namespace, NULL }, // 0x39 + { DW_TAG_imported_module, NULL }, // 0x3a + { DW_TAG_unspecified_type, NULL }, // 0x3b + { DW_TAG_partial_unit, NULL }, // 0x3c + { DW_TAG_imported_unit, NULL }, // 0x3d + { DW_TAG_condition, NULL }, // 0x3f + { DW_TAG_shared_type, NULL }, // 0x40 + { DW_TAG_type_unit, NULL }, // 0x41 + { DW_TAG_rvalue_reference_type, NULL }, // 0x42 + { DW_TAG_template_alias, NULL }, // 0x43 + // DW_TAG_lo_user 0x4080 ---- + { DW_TAG_format_label, NULL }, // 0x4101 + { DW_TAG_function_template, NULL }, // 0x4102 + { DW_TAG_class_template, NULL }, // 0x4103 + { DW_TAG_GNU_BINCL, NULL }, // 0x4104 + { DW_TAG_GNU_EINCL, NULL }, // 0x4105 + { DW_TAG_GNU_template_template_parameter, NULL }, // 0x4106 + { DW_TAG_GNU_template_template_param, NULL }, // 0x4106 + { DW_TAG_GNU_template_parameter_pack, NULL }, // 0x4107 + { DW_TAG_GNU_formal_parameter_pack, NULL }, // 0x4108 + { DW_TAG_GNU_call_site, NULL }, // 0x4109 + { DW_TAG_GNU_call_site_parameter, NULL } // 0x410a + // DW_TAG_hi_user 0xffff ---- +}; +#else +extern DWARF_TagFunction dwarf_tag[LIBGOBLIN_DWARF_TAG_MAX]; +#endif + +#endif /* DRD64_HEADER_LIBGOBLIN_BINFO */ + +/* EOF of drd64_.h ----------------------------------- */ diff --git a/libgoblin/drd64_libgoblin_srcfile.c b/libgoblin/drd64_libgoblin_srcfile.c index 7f7fc2b..7184c79 100644 --- a/libgoblin/drd64_libgoblin_srcfile.c +++ b/libgoblin/drd64_libgoblin_srcfile.c @@ -127,8 +127,9 @@ LibGoblin_SrcFile * goto_SrcFile_AllocSrcFile_dataset: if( i_id_now == p_bfile->srcfile.i_max ) { p_bfile->srcfile.i_max++; } - p_srcfile = SRCFILE( p_bfile, i_id_now ); - p_srcfile->i_id = i_id_now; + p_srcfile = SRCFILE( p_bfile, i_id_now ); + p_srcfile->i_id = i_id_now; + p_srcfile->i_bfile_id = p_bfile->i_id; p_bfile->srcfile.i_now++; goto_SrcFile_AllocSrcFile_post: @@ -214,7 +215,8 @@ void memset( p_srcfile, 0x00, sizeof( LibGoblin_SrcFile ) ); - p_srcfile->i_id = -0x01; + p_srcfile->i_id = -0x01; + p_srcfile->i_bfile_id = -0x01; return; } diff --git a/libgoblin/drd64_libgoblin_type.h b/libgoblin/drd64_libgoblin_type.h index 4adcf81..4e4e346 100644 --- a/libgoblin/drd64_libgoblin_type.h +++ b/libgoblin/drd64_libgoblin_type.h @@ -206,6 +206,13 @@ typedef struct { char str_filename[DRD64_MAX_PATH]; char str_localpath[DRD64_MAX_PATH]; char str_remotepath[DRD64_MAX_PATH]; + + int i_bfile_id; + struct { + int i_abbrevs; + DWARF_AbbrevEntry *p_abbrev; + } dwarf; + } LibGoblin_SrcFile; @@ -257,8 +264,12 @@ typedef struct { } srcfile; struct { - int i_abbrevs; + int i_abbrevs_max; + int i_abbrevs_alloc; DWARF_AbbrevEntry *p_abbrev; + QWord qw_abbrev_unreadsz; + + int i_srcfiles; } dwarf; -- 2.11.0