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_ABBREV
38 #include"drd64_libgoblin.h"
40 /*----------------------------------------------------------------------
41 ----------------------------------------------------------------------*/
42 LIBGOBLIN_DWARF_ABBREV_EXTERN
44 LibGoblin_DwarfAbbrev_ReadEntry(
45 LibGoblin_Dwarf_AbbrevEntry *p_entry,
54 assert( NULL != p_entry );
55 assert( NULL != pb_src );
59 memset( p_entry, 0x00, sizeof( LibGoblin_Dwarf_AbbrevEntry ) );
61 /* Read Abbrev Number */
62 pb_src = LibGoblin_DwarfCommon_Decode_ULEB128(
63 &qw_temp, pb_src, pqw_remain );
65 p_entry->dw_id = (DWord)qw_temp;
66 if( 0x00000000 == p_entry->dw_id ) {
71 pb_src = LibGoblin_DwarfCommon_Decode_ULEB128(
72 &qw_temp, pb_src, pqw_remain );
73 p_entry->dw_tag = (DWord)qw_temp;
76 pb_src = LibGoblin_DwarfCommon_Read_Byte(
77 &(p_entry->b_children), pb_src, pqw_remain );
78 if( NULL == pb_src ) { return NULL; }
81 printf("%04x : TAG=%04x (Children=%x) %ld\n",
82 p_entry->dw_id, p_entry->dw_tag, p_entry->b_children, *pqw_remain);
87 pb_src = LibGoblin_DwarfCommon_Decode_ULEB128(
88 &qw_temp, pb_src, pqw_remain );
89 dw_attribute = (DWord)qw_temp;
90 p_entry->dw_attribute[i_items] = dw_attribute;
93 pb_src = LibGoblin_DwarfCommon_Decode_ULEB128(
94 &qw_temp, pb_src, pqw_remain );
95 dw_format = (DWord)qw_temp;
96 p_entry->dw_format[i_items] = dw_format;
99 printf(" Attiribute=%02x Format=%02x\n",
100 dw_attribute, dw_format);
105 }while((0x00 != dw_attribute) && (0x00 != dw_format)
106 && (*pqw_remain > 0) );
108 p_entry->i_items = i_items;
114 /*----------------------------------------------------------------------
115 ----------------------------------------------------------------------*/
116 LIBGOBLIN_DWARF_ABBREV_EXTERN
118 LibGoblin_DwarfAbbrev_GetItems(
121 LibGoblin_BinaryInfo *p_bin )
126 QWord qw_size_abbrev;
131 LibGoblin_Debug_Dwarf *p_dwarf;
133 assert( NULL != p_bin );
135 p_dwarf = (LibGoblin_Debug_Dwarf *)p_bin->p_debug;
136 assert( NULL != p_dwarf );
138 /* Get .debug_abbrev section Info */
139 pb_data = LibGoblin_Elf_GetSection(
140 &qw_size_abbrev, p_bin, 0,
141 LIBGOBLIN_SECTION_ID_DEBUG_ABBREV );
142 if( NULL == pb_data ) { return 0x01; }
150 /* Read Abbrev Number */
151 pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
152 &qw_temp, pb_data, &qw_size_abbrev );
153 dw_abbrev_num = (DWord)qw_temp;
156 pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
157 &qw_temp, pb_data, &qw_size_abbrev );
158 dw_tag = (DWord)qw_temp;
159 if( DW_TAG_compile_unit == dw_tag ) {
163 /* Read IsChildren */
164 b_children = *pb_data++;
169 pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
170 &qw_temp, pb_data, &qw_size_abbrev );
171 dw_attribute = (DWord)qw_temp;
174 pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
175 &qw_temp, pb_data, &qw_size_abbrev );
176 dw_format = (DWord)qw_temp;
178 }while((0x00 != dw_attribute) && (0x00 != dw_format)
179 && (qw_size_abbrev > 0) );
181 /* Skip Byte for Next Compile-Unit Abbrev. */
182 if( 0x00 == *pb_data ) {
187 }while((qw_size_abbrev > 0) && (dw_tag != 0x00));
193 /*----------------------------------------------------------------------
194 ----------------------------------------------------------------------*/
195 LIBGOBLIN_DWARF_ABBREV_EXTERN
197 LibGoblin_DwarfAbbrev_Read(
198 LibGoblin_BinaryInfo *p_bin,
204 QWord qw_size_abbrev;
210 LibGoblin_Dwarf_AbbrevInfo *p_abbrev;
211 LibGoblin_Dwarf_SourceFile *p_src;
212 LibGoblin_Dwarf_SourceFile *p_nowsrc;
213 LibGoblin_Debug_Dwarf *p_dwarf;
215 assert( NULL != p_bin );
217 p_dwarf = (LibGoblin_Debug_Dwarf *)p_bin->p_debug;
218 assert( NULL != p_dwarf );
220 p_src = p_dwarf->p_src;
221 assert( NULL != p_src );
223 /* Get .debug_abbrev section Info */
224 pb_data = LibGoblin_Elf_GetSection(
225 &qw_size_abbrev, p_bin, 0,
226 LIBGOBLIN_SECTION_ID_DEBUG_ABBREV );
227 if( NULL == pb_data ) { return 0x01; }
229 /* Alloc Abbrev Info. for debug_dwarf_info struct */
230 p_abbrev = (LibGoblin_Dwarf_AbbrevInfo *)malloc(
231 sizeof(LibGoblin_Dwarf_AbbrevInfo) * i_abbrevs );
232 if( NULL == p_abbrev ) { return 0x02; }
233 memset( p_abbrev, 0x00,
234 sizeof(LibGoblin_Dwarf_AbbrevInfo) * i_abbrevs );
238 /* Set Abbrev Data to AbbrevInfo Struct - Phase 1*/
239 p_abbrev->pb_pos = pb_data;
240 qw_remain = qw_size_abbrev;
242 /* Read Abbrev Number */
243 pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
244 &qw_temp, pb_data, &qw_remain );
245 dw_abbrev_num = (DWord)qw_temp;
248 pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
249 &qw_temp, pb_data, &qw_remain );
250 dw_tag = (DWord)qw_temp;
252 /* Read IsChildren */
253 b_children = *pb_data++;
256 /* Set Abbrev Data to AbbrevInfo Struct */
257 p_abbrev->dw_tag = dw_tag;
258 p_abbrev->dw_id = dw_abbrev_num;
260 if( DW_TAG_compile_unit == dw_tag ) {
262 p_nowsrc->p_abbrev_info = p_abbrev;
265 /*printf("%04x : TAG=%04x (Children=%x) %ld\n",
266 dw_abbrev_num, dw_tag, b_children, qw_size_abbrev);*/
270 pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
271 &qw_temp, pb_data, &qw_remain );
272 dw_attribute = (DWord)qw_temp;
275 pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
276 &qw_temp, pb_data, &qw_remain );
277 dw_format = (DWord)qw_temp;
279 /*printf(" Attiribute=%02x Format=%02x\n",
280 dw_attribute, dw_format);*/
282 }while((0x00 != dw_attribute) && (0x00 != dw_format)
283 && (qw_remain > 0) );
285 p_abbrev->w_size = (Word)(qw_size_abbrev - qw_remain);
288 /* Skip Byte for Next Compile-Unit Abbrev. */
289 if( 0x00 == *pb_data ) {
294 }while((qw_remain > 0) && (dw_tag != 0x00));
301 /* EOF of drd64_.c ----------------------------------- */