From fb6d28b5a20eefa870128083b780bd331a69688a Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Sat, 31 Aug 2019 21:17:02 +0900 Subject: [PATCH] (LibGoblin) * WorkBackup (Corrected Bug: .debug_line dir/file table to SrcFile ) --- libgoblin/drd64_libgoblin_dwarf_info.c | 10 ++++++ libgoblin/drd64_libgoblin_dwarf_line.c | 26 ++++++++++----- libgoblin/drd64_libgoblin_dwarf_tag_compileunit.c | 40 +++++++++++++---------- libgoblin/drd64_libgoblin_dwarf_tag_dispatch.c | 1 + libgoblin/drd64_libgoblin_objinfo.c | 2 ++ libgoblin/drd64_libgoblin_srcfile.h | 2 ++ 6 files changed, 54 insertions(+), 27 deletions(-) diff --git a/libgoblin/drd64_libgoblin_dwarf_info.c b/libgoblin/drd64_libgoblin_dwarf_info.c index 4050d4b..222a275 100644 --- a/libgoblin/drd64_libgoblin_dwarf_info.c +++ b/libgoblin/drd64_libgoblin_dwarf_info.c @@ -149,6 +149,7 @@ int int i_objid; int i_objfiles; int i_abbrevs; + int i_srcid_objfile; Byte *pb_info; Byte *pb_now; Byte *pb_custart; @@ -185,6 +186,9 @@ int qw_size_info = psec_info->qw_size; do { + // Init. for Compile Unit ---- + i_srcid_objfile = NO_SRC; + // Read Compile Unit Header --- pb_custart = pb_info; pb_info = DWARF_Info_ReadCUHeader( &t_cuheader, pb_info, &qw_size_info ); @@ -240,8 +244,14 @@ int p_obj->info.objfile.p_abbrev = p_abbrev; memcpy( &(p_obj->info.objfile.t_cuheader), &t_cuheader, sizeof( LibGoblin_DWARF_Info_CUHeader ) ); + + i_srcid_objfile = p_obj->i_srcid; + assert( NO_SRC != i_srcid_objfile ); } + if( NO_SRC == p_obj->i_srcid ) + { p_obj->i_srcid = i_srcid_objfile; } + i_result = Index_DWARFInfo_RegistObjectInfo( p_binfo, p_obj, pb_now ); if( 0x00 != i_result ) { return -0x03; diff --git a/libgoblin/drd64_libgoblin_dwarf_line.c b/libgoblin/drd64_libgoblin_dwarf_line.c index 52f8334..e4f8531 100644 --- a/libgoblin/drd64_libgoblin_dwarf_line.c +++ b/libgoblin/drd64_libgoblin_dwarf_line.c @@ -42,13 +42,16 @@ Comment: ----------------------------------------------------------------------*/ char * DWARF_Line_GetPath_fromLineHeader( + LibGoblin_BinaryFile *p_bfile, Byte *pb_path, DWord dw_dirindex ) { char *pstr_path; - if( 0 == dw_dirindex ) - { return NULL; } + if( 0 == dw_dirindex ) { + pstr_path = p_bfile->str_remotepath; + goto goto_DWARF_Line_GetPath_fromLineHeader_post; + } dw_dirindex--; pstr_path = (char *)pb_path; @@ -59,9 +62,16 @@ char * dw_dirindex--; } - if( '\0' == *pb_path ) - { pstr_path = NULL; } + if( '\0' == *pb_path ) { + pstr_path = NULL; + goto goto_DWARF_Line_GetPath_fromLineHeader_post; + } + else if(( '.' == *pb_path ) && ( '\0' == *(pb_path + 1) )) { + pstr_path = p_bfile->str_remotepath; + goto goto_DWARF_Line_GetPath_fromLineHeader_post; + } +goto_DWARF_Line_GetPath_fromLineHeader_post: return pstr_path; } @@ -262,10 +272,7 @@ int if( NULL == pb_line ) { return -0x01; } qw_filesize = qw_qword; - if( 0 == dw_dirindex ) - { pstr_path = p_bfile->str_remotepath; } - else - { pstr_path = DWARF_Line_GetPath_fromLineHeader( t_linehdr.pb_path, dw_dirindex ); } + pstr_path = DWARF_Line_GetPath_fromLineHeader( p_bfile, t_linehdr.pb_path, dw_dirindex ); p_srcfile = SrcFile_DispenseSrcFile( p_bfile, str_filename, pstr_path ); if( NULL == p_srcfile ) { return -0x02; } @@ -280,6 +287,7 @@ int } // for DEBUG +/* for( i_pos = 0; i_pos < i_files; i_pos++ ) { i_result = SrcFile_GetSrcFileTable_inBinaryInfo( p_binfo, i_pos ); p_srcfile = SrcFile_GetSrcFile( p_bfile, i_result ); @@ -287,7 +295,7 @@ int printf(" Debug SrcFileTable: %2d > [%2d] %s/%s\n", i_pos, p_srcfile->i_id, p_srcfile->str_srcpath, p_srcfile->str_filename ); } - +*/ return 0x00; } diff --git a/libgoblin/drd64_libgoblin_dwarf_tag_compileunit.c b/libgoblin/drd64_libgoblin_dwarf_tag_compileunit.c index 898c64b..86c6c36 100644 --- a/libgoblin/drd64_libgoblin_dwarf_tag_compileunit.c +++ b/libgoblin/drd64_libgoblin_dwarf_tag_compileunit.c @@ -166,7 +166,27 @@ int { goto goto_DWARF_Tag_CompileUnit_compile_unit_post; } - // (Phase2) Regist ObjInfo as ObjFile ========================================= + // (Phase2) Regist SrcFile from .dwarf_line =================================== + SrcFile_ClearSrcFileTable_inBinaryInfo( p_binfo ); + + p_srcfile = SrcFile_DispenseSrcFile( p_bfile, pstr_filename, pstr_path); + if( NULL == p_srcfile ) { + goto goto_DWARF_Tag_CompileUnit_compile_unit_post; + } + + i_result = SrcFile_RegistSrcFileTable_inBinaryInfo( p_binfo, p_srcfile ); + if( 0x00 != i_result ) { + goto goto_DWARF_Tag_CompileUnit_compile_unit_post; + } + + dw_lineoffset = pval_linestmt->value.dw_value; + i_result = DWARF_Line_ReadSrcFile( p_binfo, dw_lineoffset ); + if( 0x00 != i_result ) { + goto goto_DWARF_Tag_CompileUnit_compile_unit_post; + } + + + // (Phase3) Regist ObjInfo as ObjFile ========================================= p_pginfo = ProgInfo_GetProgInfo( p_binfo->i_pginfo ); assert( NULL != p_pginfo ); @@ -187,26 +207,10 @@ int else { p_obj->info.objfile.i_objid_parent = p_obj_parent->i_id; } + p_obj->i_srcid = p_srcfile->i_id; } i_objid = p_obj_parent->i_id; - - // (Phase3) Regist SrcFile from .dwarf_line =================================== - SrcFile_ClearSrcFileTable_inBinaryInfo( p_binfo ); - - p_srcfile = SrcFile_DispenseSrcFile( p_bfile, pstr_filename, pstr_path); - if( NULL == p_srcfile ) { - goto goto_DWARF_Tag_CompileUnit_compile_unit_post; - } - - i_result = SrcFile_RegistSrcFileTable_inBinaryInfo( p_binfo, p_srcfile ); - if( 0x00 != i_result ) { - goto goto_DWARF_Tag_CompileUnit_compile_unit_post; - } - - dw_lineoffset = pval_linestmt->value.dw_value; - i_result = DWARF_Line_ReadSrcFile( p_binfo, dw_lineoffset ); - goto_DWARF_Tag_CompileUnit_compile_unit_post: return i_objid; } diff --git a/libgoblin/drd64_libgoblin_dwarf_tag_dispatch.c b/libgoblin/drd64_libgoblin_dwarf_tag_dispatch.c index 78a91fc..405ed48 100644 --- a/libgoblin/drd64_libgoblin_dwarf_tag_dispatch.c +++ b/libgoblin/drd64_libgoblin_dwarf_tag_dispatch.c @@ -72,6 +72,7 @@ int DWord dw_tag, LibGoblin_BinaryInfo *p_binfo, int i_childlv, LibGoblin_DWARF_Info_Ancestry *p_ancestry, LibGoblin_DWARF_Info_CUHeader *p_cuheader ); + LibGoblin_ObjectInfo *pobj_now; DWARF_Tag_Proc = NULL; dw_tag = p_abbrev->dw_tag; diff --git a/libgoblin/drd64_libgoblin_objinfo.c b/libgoblin/drd64_libgoblin_objinfo.c index 6a46238..4ec9c01 100644 --- a/libgoblin/drd64_libgoblin_objinfo.c +++ b/libgoblin/drd64_libgoblin_objinfo.c @@ -133,6 +133,8 @@ void p_objinfo->typelink.i_prev_id = NO_OBJ; p_objinfo->typelink.i_next_id = NO_OBJ; + p_objinfo->i_srcid = NO_SRC; + return; } diff --git a/libgoblin/drd64_libgoblin_srcfile.h b/libgoblin/drd64_libgoblin_srcfile.h index 3dd3b01..af14721 100644 --- a/libgoblin/drd64_libgoblin_srcfile.h +++ b/libgoblin/drd64_libgoblin_srcfile.h @@ -56,6 +56,8 @@ Comment: #ifdef DRD64_SRC_LIBGOBLIN_SRCFILE #endif +#define NO_SRC -0x01 + #define SRCFILE(m,n) ((LibGoblin_SrcFile *)((m)->srcfile.p_srcfile + (n))) LIBGOBLIN_SRCFILE_EXTERN -- 2.11.0