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"
41 /*----------------------------------------------------------------------
42 ----------------------------------------------------------------------*/
44 DWARF_Info_ReadCUHeader(
45 LibGoblin_DWARF_Info_CUHeader *p_cuhead,
47 QWord *pqw_size_info )
54 assert( NULL != p_cuhead );
55 assert( NULL != pb_info );
60 // Read unit_length (4Byte + 8Byte(64bit)) ---
61 pb_info = DWARF_Common_Read_DWord( &dw_dword, pb_info, pqw_size_info );
62 if( NULL == pb_info ) { return NULL; }
64 // 64bit - First 4Byte = 0xffffffff
65 if( ((DWord)0xffffffff) == dw_dword ) {
66 pb_info = DWARF_Common_Read_QWord( &qw_qword, pb_info, pqw_size_info );
67 if( NULL == pb_info ) { return NULL; }
69 p_cuhead->qw_unitsize = (QWord)qw_qword;
71 p_cuhead->b_bits = 64;
72 p_cuhead->b_offsetsize = 8;
74 // 32bit - First 4Byte = value.
76 p_cuhead->qw_unitsize = (QWord)dw_dword;
77 p_cuhead->b_bits = 32;
78 p_cuhead->b_offsetsize = 4;
81 // Read version (2Byte) ---
82 pb_info = DWARF_Common_Read_Word( &(p_cuhead->w_version), pb_info, pqw_size_info );
83 if( NULL == pb_info ) { return NULL; }
86 // Read abbrev_offset (4Byte(32bit), 8Byte(64bit)) ---
87 if( 64 == i_bitflag ) {
88 pb_info = DWARF_Common_Read_QWord( &qw_qword, pb_info, pqw_size_info );
89 if( NULL == pb_info ) { return NULL; }
92 p_cuhead->qw_abbrev_offset = qw_qword;
95 pb_info = DWARF_Common_Read_DWord( &dw_dword, pb_info, pqw_size_info );
96 if( NULL == pb_info ) { return NULL; }
99 p_cuhead->qw_abbrev_offset = (QWord)dw_dword;
102 // Read address_size (1Byte) ---
103 pb_info = DWARF_Common_Read_Byte( &(p_cuhead->b_pointersize), pb_info, pqw_size_info);
104 if( NULL == pb_info ) { return NULL; }
107 p_cuhead->qw_unitsize -= i_readbytes;
110 if( 4 == p_cuhead->w_version ) {
111 // Read type-signature (8Byte) ---
112 pb_info = DWARF_Common_Read_QWord( &qw_qword, pb_info, pqw_size_info );
113 if( NULL == pb_info ) { return NULL; }
116 p_cuhead->qw_type_signature = qw_qword;
118 // Read type_offset (4Byte(32bit), 8Byte(64bit)) ---
119 if( 64 == i_bitflag ) {
120 pb_info = DWARF_Common_Read_QWord( &qw_qword, pb_info, pqw_size_info );
121 if( NULL == pb_info ) { return NULL; }
124 p_cuhead->qw_type_offset = qw_qword;
127 pb_info = DWARF_Common_Read_DWord( &dw_dword, pb_info, pqw_size_info );
128 if( NULL == pb_info ) { return NULL; }
131 p_cuhead->qw_type_offset = (QWord)dw_dword;
140 /*----------------------------------------------------------------------
141 ----------------------------------------------------------------------*/
143 DWARF_Info_RegistSrcFile_fromTagCompileUnit(
144 LibGoblin_BinaryInfo *p_binfo,
145 LibGoblin_BinaryFile *p_bfile,
147 DWARF_AbbrevEntry *p_abbrev,
149 LibGoblin_DWARF_Info_CUHeader *pt_cuheader )
152 char *pstr_srcpath = NULL;
153 char str_temp[DRD64_MAX_PATH+1];
156 DWARF_AbbrevEntry *p_arvnow;
157 LibGoblin_DWARF_DIEValue *p_val;
158 LibGoblin_SrcFile *p_srcfile;
160 assert( NULL != p_binfo );
161 assert( NULL != p_bfile );
165 // Read Reference Abbrev-ID ---
166 pb_info = DWARF_Common_DecodeULEB128( &qw_temp, pb_info, &qw_size_cu );
167 dw_arvid = (DWord)qw_temp;
169 if( 0 == dw_arvid ) {
174 p_arvnow = p_abbrev + (dw_arvid - 1);
176 // Read Debug Information Entry (DIE) ---
177 pb_info = DWARF_AttrForm_ReadDIEValue(
178 pb_info, &qw_size_cu, p_arvnow, p_binfo, pt_cuheader );
180 if( 0x00 != p_arvnow->b_children ) { i_childlv++; }
182 // Check compile unit tag ---
183 if( DW_TAG_compile_unit == p_arvnow->dw_tag ) { break; }
185 }while( 0 != qw_size_cu );
187 if( DW_TAG_compile_unit != p_arvnow->dw_tag ) {
191 p_val = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_name );
192 if( NULL != p_val ) { pstr_srcpath = p_val->value.pstr_value; }
193 if( NULL == pstr_srcpath ) {
197 strncpy( str_temp, pstr_srcpath, DRD64_MAX_PATH );
198 p_srcfile = SrcFile_DispenseSrcFile( p_bfile, basename( str_temp ) );
199 if( NULL == p_srcfile ) {
203 strncpy( p_srcfile->str_srcpath, dirname( str_temp ), DRD64_MAX_PATH );
209 /*----------------------------------------------------------------------
210 ----------------------------------------------------------------------*/
211 LIBGOBLIN_DWARF_INFO_EXTERN
214 LibGoblin_BinaryInfo *p_binfo )
226 LibGoblin_SectionInfo *psec_info;
227 LibGoblin_BinaryFile *p_bfile;
228 DWARF_AbbrevEntry *p_abbrev;
229 DWARF_AbbrevEntry *p_arvnow;
230 LibGoblin_DWARF_Info_CUHeader t_cuheader;
231 LibGoblin_SrcFile *p_srcfile;
233 assert( NULL != p_binfo );
235 p_bfile = BinaryFile_GetBinaryFile( p_binfo->i_binfile );
236 assert( NULL != p_bfile );
238 i_srcfiles = p_bfile->dwarf.i_srcfiles;
240 // Get section Info ---
241 psec_info = Section_GetSectionInfo( p_binfo, LIBGOBLIN_SECTION_ID_DEBUG_INFO );
242 assert( NULL != psec_info );
243 if( NULL == psec_info->pb_data ) {
246 pb_info = psec_info->pb_data;
247 qw_size_info = psec_info->qw_size;
250 // Read Compile Unit Header ---
251 pb_custart = pb_info;
252 pb_info = DWARF_Info_ReadCUHeader( &t_cuheader, pb_info, &qw_size_info );
253 if( NULL == pb_info ) {
257 t_cuheader.pb_custart = pb_custart;
258 qw_size_cu = t_cuheader.qw_unitsize;
260 // Read Abbrev for the now compile unit ---
261 i_result = DWARF_Abbrev_ReadAbbrevEntry(
262 &p_abbrev, &i_abbrevs,
263 p_binfo, p_bfile, t_cuheader.qw_abbrev_offset );
265 // Read DW_TAG_compile_unit & Regist SrcFile struct. ---
266 p_srcfile = DWARF_Info_RegistSrcFile_fromTagCompileUnit(
267 p_binfo, p_bfile, pb_info, p_abbrev, qw_size_cu, &t_cuheader );
268 if( NULL != p_srcfile ) {
269 p_srcfile->dwarf.i_abbrevs = i_abbrevs;
270 p_srcfile->dwarf.p_abbrev = p_abbrev;
272 //printf( "\n SrcFile: %s, Orig.Path: %s\n", p_srcfile->str_filename, p_srcfile->str_srcpath );
275 printf( " size: %ld, ver:%d, abbrev off.:%ld, addr.size: %d\n",
276 t_cuheader.qw_unitsize,
277 t_cuheader.w_version,
278 t_cuheader.qw_abbrev_offset,
279 t_cuheader.b_pointersize);
282 // Read & Process DWARF info TAG ---
285 // Read Reference Abbrev-ID ---
286 pb_info = DWARF_Common_DecodeULEB128( &qw_temp, pb_info, &qw_size_cu );
287 dw_arvid = (DWord)qw_temp;
289 if( 0 == dw_arvid ) {
294 p_arvnow = p_abbrev + (dw_arvid - 1);
296 // Read Debug Information Entry (DIE) ---
297 pb_info = DWARF_AttrForm_ReadDIEValue(
298 pb_info, &qw_size_cu, p_arvnow, p_binfo, &t_cuheader );
300 // Dispatch for generate Rapid-Access Table by DIE-tag
301 i_result = DWARF_Tag_Dispatch( p_binfo, p_bfile, p_srcfile, p_arvnow );
303 Debug_DWARF_PrintDIE( p_binfo, p_abbrev, dw_arvid, i_childlv );
305 if( 0x00 != p_arvnow->b_children ) { i_childlv++; }
307 }while( 0 != qw_size_cu );
308 qw_size_info -= t_cuheader.qw_unitsize;
310 }while((qw_size_info > 0) && (i_srcfiles > 0));
317 /* EOF of drd64_.c ----------------------------------- */