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         "FUNCTION",             // 0x08
51         "OBJECT",               // 0x09
52         "COMMON",               // 0x0a
53         "TLS",                  // 0x0b
54         "REL",                  // 0x0d
55         "",                             // 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->info.symbol.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->info.symbol.b_type );
127                         break;
128         }
129
130         // Symbol Binding - ELFNN_ST_BIND - st_info
131         switch( p_obj->info.symbol.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->info.symbol.b_binding );
146                         break;
147         }
148
149
150         // Symbol visibility - ELFNN_ST_VISIBILITY - st_other
151         switch( p_obj->info.symbol.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->info.symbol.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 /*--------------------------------------------------------------------*/
510 void
511         Debug_ObjectInfo_PrintInfo(
512                         LibGoblin_ObjectInfo    *p_obj,
513                         int             i_depth,
514                         char    *pstr_space,
515                         int             i_len,
516                         Byte    b_level )
517 {
518         // Set Space String ---
519         if( 0 < i_depth )       {
520                 *(pstr_space + i_len - 2)       = '+';
521                 *(pstr_space + i_len - 1)       = '-';
522         }
523         printf(" %sOBJINFO[%4d] (%-8s)\t%16lxh - %16lxh (Size: %16lxh) : %s\n",
524                                 pstr_space, p_obj->i_id,
525                                 gstr_type[ p_obj->b_type ],
526                                 p_obj->addr.ptr_addr.value,
527                                 (( 0 < p_obj->addr.qw_size )
528                                         ? (p_obj->addr.ptr_addr.value + p_obj->addr.qw_size - 1)
529                                         : p_obj->addr.ptr_addr.value),
530                                 p_obj->addr.qw_size,
531                                 p_obj->pstr_name );
532
533         if( 0 < i_depth )       {
534                 if( NO_OBJINFO != p_obj->grplink.i_next_id )
535                                 { *(pstr_space + i_len - 2)     = '|'; }
536                 else    { *(pstr_space + i_len - 2)     = ' '; }
537                 *(pstr_space + i_len - 1)       = ' ';
538         }
539
540         if( NO_OBJINFO != p_obj->grplink.i_child_topid )
541                         { strcat( pstr_space, " | " ); }
542         else    { strcat( pstr_space, "   " ); }
543
544         switch( p_obj->b_type ) {
545                 case OBJINFO_TYPE_PROGRAM:
546                         Debug_ObjectInfo_Print_ProgramFile( p_obj, pstr_space, b_level );
547                         break;
548
549                 case OBJINFO_TYPE_PROGHDR:
550                         Debug_ObjectInfo_Print_ProgramHeader( p_obj, pstr_space, b_level );
551                         break;
552
553                 case OBJINFO_TYPE_SECTION:
554                         Debug_ObjectInfo_Print_Section( p_obj, pstr_space, b_level );
555                         break;
556
557                 case OBJINFO_TYPE_OBJFILE:
558                         Debug_ObjectInfo_Print_ObjectFile( p_obj, pstr_space, b_level );
559                         break;
560
561                 case OBJINFO_TYPE_TYPE_SINGLE:
562                         Debug_ObjectInfo_Print_Type_Single( p_obj, pstr_space, b_level );
563                         break;
564
565                 case OBJINFO_TYPE_TYPE_MULTI:
566                         Debug_ObjectInfo_Print_Type_Multi( p_obj, pstr_space, b_level );
567                         break;
568
569                 case OBJINFO_TYPE_FUNCTION:
570                         Debug_ObjectInfo_Print_Function( p_obj, pstr_space, b_level );
571                         break;
572
573                 case OBJINFO_TYPE_OBJECT:
574                         Debug_ObjectInfo_Print_Object( p_obj, pstr_space, b_level );
575                         break;
576
577                 case OBJINFO_TYPE_COMMON:
578                         Debug_ObjectInfo_Print_Common( p_obj, pstr_space, b_level );
579                         break;
580
581                 case OBJINFO_TYPE_TLS:
582                         Debug_ObjectInfo_Print_TLS( p_obj, pstr_space, b_level );
583                         break;
584
585                 case OBJINFO_TYPE_REL:
586                         Debug_ObjectInfo_Print_Rel( p_obj, pstr_space, b_level );
587                         break;
588
589                 default:
590                         break;
591         }
592
593         if( NO_SRC != p_obj->i_srcid )  {
594                 printf(" %s\t\t[SrcFile] SrcFileID= %d,  Line= %u\n",
595                                         pstr_space, p_obj->i_srcid, p_obj->dw_srcline );
596         }
597
598         printf(" %s\n", pstr_space );
599
600         *(pstr_space + i_len)   = '\0';
601
602         return;
603 }
604
605
606 /*====================================================================*/
607 /*--------------------------------------------------------------------*/
608 LIBGOBLIN_DEBUG_OBJINFO_EXTERN
609 int
610         Debug_ObjectInfo_Print_AllAddrLink(
611                         LibGoblin_ProgramInfo   *p_pginfo,
612                         Byte            b_level )
613 {
614         //LibGoblin_ObjectInfo  *p_objinfo;
615
616         if( 0x00 < b_level )
617                 { puts("[DEBUG] ObjectInfo - Addr.Link --------------------------------------"); }
618
619
620
621
622         if( 0x00 < b_level )    {
623                 puts("-----------------------------------------------------------------------");
624                 puts("");
625         }
626
627         return 0x00;
628 }
629
630 /*====================================================================*/
631 /*--------------------------------------------------------------------*/
632 void
633         Debug_ObjectInfo_Print_GroupLink(
634                         LibGoblin_ProgramInfo   *p_pginfo,
635                         LibGoblin_ObjectInfo    *p_objstart,
636                         int             i_depth,
637                         char    *pstr_space,
638                         Byte    b_level )
639 {
640         int     i_len;
641         LibGoblin_ObjectInfo    *p_objinfo;
642
643         i_len   = strnlen( pstr_space, 384 );
644         if( 0 < i_depth )       { strcat( pstr_space, " | " ); }
645
646         if( NULL == p_objstart )        { return; }
647         p_objinfo       = p_objstart;
648         do      {
649                 // Print ObjInfo ---
650                 Debug_ObjectInfo_PrintInfo( p_objinfo, i_depth, pstr_space,
651                                                 (i_len + ((0 < i_depth) ? 3 : 0)), b_level );
652
653                 // Child. ---
654                 if( NO_OBJINFO != p_objinfo->grplink.i_child_topid )    {
655                         Debug_ObjectInfo_Print_GroupLink(
656                                         p_pginfo,
657                                         OBJINFO( p_pginfo, p_objinfo->grplink.i_child_topid ),
658                                         (i_depth + 1), pstr_space, b_level );
659                 }
660
661                 // Set Next ObjectInfo ---
662                 p_objinfo       = ((NO_OBJINFO == p_objinfo->grplink.i_next_id)
663                                                         ? NULL : OBJINFO( p_pginfo, p_objinfo->grplink.i_next_id ));
664         } while( NULL != p_objinfo );
665
666         *(pstr_space + i_len)   = '\0';
667
668         return;
669 }
670
671
672 /*--------------------------------------------------------------------*/
673 LIBGOBLIN_DEBUG_OBJINFO_EXTERN
674 int
675         Debug_ObjectInfo_Print_AllGroupLink(
676                         LibGoblin_ProgramInfo   *p_pginfo,
677                         Byte            b_level )
678 {
679         char                                    str_space[384];
680         //LibGoblin_ObjectInfo  *p_objinfo;
681
682         str_space[0]    = '\0';
683
684         if( 0x00 < b_level )
685                 { puts("[DEBUG] ObjectInfo - GroupLink --------------------------------------"); }
686
687
688         Debug_ObjectInfo_Print_GroupLink( p_pginfo, p_pginfo->objinfo.p_objinfo, 0, str_space, b_level );
689
690         if( 0x00 < b_level )    {
691                 puts("-----------------------------------------------------------------------");
692                 puts("");
693         }
694
695         return 0x00;
696 }
697
698
699 /* EOF of drd64_.c ----------------------------------- */