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_DEBUG_OBJINFO
38 #include"drd64_libgoblin.h"
40 static char gstr_type[256][9] = {
58 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
59 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
60 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
61 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
62 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
63 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
64 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
67 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
68 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
69 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
70 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
71 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
72 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
73 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
74 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
77 /*====================================================================*/
78 /*--------------------------------------------------------------------*/
80 Debug_ObjectInfo_Print_SymbolCommon(
81 LibGoblin_ObjectInfo *p_obj,
87 char str_visibility[32];
88 LibGoblin_BinaryInfo *p_binfo_origin;
90 printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d) .debug_info=%8ph File{ Offset=%8p, Size=%8ld, BinFileID=%d }\n",
92 p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id,
94 p_obj->file.pv_offset, p_obj->file.qw_size, p_obj->file.i_binfile );
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" );
101 case STT_OBJECT: // 1 - Data object.
102 strcpy( str_type, "Data Object" );
104 case STT_FUNC: // 2 - Function.
105 strcpy( str_type, "Function" );
107 case STT_SECTION: // 3 - Section.
108 strcpy( str_type, "Section" );
110 case STT_FILE: // 4 - Source file.
111 strcpy( str_type, "Source File" );
113 case STT_COMMON: // 5 - Uninitialized common block.
114 strcpy( str_type, "UnInit. CommonBlock" );
116 case STT_TLS: // 6 - TLS object.
117 strcpy( str_type, "TLS Object" );
120 strcpy( str_type, "Num" );
123 strcpy( str_type, "GNU IFunc" );
126 snprintf( str_type, 31, "(%02xh)", p_obj->elfsym.b_type );
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" );
135 case STB_GLOBAL: // 1 - Global symbol
136 strcpy( str_binding, "Global" );
138 case STB_WEAK: // 2 - like global - lower precedence
139 strcpy( str_binding, "WEAK" );
141 case STB_GNU_UNIQUE: // 10 - Unique symbol (GNU)
142 strcpy( str_binding, "GNU Unique" );
145 snprintf( str_binding, 31, "(%02xh)", p_obj->elfsym.b_binding );
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" );
155 case STV_INTERNAL: // 0x01 - Special meaning in relocatable objects.
156 strcpy( str_visibility, "INTERNAL" );
158 case STV_HIDDEN: // 0x02 - Not visible.
159 strcpy( str_visibility, "HIDDEN" );
161 case STV_PROTECTED: // 0x03 - Visible but not preemptible.
162 strcpy( str_visibility, "PROTECTED" );
165 strcpy( str_visibility, "EXPORTED" );
168 strcpy( str_visibility, "SINGLETON" );
171 strcpy( str_visibility, "ELIMINATE" );
174 snprintf( str_binding, 31, "(%02xh)", p_obj->elfsym.b_binding );
178 printf(" %s\t\t[SYMBOL] Type: %s, Binding: %s, Visibility: %s\n",
179 pstr_space, str_type, str_binding, str_visibility );
182 if( OBJINFO_STATUS_DYNAMIC & p_obj->dw_status ) {
183 p_binfo_origin = BinaryInfo_GetBinInfo( p_obj->dynamic.i_binfo_origin );
185 printf(" %s\t\t[DYNAMIC] Lib.Name: %s (binfo id= %d), .dynsym index= %d\n",
187 ((NULL != p_binfo_origin) ? p_binfo_origin->str_filename : "--NULL--"),
188 p_obj->dynamic.i_binfo_origin, p_obj->dynamic.i_dynsym_index );
195 /*--------------------------------------------------------------------*/
197 Debug_ObjectInfo_Print_Function(
198 LibGoblin_ObjectInfo *p_obj,
202 Debug_ObjectInfo_Print_SymbolCommon( p_obj, pstr_space, b_level );
206 /*--------------------------------------------------------------------*/
208 Debug_ObjectInfo_Print_Object(
209 LibGoblin_ObjectInfo *p_obj,
213 Debug_ObjectInfo_Print_SymbolCommon( p_obj, pstr_space, b_level );
217 /*--------------------------------------------------------------------*/
219 Debug_ObjectInfo_Print_Common(
220 LibGoblin_ObjectInfo *p_obj,
224 Debug_ObjectInfo_Print_SymbolCommon( p_obj, pstr_space, b_level );
228 /*--------------------------------------------------------------------*/
230 Debug_ObjectInfo_Print_TLS(
231 LibGoblin_ObjectInfo *p_obj,
235 Debug_ObjectInfo_Print_SymbolCommon( p_obj, pstr_space, b_level );
239 /*--------------------------------------------------------------------*/
241 Debug_ObjectInfo_Print_Rel(
242 LibGoblin_ObjectInfo *p_obj,
246 //Debug_ObjectInfo_Print_SymbolCommon( p_obj, pstr_space, b_level );
250 /*--------------------------------------------------------------------*/
252 Debug_ObjectInfo_Print_Section(
253 LibGoblin_ObjectInfo *p_obj,
261 printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d) .debug_info=%8ph File{ Offset=%8p, Size=%8ld, BinFileID=%d }\n",
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 );
268 switch( p_obj->info.section.dw_type ) {
271 strncpy( str_type, "NULL", 31 );
273 /* 1 - program defined information */
275 strncpy( str_type, "PROGBITS", 31 );
277 /* 2 - symbol table section */
279 strncpy( str_type, "SYMTAB", 31 );
281 /* 3 - string table section */
283 strncpy( str_type, "STRTAB", 31 );
285 /* 4 - relocation section with addends */
287 strncpy( str_type, "RELA", 31 );
289 /* 5 - symbol hash table section */
291 strncpy( str_type, "HASH", 31 );
293 /* 6 - dynamic section */
295 strncpy( str_type, "DYNAMIC", 31 );
297 /* 7 - note section */
299 strncpy( str_type, "NOTE", 31 );
301 /* 8 - no space section */
303 strncpy( str_type, "NOBITS", 31 );
305 /* 9 - relocation section - no addends */
307 strncpy( str_type, "REL", 31 );
309 /* 10 - reserved - purpose unknown */
311 strncpy( str_type, "SHLIB", 31 );
313 /* 11 - dynamic symbol table section */
315 strncpy( str_type, "DYNSYM", 31 );
317 /* 14 - Initialization function pointers. */
319 strncpy( str_type, "INIT_ARRAY", 31 );
321 /* 15 - Termination function pointers. */
323 strncpy( str_type, "FINI_ARRAY", 31 );
325 /* 16 - Pre-initialization function ptrs. */
326 case SHT_PREINIT_ARRAY:
327 strncpy( str_type, "PREINIT_ARRAY", 31 );
329 /* 17 - Section group. */
331 strncpy( str_type, "GROUP", 31 );
333 /* 18 - Section indexes (see SHN_XINDEX). */
334 case SHT_SYMTAB_SHNDX:
335 strncpy( str_type, "SYMTAB_SHNDX", 31 );
339 snprintf( str_type, 31, "(%8x)", p_obj->info.section.dw_type );
343 qw_flag = p_obj->info.section.qw_flag;
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 " ); }
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 );
377 /*--------------------------------------------------------------------*/
379 Debug_ObjectInfo_Print_ProgramHeader(
380 LibGoblin_ObjectInfo *p_obj,
388 printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d) .debug_info=%8ph File{ Offset=%8p, Size=%8ld, BinFileID=%d }\n",
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 );
394 switch( p_obj->info.proghdr.dw_type ) {
396 strncpy( str_type, "NULL", 31 );
399 strncpy( str_type, "LOAD", 31 );
402 strncpy( str_type, "DYNAMIC", 31 );
405 strncpy( str_type, "INTERP", 31 );
408 strncpy( str_type, "NOTE", 31 );
411 strncpy( str_type, "SHLIB", 31 );
414 strncpy( str_type, "PHDR", 31 );
417 strncpy( str_type, "TLS", 31 );
420 snprintf( str_type, 31, "(%8x)", p_obj->info.proghdr.dw_type );
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': ' ') );
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 );
438 /*--------------------------------------------------------------------*/
440 Debug_ObjectInfo_Print_ProgramFile(
441 LibGoblin_ObjectInfo *p_obj,
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 );
449 printf(" %s\t\t[PROGRAM] BinaryInfo ID= %d\n",
450 pstr_space, p_obj->info.program.i_binfo_id );
455 /*--------------------------------------------------------------------*/
457 Debug_ObjectInfo_Print_ObjectFile(
458 LibGoblin_ObjectInfo *p_obj,
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 );
474 /*--------------------------------------------------------------------*/
476 Debug_ObjectInfo_Print_Type_Single(
477 LibGoblin_ObjectInfo *p_obj,
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 );
494 /*--------------------------------------------------------------------*/
496 Debug_ObjectInfo_Print_Type_Multi(
497 LibGoblin_ObjectInfo *p_obj,
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 );
508 /*--------------------------------------------------------------------*/
510 Debug_ObjectInfo_Print_Typedef(
511 LibGoblin_ObjectInfo *p_obj,
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 );
524 /*====================================================================*/
525 /*--------------------------------------------------------------------*/
527 Debug_ObjectInfo_PrintInfo(
528 LibGoblin_ObjectInfo *p_obj,
534 // Set Space String ---
536 *(pstr_space + i_len - 2) = '+';
537 *(pstr_space + i_len - 1) = '-';
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),
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) = ' ';
556 if( NO_OBJINFO != p_obj->grplink.i_child_topid )
557 { strcat( pstr_space, " | " ); }
558 else { strcat( pstr_space, " " ); }
560 switch( p_obj->b_type ) {
561 case OBJINFO_TYPE_PROGRAM:
562 Debug_ObjectInfo_Print_ProgramFile( p_obj, pstr_space, b_level );
565 case OBJINFO_TYPE_PROGHDR:
566 Debug_ObjectInfo_Print_ProgramHeader( p_obj, pstr_space, b_level );
569 case OBJINFO_TYPE_SECTION:
570 Debug_ObjectInfo_Print_Section( p_obj, pstr_space, b_level );
573 case OBJINFO_TYPE_OBJFILE:
574 Debug_ObjectInfo_Print_ObjectFile( p_obj, pstr_space, b_level );
577 case OBJINFO_TYPE_TYPE_SINGLE:
578 Debug_ObjectInfo_Print_Type_Single( p_obj, pstr_space, b_level );
581 case OBJINFO_TYPE_TYPE_MULTI:
582 Debug_ObjectInfo_Print_Type_Multi( p_obj, pstr_space, b_level );
585 case OBJINFO_TYPE_TYPEDEF:
586 Debug_ObjectInfo_Print_Typedef( p_obj, pstr_space, b_level );
589 case OBJINFO_TYPE_FUNCTION:
590 Debug_ObjectInfo_Print_Function( p_obj, pstr_space, b_level );
593 case OBJINFO_TYPE_OBJECT:
594 Debug_ObjectInfo_Print_Object( p_obj, pstr_space, b_level );
597 case OBJINFO_TYPE_COMMON:
598 Debug_ObjectInfo_Print_Common( p_obj, pstr_space, b_level );
601 case OBJINFO_TYPE_TLS:
602 Debug_ObjectInfo_Print_TLS( p_obj, pstr_space, b_level );
605 case OBJINFO_TYPE_REL:
606 Debug_ObjectInfo_Print_Rel( p_obj, pstr_space, b_level );
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 );
618 printf(" %s\n", pstr_space );
620 *(pstr_space + i_len) = '\0';
626 /*====================================================================*/
627 /*--------------------------------------------------------------------*/
628 LIBGOBLIN_DEBUG_OBJINFO_EXTERN
630 Debug_ObjectInfo_Print_AllAddrLink(
631 LibGoblin_ProgramInfo *p_pginfo,
634 //LibGoblin_ObjectInfo *p_objinfo;
637 { puts("[DEBUG] ObjectInfo - Addr.Link --------------------------------------"); }
642 if( 0x00 < b_level ) {
643 puts("-----------------------------------------------------------------------");
650 /*====================================================================*/
651 /*--------------------------------------------------------------------*/
653 Debug_ObjectInfo_Print_GroupLink(
654 LibGoblin_ProgramInfo *p_pginfo,
655 LibGoblin_ObjectInfo *p_objstart,
661 LibGoblin_ObjectInfo *p_objinfo;
663 i_len = strnlen( pstr_space, 384 );
664 if( 0 < i_depth ) { strcat( pstr_space, " | " ); }
666 if( NULL == p_objstart ) { return; }
667 p_objinfo = p_objstart;
670 Debug_ObjectInfo_PrintInfo( p_objinfo, i_depth, pstr_space,
671 (i_len + ((0 < i_depth) ? 3 : 0)), b_level );
674 if( NO_OBJINFO != p_objinfo->grplink.i_child_topid ) {
675 Debug_ObjectInfo_Print_GroupLink(
677 OBJINFO( p_pginfo, p_objinfo->grplink.i_child_topid ),
678 (i_depth + 1), pstr_space, b_level );
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 );
686 *(pstr_space + i_len) = '\0';
692 /*--------------------------------------------------------------------*/
693 LIBGOBLIN_DEBUG_OBJINFO_EXTERN
695 Debug_ObjectInfo_Print_AllGroupLink(
696 LibGoblin_ProgramInfo *p_pginfo,
700 //LibGoblin_ObjectInfo *p_objinfo;
705 { puts("[DEBUG] ObjectInfo - GroupLink --------------------------------------"); }
708 Debug_ObjectInfo_Print_GroupLink( p_pginfo, p_pginfo->objinfo.p_objinfo, 0, str_space, b_level );
710 if( 0x00 < b_level ) {
711 puts("-----------------------------------------------------------------------");
719 /* EOF of drd64_.c ----------------------------------- */