From 560013fbfbc018c614e022f8a21058f319127c7f Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Tue, 28 May 2019 05:28:49 +0900 Subject: [PATCH] (LibGoblin) * CreateFile: drd64_libgoblin_debug_dwarf.[ch] * Import: Dump DIE info. (for debug) --- libgoblin/Makefile | 5 ++ libgoblin/drd64_libgoblin.h | 1 + libgoblin/drd64_libgoblin_debug_dwarf.c | 105 ++++++++++++++++++++++++++++ libgoblin/drd64_libgoblin_debug_dwarf.h | 55 +++++++++++++++ libgoblin/drd64_libgoblin_debug_dwarf_str.c | 16 ----- libgoblin/drd64_libgoblin_dwarf_info.c | 37 ++-------- 6 files changed, 170 insertions(+), 49 deletions(-) create mode 100644 libgoblin/drd64_libgoblin_debug_dwarf.c create mode 100644 libgoblin/drd64_libgoblin_debug_dwarf.h diff --git a/libgoblin/Makefile b/libgoblin/Makefile index cc83b8e..5e4b17d 100644 --- a/libgoblin/Makefile +++ b/libgoblin/Makefile @@ -76,6 +76,7 @@ OBJS = drd64_libgoblin_api.o \ drd64_libgoblin_dwarf_common.o \ drd64_libgoblin_debug_elf.o \ drd64_libgoblin_debug_dwarf_str.o \ + drd64_libgoblin_debug_dwarf.o \ drd64_libgoblin_debug_objinfo.o HEADER = drd64_libgoblin.h \ drd64_libgoblin_section_defs.h \ @@ -108,6 +109,7 @@ HEADER = drd64_libgoblin.h \ drd64_libgoblin_dwarf_common.h \ drd64_libgoblin_debug_elf.h \ drd64_libgoblin_debug_dwarf_str.h \ + drd64_libgoblin_debug_dwarf.h \ drd64_libgoblin_debug_objinfo.h \ drd64_libgoblin_addrinfo.h \ $(USER_HEADER) $(SUPER_HEADER) $(LIB_HEADER) @@ -237,6 +239,9 @@ drd64_libgoblin_debug_elf.o: drd64_libgoblin_debug_elf.c $(HEADER) drd64_libgoblin_debug_dwarf_str.o: drd64_libgoblin_debug_dwarf_str.c $(HEADER) $(CC) -c -o drd64_libgoblin_debug_dwarf_str.o $(FLAGS_DEBUG) \ drd64_libgoblin_debug_dwarf_str.c +drd64_libgoblin_debug_dwarf.o: drd64_libgoblin_debug_dwarf.c $(HEADER) + $(CC) -c -o drd64_libgoblin_debug_dwarf.o $(FLAGS_DEBUG) \ + drd64_libgoblin_debug_dwarf.c drd64_libgoblin_debug_objinfo.o: drd64_libgoblin_debug_objinfo.c $(HEADER) $(CC) -c -o drd64_libgoblin_debug_objinfo.o $(FLAGS_DEBUG) \ drd64_libgoblin_debug_objinfo.c diff --git a/libgoblin/drd64_libgoblin.h b/libgoblin/drd64_libgoblin.h index ab85976..42f89b0 100644 --- a/libgoblin/drd64_libgoblin.h +++ b/libgoblin/drd64_libgoblin.h @@ -99,6 +99,7 @@ Comment: #include"drd64_libgoblin_dwarf_tag.h" #include"drd64_libgoblin_dwarf.h" #include"drd64_libgoblin_debug_dwarf_str.h" +#include"drd64_libgoblin_debug_dwarf.h" #include"drd64_libgoblin_debug_elf.h" #include"drd64_libgoblin_debug_objinfo.h" diff --git a/libgoblin/drd64_libgoblin_debug_dwarf.c b/libgoblin/drd64_libgoblin_debug_dwarf.c new file mode 100644 index 0000000..0bed2e9 --- /dev/null +++ b/libgoblin/drd64_libgoblin_debug_dwarf.c @@ -0,0 +1,105 @@ +/*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_DEBUG_DWARF +#include"drd64_libgoblin.h" + + +/*---------------------------------------------------------------------- +----------------------------------------------------------------------*/ +LIBGOBLIN_DEBUG_DWARF_EXTERN +void + Debug_DWARF_PrintDIE( + LibGoblin_BinaryFile *p_bfile, + DWARF_AbbrevEntry *p_abbrev, + DWord dw_abbrevid, + int i_childlv ) +{ + int i_cnt; + int i_end; + char str_space[65]; + DWord dw_tag; + QWord qw_cnt; + LibGoblin_DWARF_DIEValue *p_val; + DWARF_AbbrevEntry *p_arvnow; + + memset( str_space, ' ', 64 ); + i_end = ((64 < i_childlv) ? 64 : (2 + (i_childlv * 2))); + str_space[i_end] = '\0'; + + p_arvnow = p_abbrev + (dw_abbrevid - 1); + p_val = p_bfile->dwarf.p_infoval; + + printf( "%s<%2d>: Abbrev Number: %2d (%s [%02xh])\n", + str_space, i_childlv, dw_abbrevid, + Debug_DWARF_GetTAGname( p_arvnow->dw_tag ), p_arvnow->dw_tag ); + + for( i_cnt = 0; i_cnt < p_arvnow->i_items; i_cnt++, p_val++ ) { + printf("%s %-20s, %-16s : ", + str_space, + Debug_DWARF_GetAttributeName( p_arvnow->dw_attribute[ i_cnt ] ), + Debug_DWARF_GetFormName( p_arvnow->dw_format[ i_cnt ] ) ); + + switch( p_val->b_type ) { + case LIBGOBLIN_DWARF_INFO_TYPE_STRING: + printf( "[Str ] %s\n", p_val->value.pstr_value ); break; + case LIBGOBLIN_DWARF_INFO_TYPE_WORD: + printf( "[Word ] %d\n", p_val->value.w_value ); break; + case LIBGOBLIN_DWARF_INFO_TYPE_DWORD: + printf( "[DWord] %d\n", p_val->value.dw_value ); break; + case LIBGOBLIN_DWARF_INFO_TYPE_QWORD: + printf( "[QWord] %ld\n", p_val->value.qw_value ); break; + case LIBGOBLIN_DWARF_INFO_TYPE_BYTE: + printf( "[Byte ] %d\n", p_val->value.b_value ); break; + case LIBGOBLIN_DWARF_INFO_TYPE_LINK: + printf( "[LINK ] %p\n", p_val->value.pb_link ); break; + case LIBGOBLIN_DWARF_INFO_TYPE_BLOCK: + printf( "[Block] Size= %ld (", p_val->qw_size ); + for( qw_cnt = 0; qw_cnt < p_val->qw_size; qw_cnt++ ) + { printf("%0xh ", *(p_val->value.pb_data + qw_cnt) ); } + puts(")"); + break; + default: + break; + } + + } + + return; +} + + +/* EOF of drd64_.c ----------------------------------- */ diff --git a/libgoblin/drd64_libgoblin_debug_dwarf.h b/libgoblin/drd64_libgoblin_debug_dwarf.h new file mode 100644 index 0000000..fcf95c6 --- /dev/null +++ b/libgoblin/drd64_libgoblin_debug_dwarf.h @@ -0,0 +1,55 @@ +/*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_DEBUG_DWARF +#define DRD64_HEADER_LIBGOBLIN_DEBUG_DWARF + +#include"drd64_libgoblin.h" + +#ifdef DRD64_SRC_LIBGOBLIN_DEBUG_DWARF + #define LIBGOBLIN_DEBUG_DWARF_EXTERN +#else + #define LIBGOBLIN_DEBUG_DWARF_EXTERN extern +#endif + +LIBGOBLIN_DEBUG_DWARF_EXTERN + void Debug_DWARF_PrintDIE( + LibGoblin_BinaryFile *p_bfile, DWARF_AbbrevEntry *p_abbrev, + DWord dw_abbrevid, int i_childlv ); + +#endif /* DRD64_HEADER_LIBGOBLIN_BINFO */ + +/* EOF of drd64_.h ----------------------------------- */ diff --git a/libgoblin/drd64_libgoblin_debug_dwarf_str.c b/libgoblin/drd64_libgoblin_debug_dwarf_str.c index a6f8fb0..7e30cb5 100644 --- a/libgoblin/drd64_libgoblin_debug_dwarf_str.c +++ b/libgoblin/drd64_libgoblin_debug_dwarf_str.c @@ -135,20 +135,4 @@ goto_Debug_DWARF_GetFormName_post: } -/*---------------------------------------------------------------------- -----------------------------------------------------------------------*/ -LIBGOBLIN_DEBUG_DWARF_STR_EXTERN -void - Debug_DWARF_PrintDIE( - DWord dw_abbrevid, - DWord dw_attribute, - DWord dw_format, - int i_childlv, - LibGoblin_DWARF_DIEValue *p_val ) -{ - - return; -} - - /* EOF of drd64_.c ----------------------------------- */ diff --git a/libgoblin/drd64_libgoblin_dwarf_info.c b/libgoblin/drd64_libgoblin_dwarf_info.c index 90390a3..cd92eeb 100644 --- a/libgoblin/drd64_libgoblin_dwarf_info.c +++ b/libgoblin/drd64_libgoblin_dwarf_info.c @@ -382,36 +382,6 @@ Byte * break; } - switch( p_val->b_type ) { - case LIBGOBLIN_DWARF_INFO_TYPE_STRING: - printf( "[Str] %s\n", p_val->value.pstr_value ); - break; - case LIBGOBLIN_DWARF_INFO_TYPE_WORD: - printf( "[Word] %d\n", p_val->value.w_value ); - break; - case LIBGOBLIN_DWARF_INFO_TYPE_DWORD: - printf( "[DWord] %d\n", p_val->value.dw_value ); - break; - case LIBGOBLIN_DWARF_INFO_TYPE_QWORD: - printf( "[QWord] %ld\n", p_val->value.qw_value ); - break; - case LIBGOBLIN_DWARF_INFO_TYPE_BYTE: - printf( "[Byte] %d\n", p_val->value.b_value ); - break; - case LIBGOBLIN_DWARF_INFO_TYPE_LINK: - printf( "[LINK] %p\n", p_val->value.pb_link ); - break; - case LIBGOBLIN_DWARF_INFO_TYPE_BLOCK: - printf( "[Block] Size= %ld\n ", p_val->qw_size ); - for( qw_cnt = 0; qw_cnt < p_val->qw_size; qw_cnt++ ) { - printf("%0xh ", *(p_val->value.pb_data + qw_cnt) ); - } - puts(""); - break; - default: - break; - } - return pb_info; } @@ -568,7 +538,6 @@ int } p_arvnow = p_abbrev + (dw_arvid - 1); -printf(" [AbbrevID = %d] %s (%02xh)\n", dw_arvid, Debug_DWARF_GetTAGname(p_arvnow->dw_tag), p_arvnow->dw_tag ); // Read Debug Information Entry (DIE) --- memset( p_infoval, 0x00, sizeof( LibGoblin_DWARF_DIEValue ) * p_arvnow->i_items ); @@ -577,8 +546,6 @@ printf(" [AbbrevID = %d] %s (%02xh)\n", dw_arvid, Debug_DWARF_GetTAGname(p_arvno for( i_cnt = 0; i_cnt < p_arvnow->i_items; i_cnt++, p_val++ ) { dw_attribute = p_arvnow->dw_attribute[ i_cnt ]; dw_format = p_arvnow->dw_format[ i_cnt ]; -printf(" %-24s, %-24s : ", Debug_DWARF_GetAttributeName( dw_attribute ), - Debug_DWARF_GetFormName( dw_format ) ); pb_info = DWARF_Info_ReadFormat_Data( p_val, pb_info, &qw_size_cu, dw_format, p_binfo, &t_cuheader ); @@ -588,10 +555,14 @@ printf(" %-24s, %-24s : ", Debug_DWARF_GetAttributeName( dw_attribute ), // Dispatch for generate Rapid-Access Table by DIE-tag + Debug_DWARF_PrintDIE( p_bfile, p_abbrev, dw_arvid, i_childlv ); + }while( 0 != qw_size_cu ); qw_size_info -= t_cuheader.qw_unitsize; //}while((qw_size_info > 0) && (i_srcfiles > 0)); + + return 0x00; } -- 2.11.0