OSDN Git Service

(LibGoblin)
[drdeamon64/drdeamon64.git] / libgoblin / drd64_libgoblin_debug_objinfo.c
1 /*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
2
3                          D r . D e a m o n  6 4
4                         for INTEL64(R), AMD64(R)
5         
6    Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
7
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
10
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.
16
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.
28
29 DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
30
31 /* File Info -----------------------------------------------------------
32 File: drd64_.c
33 Function: 
34 Comment: 
35 ----------------------------------------------------------------------*/
36
37 #define DRD64_SRC_LIBGOBLIN_DEBUG_OBJINFO
38 #include"drd64_libgoblin.h"
39
40 static char     gstr_type[256][9]       = {
41         "NULL",                 // 0x00
42         "MASTER",               // 0x01
43         "PROGRAM",              // 0x02
44         "PROGHDR",              // 0x03
45         "SECTION",              // 0x04
46         "OBJFILE",              // 0x05
47         "TYPE:MUL",             // 0x06
48         "TYPE:SIG",             // 0x07
49
50         "TYPEDEF",              // 0x08
51         "FUNCTION",             // 0x09
52         "OBJECT",               // 0x0a
53         "COMMON",               // 0x0b
54         "TLS",                  // 0x0c
55         "REL",                  // 0x0d
56         "",                             // 0x0e
57         "",                             // 0x0f
58         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
59         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
60         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
61         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
62         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
63         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
64         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
65         "NONE",
66
67         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
68         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
69         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
70         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
71         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
72         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
73         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
74         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
75 };
76
77 /*====================================================================*/
78 /*--------------------------------------------------------------------*/
79 void
80         Debug_ObjectInfo_Print_SymbolCommon(
81                         LibGoblin_ObjectInfo    *p_obj,
82                         char    *pstr_space,
83                         Byte    b_level )
84 {
85         char    str_type[64];
86         char    str_binding[32];
87         char    str_visibility[32];
88         LibGoblin_BinaryInfo    *p_binfo_origin;
89
90         printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d) .debug_info=%8ph  File{ Offset=%8p, Size=%8ld, BinFileID=%d }\n",
91                                 pstr_space, 
92                                 p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id,
93                                 p_obj->dwarf.pb_info,
94                                 p_obj->file.pv_offset, p_obj->file.qw_size, p_obj->file.i_binfile );
95
96         // Symbol type - ELFNN_ST_TYPE - st_info
97         switch( p_obj->elfsym.b_type )  {
98                 case STT_NOTYPE:        // 0 - Unspecified type.
99                         strcpy( str_type, "NoType" );
100                         break;
101                 case STT_OBJECT:        // 1 - Data object.
102                         strcpy( str_type, "Data Object" );
103                         break;
104                 case STT_FUNC:          // 2 - Function.
105                         strcpy( str_type, "Function" );
106                         break;
107                 case STT_SECTION:       // 3 - Section.
108                         strcpy( str_type, "Section" );
109                         break;
110                 case STT_FILE:          // 4 - Source file.
111                         strcpy( str_type, "Source File" );
112                         break;
113                 case STT_COMMON:        // 5 - Uninitialized common block.
114                         strcpy( str_type, "UnInit. CommonBlock" );
115                         break;
116                 case STT_TLS:           // 6 - TLS object.
117                         strcpy( str_type, "TLS Object" );
118                         break;
119                 case STT_NUM:
120                         strcpy( str_type, "Num" );
121                         break;
122                 case STT_GNU_IFUNC:
123                         strcpy( str_type, "GNU IFunc" );
124                         break;
125                 default:
126                         snprintf( str_type, 31, "(%02xh)", p_obj->elfsym.b_type );
127                         break;
128         }
129
130         // Symbol Binding - ELFNN_ST_BIND - st_info
131         switch( p_obj->elfsym.b_binding )       {
132                 case STB_LOCAL:                 // 0 - Local symbol
133                         strcpy( str_binding, "Local" );
134                         break;
135                 case STB_GLOBAL:                // 1 - Global symbol
136                         strcpy( str_binding, "Global" );
137                         break;
138                 case STB_WEAK:                  // 2 - like global - lower precedence
139                         strcpy( str_binding, "WEAK" );
140                         break;
141                 case STB_GNU_UNIQUE:    // 10 - Unique symbol (GNU)
142                         strcpy( str_binding, "GNU Unique" );
143                         break;
144                 default:
145                         snprintf( str_binding, 31, "(%02xh)", p_obj->elfsym.b_binding );
146                         break;
147         }
148
149
150         // Symbol visibility - ELFNN_ST_VISIBILITY - st_other
151         switch( p_obj->elfsym.b_visibility )    {
152                 case STV_DEFAULT:       // 0x00 - Default visibility (see binding).
153                         strcpy( str_visibility, "Default" );
154                         break;
155                 case STV_INTERNAL:      // 0x01 - Special meaning in relocatable objects.
156                         strcpy( str_visibility, "INTERNAL" );
157                         break;
158                 case STV_HIDDEN:        // 0x02 - Not visible.
159                         strcpy( str_visibility, "HIDDEN" );
160                         break;
161                 case STV_PROTECTED:     // 0x03 - Visible but not preemptible.
162                         strcpy( str_visibility, "PROTECTED" );
163                         break;
164                 case STV_EXPORTED:
165                         strcpy( str_visibility, "EXPORTED" );
166                         break;
167                 case STV_SINGLETON:
168                         strcpy( str_visibility, "SINGLETON" );
169                         break;
170                 case STV_ELIMINATE:
171                         strcpy( str_visibility, "ELIMINATE" );
172                         break;
173                 default:
174                         snprintf( str_binding, 31, "(%02xh)", p_obj->elfsym.b_binding );
175                         break;
176         }
177
178         printf(" %s\t\t[SYMBOL] Type: %s, Binding: %s, Visibility: %s\n",
179                                 pstr_space, str_type, str_binding, str_visibility );
180
181
182         if( OBJINFO_STATUS_DYNAMIC & p_obj->dw_status ) {
183                 p_binfo_origin  = BinaryInfo_GetBinInfo( p_obj->dynamic.i_binfo_origin );
184
185                 printf(" %s\t\t[DYNAMIC] Lib.Name: %s (binfo id= %d), .dynsym index= %d\n",
186                                 pstr_space,
187                                 ((NULL != p_binfo_origin) ? p_binfo_origin->str_filename : "--NULL--"),
188                                 p_obj->dynamic.i_binfo_origin, p_obj->dynamic.i_dynsym_index );
189         }
190
191
192         return;
193 }
194
195 /*--------------------------------------------------------------------*/
196 void
197         Debug_ObjectInfo_Print_Function(
198                         LibGoblin_ObjectInfo    *p_obj,
199                         char    *pstr_space,
200                         Byte    b_level )
201 {
202         Debug_ObjectInfo_Print_SymbolCommon( p_obj, pstr_space, b_level );
203         return;
204 }
205
206 /*--------------------------------------------------------------------*/
207 void
208         Debug_ObjectInfo_Print_Object(
209                         LibGoblin_ObjectInfo    *p_obj,
210                         char    *pstr_space,
211                         Byte    b_level )
212 {
213         Debug_ObjectInfo_Print_SymbolCommon( p_obj, pstr_space, b_level );
214         return;
215 }
216
217 /*--------------------------------------------------------------------*/
218 void
219         Debug_ObjectInfo_Print_Common(
220                         LibGoblin_ObjectInfo    *p_obj,
221                         char    *pstr_space,
222                         Byte    b_level )
223 {
224         Debug_ObjectInfo_Print_SymbolCommon( p_obj, pstr_space, b_level );
225         return;
226 }
227
228 /*--------------------------------------------------------------------*/
229 void
230         Debug_ObjectInfo_Print_TLS(
231                         LibGoblin_ObjectInfo    *p_obj,
232                         char    *pstr_space,
233                         Byte    b_level )
234 {
235         Debug_ObjectInfo_Print_SymbolCommon( p_obj, pstr_space, b_level );
236         return;
237 }
238
239 /*--------------------------------------------------------------------*/
240 void
241         Debug_ObjectInfo_Print_Rel(
242                         LibGoblin_ObjectInfo    *p_obj,
243                         char    *pstr_space,
244                         Byte    b_level )
245 {
246         //Debug_ObjectInfo_Print_SymbolCommon( p_obj, pstr_space, b_level );
247         return;
248 }
249
250 /*--------------------------------------------------------------------*/
251 void
252         Debug_ObjectInfo_Print_Section(
253                         LibGoblin_ObjectInfo    *p_obj,
254                         char    *pstr_space,
255                         Byte    b_level )
256 {
257         char    str_type[32];
258         char    str_flag[256];
259         DWord   qw_flag;
260
261         printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d) .debug_info=%8ph File{ Offset=%8p, Size=%8ld, BinFileID=%d }\n",
262                                 pstr_space, 
263                                 p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id,
264                                 p_obj->dwarf.pb_info,
265                                 p_obj->file.pv_offset, p_obj->file.qw_size, p_obj->file.i_binfile );
266
267
268         switch( p_obj->info.section.dw_type )   {
269                 /* 0 - inactive */
270                 case SHT_NULL:
271                         strncpy( str_type, "NULL", 31 );
272                         break;
273                 /* 1 - program defined information */
274                 case SHT_PROGBITS:
275                         strncpy( str_type, "PROGBITS", 31 );
276                         break;
277                 /* 2 - symbol table section */
278                 case SHT_SYMTAB:
279                         strncpy( str_type, "SYMTAB", 31 );
280                         break;
281                 /* 3 - string table section */
282                 case SHT_STRTAB:
283                         strncpy( str_type, "STRTAB", 31 );
284                         break;
285                 /* 4 - relocation section with addends */
286                 case SHT_RELA:
287                         strncpy( str_type, "RELA", 31 );
288                         break;
289                 /* 5 - symbol hash table section */
290                 case SHT_HASH:
291                         strncpy( str_type, "HASH", 31 );
292                         break;
293                 /* 6 - dynamic section */
294                 case SHT_DYNAMIC:
295                         strncpy( str_type, "DYNAMIC", 31 );
296                         break;
297                 /* 7 - note section */
298                 case SHT_NOTE:
299                         strncpy( str_type, "NOTE", 31 );
300                         break;
301                 /* 8 - no space section */
302                 case SHT_NOBITS:
303                         strncpy( str_type, "NOBITS", 31 );
304                         break;
305                 /* 9 - relocation section - no addends */
306                 case SHT_REL:
307                         strncpy( str_type, "REL", 31 );
308                         break;
309                 /* 10 - reserved - purpose unknown */
310                 case SHT_SHLIB:
311                         strncpy( str_type, "SHLIB", 31 );
312                         break;
313                 /* 11 - dynamic symbol table section */
314                 case SHT_DYNSYM:
315                         strncpy( str_type, "DYNSYM", 31 );
316                         break;
317                 /* 14 - Initialization function pointers. */
318                 case  SHT_INIT_ARRAY:
319                         strncpy( str_type, "INIT_ARRAY", 31 );
320                         break;
321                 /* 15 - Termination function pointers. */
322                 case SHT_FINI_ARRAY:
323                         strncpy( str_type, "FINI_ARRAY", 31 );
324                         break;
325                 /* 16 - Pre-initialization function ptrs. */
326                 case SHT_PREINIT_ARRAY:
327                         strncpy( str_type, "PREINIT_ARRAY", 31 );
328                         break;
329                 /* 17 - Section group. */
330                 case SHT_GROUP:
331                         strncpy( str_type, "GROUP", 31 );
332                         break;
333                 /* 18 - Section indexes (see SHN_XINDEX). */
334                 case  SHT_SYMTAB_SHNDX:
335                         strncpy( str_type, "SYMTAB_SHNDX", 31 );
336                         break;
337
338                 default:
339                         snprintf( str_type, 31, "(%8x)", p_obj->info.section.dw_type );
340                         break;
341         }
342         
343         qw_flag = p_obj->info.section.qw_flag;
344         str_flag[0]     = '\0';
345         /* SHF_WRITE 0x1:       Section contains writable data. */
346         if( SHF_WRITE & qw_flag )       { strcat( str_flag, "Write " ); }
347         /* SHF_ALLOC 0x2: Section occupies memory. */
348         if( SHF_ALLOC & qw_flag )       { strcat( str_flag, "Alloc " ); }
349         /* SHF_EXECINSTR 0x4: Section contains instructions. */
350         if( SHF_EXECINSTR & qw_flag )   { strcat( str_flag, "Exec " ); }
351         /* SHF_MERGE 0x10: Section may be merged. */
352         if( SHF_MERGE & qw_flag )       { strcat( str_flag, "Merged " ); }
353         /* SHF_STRINGS 0x20: Section contains strings. */
354         if( SHF_STRINGS & qw_flag )     { strcat( str_flag, "Strings " ); }
355         /* SHF_INFO_LINK 0x40: sh_info holds section index. */
356         if( SHF_INFO_LINK & qw_flag )   { strcat( str_flag, "InfoLink " ); }
357         /* SHF_LINK_ORDER 0x80: Special ordering requirements. */
358         if( SHF_LINK_ORDER & qw_flag )  { strcat( str_flag, "LinkOrder " ); }
359         /* SHF_OS_NONCONFORMING 0x100: OS-specific processing required. */
360         if( SHF_OS_NONCONFORMING & qw_flag )    { strcat( str_flag, "OSspecific " ); }
361         /* SHF_GROUP 0x200: Member of section group. */
362         if( SHF_GROUP & qw_flag )       { strcat( str_flag, "Group " ); }
363         /* SHF_TLS 0x400: Section contains TLS data. */
364         if( SHF_TLS & qw_flag ) { strcat( str_flag, "TLS " ); }
365         /* SHF_COMPRESSED 0x800: Section contains compressed data. */
366         if( SHF_COMPRESSED & qw_flag )  { strcat( str_flag, "Compressed " ); }
367
368         printf(" %s\t\t[SECTION] Type: %s, Align= %ld, Flag[ %s]\n",
369                                 pstr_space, str_type, p_obj->info.section.qw_align, str_flag );
370         printf(" %s\t\t[SECTION] EntSize= %ld, Link(Related Section)= %d, Info(Depends Section Type)= %xh\n",
371                                 pstr_space, p_obj->info.section.qw_entsize,
372                                 p_obj->info.section.dw_link, p_obj->info.section.dw_info );
373
374         return;
375 }
376
377 /*--------------------------------------------------------------------*/
378 void
379         Debug_ObjectInfo_Print_ProgramHeader(
380                         LibGoblin_ObjectInfo    *p_obj,
381                         char    *pstr_space,
382                         Byte    b_level )
383 {
384         char    str_type[32];
385         char    str_flag[8];
386         DWord   dw_flag;
387
388         printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d) .debug_info=%8ph File{ Offset=%8p, Size=%8ld, BinFileID=%d }\n",
389                                 pstr_space, 
390                                 p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id,
391                                 p_obj->dwarf.pb_info,
392                                 p_obj->file.pv_offset, p_obj->file.qw_size, p_obj->file.i_binfile );
393
394         switch( p_obj->info.proghdr.dw_type )   {
395                 case PT_NULL:
396                         strncpy( str_type, "NULL", 31 );
397                         break;
398                 case PT_LOAD:
399                         strncpy( str_type, "LOAD", 31 );
400                         break;
401                 case PT_DYNAMIC:
402                         strncpy( str_type, "DYNAMIC", 31 );
403                         break;
404                 case PT_INTERP:
405                         strncpy( str_type, "INTERP", 31 );
406                         break;
407                 case PT_NOTE:
408                         strncpy( str_type, "NOTE", 31 );
409                         break;
410                 case PT_SHLIB:
411                         strncpy( str_type, "SHLIB", 31 );
412                         break;
413                 case PT_PHDR:
414                         strncpy( str_type, "PHDR", 31 );
415                         break;
416                 case PT_TLS:
417                         strncpy( str_type, "TLS", 31 );
418                         break;
419                 default:
420                         snprintf( str_type, 31, "(%8x)", p_obj->info.proghdr.dw_type );
421                         break;
422         }
423         
424         dw_flag = p_obj->info.proghdr.dw_flags;
425         snprintf( str_flag, 7, "%c%c%c%c%c",
426                                         ((PF_R & dw_flag) ? 'R' : ' '),
427                                         ((PF_W & dw_flag) ? 'W' : ' '),
428                                         ((PF_X & dw_flag) ? 'X' : ' '),
429                                         ((PF_MASKOS & dw_flag) ? 'O': ' '),
430                                         ((PF_MASKPROC & dw_flag) ? 'P': ' ') );
431
432         printf(" %s\t\t[PROGHDR] Flag[%5s] Type: %s, align= %ld\n",
433                                 pstr_space, str_flag, str_type, p_obj->info.proghdr.qw_align );
434
435         return;
436 }
437
438 /*--------------------------------------------------------------------*/
439 void
440         Debug_ObjectInfo_Print_ProgramFile(
441                         LibGoblin_ObjectInfo    *p_obj,
442                         char    *pstr_space,
443                         Byte    b_level )
444 {
445         printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d) .debug_info=%8ph\n",
446                                 pstr_space, p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id,
447                                 p_obj->dwarf.pb_info );
448
449         printf(" %s\t\t[PROGRAM] BinaryInfo ID= %d\n",
450                                 pstr_space, p_obj->info.program.i_binfo_id );
451
452         return;
453 }
454
455 /*--------------------------------------------------------------------*/
456 void
457         Debug_ObjectInfo_Print_ObjectFile(
458                         LibGoblin_ObjectInfo    *p_obj,
459                         char    *pstr_space,
460                         Byte    b_level )
461 {
462         printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d) .debug_info=%8ph\n",
463                                 pstr_space, p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id,
464                                 p_obj->dwarf.pb_info );
465         printf(" %s\t\t[OBJFILE] Abbrev Nums=%3d (%8ph)  CU Header: size=%ld, ver=%d, pointer size=%d\n",
466                                 pstr_space, p_obj->info.objfile.i_abbrevs, p_obj->info.objfile.p_abbrev,
467                                 p_obj->info.objfile.t_cuheader.qw_unitsize,
468                                 p_obj->info.objfile.t_cuheader.w_version,
469                                 p_obj->info.objfile.t_cuheader.b_pointersize );
470
471         return;
472 }
473
474 /*--------------------------------------------------------------------*/
475 void
476         Debug_ObjectInfo_Print_Type_Single(
477                         LibGoblin_ObjectInfo    *p_obj,
478                         char    *pstr_space,
479                         Byte    b_level )
480 {
481         printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d) .debug_info=%8ph\n",
482                                 pstr_space, p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id,
483                                 p_obj->dwarf.pb_info );
484         printf(" %s\t\t[TYPE(Single)] size= %u, encoding= %xh, BitOffset=%d, BitSize=%d, Endianity=%x\n",
485                                 pstr_space, p_obj->info.type.dw_size, p_obj->info.type.b_encoding,
486                                 p_obj->info.type.b_bit_offset, p_obj->info.type.b_bit_size,
487                                 p_obj->info.type.b_endianity );
488         printf(" %s\t\t[TYPE(Single)] Link Addr= %8ph  -> ObjID= %d\n",
489                                 pstr_space, p_obj->info.type.p_dwtype, p_obj->info.type.i_objid_type );
490
491         return;
492 }
493
494 /*--------------------------------------------------------------------*/
495 void
496         Debug_ObjectInfo_Print_Type_Multi(
497                         LibGoblin_ObjectInfo    *p_obj,
498                         char    *pstr_space,
499                         Byte    b_level )
500 {
501         printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d) .debug_info=%8ph\n",
502                                 pstr_space, p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id,
503                                 p_obj->dwarf.pb_info );
504
505         return;
506 }
507
508 /*--------------------------------------------------------------------*/
509 void
510         Debug_ObjectInfo_Print_Typedef(
511                         LibGoblin_ObjectInfo    *p_obj,
512                         char    *pstr_space,
513                         Byte    b_level )
514 {
515         printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d) .debug_info=%8ph\n",
516                                 pstr_space, p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id,
517                                 p_obj->dwarf.pb_info );
518         printf(" %s\t\t[TYPEDEF] Link Addr= %8ph  -> ObjID= %d\n",
519                                 pstr_space, p_obj->info.type.p_dwtype, p_obj->info.type.i_objid_type );
520
521         return;
522 }
523
524 /*====================================================================*/
525 /*--------------------------------------------------------------------*/
526 void
527         Debug_ObjectInfo_PrintInfo(
528                         LibGoblin_ObjectInfo    *p_obj,
529                         int             i_depth,
530                         char    *pstr_space,
531                         int             i_len,
532                         Byte    b_level )
533 {
534         // Set Space String ---
535         if( 0 < i_depth )       {
536                 *(pstr_space + i_len - 2)       = '+';
537                 *(pstr_space + i_len - 1)       = '-';
538         }
539         printf(" %sOBJINFO[%4d] (%-8s)\t%16lxh - %16lxh (Size: %16lxh) : %s\n",
540                                 pstr_space, p_obj->i_id,
541                                 gstr_type[ p_obj->b_type ],
542                                 p_obj->addr.ptr_addr.value,
543                                 (( 0 < p_obj->addr.qw_size )
544                                         ? (p_obj->addr.ptr_addr.value + p_obj->addr.qw_size - 1)
545                                         : p_obj->addr.ptr_addr.value),
546                                 p_obj->addr.qw_size,
547                                 p_obj->pstr_name );
548
549         if( 0 < i_depth )       {
550                 if( NO_OBJINFO != p_obj->grplink.i_next_id )
551                                 { *(pstr_space + i_len - 2)     = '|'; }
552                 else    { *(pstr_space + i_len - 2)     = ' '; }
553                 *(pstr_space + i_len - 1)       = ' ';
554         }
555
556         if( NO_OBJINFO != p_obj->grplink.i_child_topid )
557                         { strcat( pstr_space, " | " ); }
558         else    { strcat( pstr_space, "   " ); }
559
560         switch( p_obj->b_type ) {
561                 case OBJINFO_TYPE_PROGRAM:
562                         Debug_ObjectInfo_Print_ProgramFile( p_obj, pstr_space, b_level );
563                         break;
564
565                 case OBJINFO_TYPE_PROGHDR:
566                         Debug_ObjectInfo_Print_ProgramHeader( p_obj, pstr_space, b_level );
567                         break;
568
569                 case OBJINFO_TYPE_SECTION:
570                         Debug_ObjectInfo_Print_Section( p_obj, pstr_space, b_level );
571                         break;
572
573                 case OBJINFO_TYPE_OBJFILE:
574                         Debug_ObjectInfo_Print_ObjectFile( p_obj, pstr_space, b_level );
575                         break;
576
577                 case OBJINFO_TYPE_TYPE_SINGLE:
578                         Debug_ObjectInfo_Print_Type_Single( p_obj, pstr_space, b_level );
579                         break;
580
581                 case OBJINFO_TYPE_TYPE_MULTI:
582                         Debug_ObjectInfo_Print_Type_Multi( p_obj, pstr_space, b_level );
583                         break;
584
585                 case OBJINFO_TYPE_TYPEDEF:
586                         Debug_ObjectInfo_Print_Typedef( p_obj, pstr_space, b_level );
587                         break;
588
589                 case OBJINFO_TYPE_FUNCTION:
590                         Debug_ObjectInfo_Print_Function( p_obj, pstr_space, b_level );
591                         break;
592
593                 case OBJINFO_TYPE_OBJECT:
594                         Debug_ObjectInfo_Print_Object( p_obj, pstr_space, b_level );
595                         break;
596
597                 case OBJINFO_TYPE_COMMON:
598                         Debug_ObjectInfo_Print_Common( p_obj, pstr_space, b_level );
599                         break;
600
601                 case OBJINFO_TYPE_TLS:
602                         Debug_ObjectInfo_Print_TLS( p_obj, pstr_space, b_level );
603                         break;
604
605                 case OBJINFO_TYPE_REL:
606                         Debug_ObjectInfo_Print_Rel( p_obj, pstr_space, b_level );
607                         break;
608
609                 default:
610                         break;
611         }
612
613         if( NO_SRC != p_obj->i_srcid )  {
614                 printf(" %s\t\t[SrcFile] SrcFileID= %d,  Line= %u\n",
615                                         pstr_space, p_obj->i_srcid, p_obj->dw_srcline );
616         }
617
618         printf(" %s\n", pstr_space );
619
620         *(pstr_space + i_len)   = '\0';
621
622         return;
623 }
624
625
626 /*====================================================================*/
627 /*--------------------------------------------------------------------*/
628 LIBGOBLIN_DEBUG_OBJINFO_EXTERN
629 int
630         Debug_ObjectInfo_Print_AllAddrLink(
631                         LibGoblin_ProgramInfo   *p_pginfo,
632                         Byte            b_level )
633 {
634         //LibGoblin_ObjectInfo  *p_objinfo;
635
636         if( 0x00 < b_level )
637                 { puts("[DEBUG] ObjectInfo - Addr.Link --------------------------------------"); }
638
639
640
641
642         if( 0x00 < b_level )    {
643                 puts("-----------------------------------------------------------------------");
644                 puts("");
645         }
646
647         return 0x00;
648 }
649
650 /*====================================================================*/
651 /*--------------------------------------------------------------------*/
652 void
653         Debug_ObjectInfo_Print_GroupLink(
654                         LibGoblin_ProgramInfo   *p_pginfo,
655                         LibGoblin_ObjectInfo    *p_objstart,
656                         int             i_depth,
657                         char    *pstr_space,
658                         Byte    b_level )
659 {
660         int     i_len;
661         LibGoblin_ObjectInfo    *p_objinfo;
662
663         i_len   = strnlen( pstr_space, 384 );
664         if( 0 < i_depth )       { strcat( pstr_space, " | " ); }
665
666         if( NULL == p_objstart )        { return; }
667         p_objinfo       = p_objstart;
668         do      {
669                 // Print ObjInfo ---
670                 Debug_ObjectInfo_PrintInfo( p_objinfo, i_depth, pstr_space,
671                                                 (i_len + ((0 < i_depth) ? 3 : 0)), b_level );
672
673                 // Child. ---
674                 if( NO_OBJINFO != p_objinfo->grplink.i_child_topid )    {
675                         Debug_ObjectInfo_Print_GroupLink(
676                                         p_pginfo,
677                                         OBJINFO( p_pginfo, p_objinfo->grplink.i_child_topid ),
678                                         (i_depth + 1), pstr_space, b_level );
679                 }
680
681                 // Set Next ObjectInfo ---
682                 p_objinfo       = ((NO_OBJINFO == p_objinfo->grplink.i_next_id)
683                                                         ? NULL : OBJINFO( p_pginfo, p_objinfo->grplink.i_next_id ));
684         } while( NULL != p_objinfo );
685
686         *(pstr_space + i_len)   = '\0';
687
688         return;
689 }
690
691
692 /*--------------------------------------------------------------------*/
693 LIBGOBLIN_DEBUG_OBJINFO_EXTERN
694 int
695         Debug_ObjectInfo_Print_AllGroupLink(
696                         LibGoblin_ProgramInfo   *p_pginfo,
697                         Byte            b_level )
698 {
699         char                                    str_space[384];
700         //LibGoblin_ObjectInfo  *p_objinfo;
701
702         str_space[0]    = '\0';
703
704         if( 0x00 < b_level )
705                 { puts("[DEBUG] ObjectInfo - GroupLink --------------------------------------"); }
706
707
708         Debug_ObjectInfo_Print_GroupLink( p_pginfo, p_pginfo->objinfo.p_objinfo, 0, str_space, b_level );
709
710         if( 0x00 < b_level )    {
711                 puts("-----------------------------------------------------------------------");
712                 puts("");
713         }
714
715         return 0x00;
716 }
717
718
719 /* EOF of drd64_.c ----------------------------------- */