1 /* Sysroff object format dumper.
2 Copyright 1994, 1995, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007
3 Free Software Foundation, Inc.
5 This file is part of GNU Binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
23 /* Written by Steve Chamberlain <sac@cygnus.com>.
25 This program reads a SYSROFF object file and prints it in an
26 almost human readable form to stdout. */
30 #include "safe-ctype.h"
31 #include "libiberty.h"
37 static int segmented_p
;
39 static int addrsize
= 4;
42 static void dh (unsigned char *, int);
43 static void itheader (char *, int);
45 static void tabout (void);
46 static void pbarray (barray
*);
47 static int getone (int);
49 static void must (int);
50 static void tab (int, char *);
51 static void dump_symbol_info (void);
52 static void derived_type (void);
53 static void module (void);
54 static void show_usage (FILE *, int);
56 extern int main (int, char **);
59 getCHARS (unsigned char *ptr
, int *idx
, int size
, int max
)
70 /* Got to work out the length of the string from self. */
76 r
= xcalloc (b
+ 1, 1);
77 memcpy (r
, ptr
+ oc
, b
);
84 dh (unsigned char *ptr
, int size
)
90 printf ("\n************************************************************\n");
92 for (i
= 0; i
< size
; i
+= span
)
94 for (j
= 0; j
< span
; j
++)
97 printf ("%02x ", ptr
[i
+ j
]);
102 for (j
= 0; j
< span
&& j
+ i
< size
; j
++)
106 if (c
< 32 || c
> 127)
116 fillup (unsigned char *ptr
)
122 size
= getc (file
) - 2;
123 fread (ptr
, 1, size
, file
);
124 sum
= code
+ size
+ 2;
126 for (i
= 0; i
< size
; i
++)
129 if ((sum
& 0xff) != 0xff)
130 printf ("SUM IS %x\n", sum
);
139 getBARRAY (unsigned char *ptr
, int *idx
, int dsize ATTRIBUTE_UNUSED
,
140 int max ATTRIBUTE_UNUSED
)
145 int size
= ptr
[byte
++];
148 res
.data
= (unsigned char *) xmalloc (size
);
150 for (i
= 0; i
< size
; i
++)
151 res
.data
[i
] = ptr
[byte
++];
157 getINT (unsigned char *ptr
, int *idx
, int size
, int max
)
179 n
= (ptr
[byte
+ 0] << 8) + ptr
[byte
+ 1];
182 n
= (ptr
[byte
+ 0] << 24) + (ptr
[byte
+ 1] << 16) + (ptr
[byte
+ 2] << 8) + (ptr
[byte
+ 3]);
193 getBITS (unsigned char *ptr
, int *idx
, int size
, int max
)
203 return (ptr
[byte
] >> (8 - bit
- size
)) & ((1 << size
) - 1);
207 itheader (char *name
, int code
)
209 printf ("\n%s 0x%02x\n", name
, code
);
219 for (i
= 0; i
< indent
; i
++)
236 printf ("%d (", y
->len
);
238 for (x
= 0; x
< y
->len
; x
++)
239 printf ("(%02x %c)", y
->data
[x
],
240 ISPRINT (y
->data
[x
]) ? y
->data
[x
] : '.');
245 #define SYSROFF_PRINT
246 #define SYSROFF_SWAP_IN
250 /* FIXME: sysinfo, which generates sysroff.[ch] from sysroff.info, can't
251 hack the special case of the tr block, which has no contents. So we
252 implement our own functions for reading in and printing out the tr
255 #define IT_tr_CODE 0x7f
258 sysroff_swap_tr_in (void)
260 unsigned char raw
[255];
262 memset (raw
, 0, 255);
267 sysroff_print_tr_out (void)
269 itheader ("tr", IT_tr_CODE
);
279 if ((c
& 0x7f) != type
)
290 sysroff_swap_cs_in (&dummy
);
291 sysroff_print_cs_out (&dummy
);
298 sysroff_swap_dln_in (&dummy
);
299 sysroff_print_dln_out (&dummy
);
306 sysroff_swap_hd_in (&dummy
);
307 addrsize
= dummy
.afl
;
308 sysroff_print_hd_out (&dummy
);
315 sysroff_swap_dar_in (&dummy
);
316 sysroff_print_dar_out (&dummy
);
323 sysroff_swap_dsy_in (&dummy
);
324 sysroff_print_dsy_out (&dummy
);
331 sysroff_swap_dfp_in (&dummy
);
332 sysroff_print_dfp_out (&dummy
);
339 sysroff_swap_dso_in (&dummy
);
340 sysroff_print_dso_out (&dummy
);
347 sysroff_swap_dpt_in (&dummy
);
348 sysroff_print_dpt_out (&dummy
);
355 sysroff_swap_den_in (&dummy
);
356 sysroff_print_den_out (&dummy
);
363 sysroff_swap_dbt_in (&dummy
);
364 sysroff_print_dbt_out (&dummy
);
371 sysroff_swap_dty_in (&dummy
);
372 sysroff_print_dty_out (&dummy
);
379 sysroff_swap_un_in (&dummy
);
380 sysroff_print_un_out (&dummy
);
387 sysroff_swap_sc_in (&dummy
);
388 sysroff_print_sc_out (&dummy
);
395 sysroff_swap_er_in (&dummy
);
396 sysroff_print_er_out (&dummy
);
403 sysroff_swap_ed_in (&dummy
);
404 sysroff_print_ed_out (&dummy
);
411 sysroff_swap_sh_in (&dummy
);
412 sysroff_print_sh_out (&dummy
);
419 sysroff_swap_ob_in (&dummy
);
420 sysroff_print_ob_out (&dummy
);
427 sysroff_swap_rl_in (&dummy
);
428 sysroff_print_rl_out (&dummy
);
435 sysroff_swap_du_in (&dummy
);
437 sysroff_print_du_out (&dummy
);
444 sysroff_swap_dus_in (&dummy
);
445 sysroff_print_dus_out (&dummy
);
452 sysroff_swap_dul_in (&dummy
);
453 sysroff_print_dul_out (&dummy
);
460 sysroff_swap_dss_in (&dummy
);
461 sysroff_print_dss_out (&dummy
);
468 sysroff_swap_hs_in (&dummy
);
469 sysroff_print_hs_out (&dummy
);
476 sysroff_swap_dps_in (&dummy
);
477 sysroff_print_dps_out (&dummy
);
482 sysroff_swap_tr_in ();
483 sysroff_print_tr_out ();
490 sysroff_swap_dds_in (&dummy
);
491 sysroff_print_dds_out (&dummy
);
496 printf ("GOT A %x\n", c
);
514 printf ("WANTED %x!!\n", x
);
531 dump_symbol_info (void)
533 tab (1, "SYMBOL INFO");
535 while (opt (IT_dsy_CODE
))
537 if (opt (IT_dty_CODE
))
551 tab (1, "DERIVED TYPE");
555 if (opt (IT_dpp_CODE
))
560 else if (opt (IT_dfp_CODE
))
565 else if (opt (IT_den_CODE
))
570 else if (opt (IT_den_CODE
))
575 else if (opt (IT_dds_CODE
))
580 else if (opt (IT_dar_CODE
))
583 else if (opt (IT_dpt_CODE
))
586 else if (opt (IT_dul_CODE
))
589 else if (opt (IT_dse_CODE
))
592 else if (opt (IT_dot_CODE
))
608 tab (1, "MODULE***\n");
617 while (getone (c
) && c
!= IT_tr_CODE
);
638 show_usage (FILE *file
, int status
)
640 fprintf (file
, _("Usage: %s [option(s)] in-file\n"), program_name
);
641 fprintf (file
, _("Print a human readable interpretation of a SYSROFF object file\n"));
642 fprintf (file
, _(" The options are:\n\
643 -h --help Display this information\n\
644 -v --version Print the program's version number\n"));
646 if (REPORT_BUGS_TO
[0] && status
== 0)
647 fprintf (file
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
652 main (int ac
, char **av
)
654 char *input_file
= NULL
;
656 static struct option long_options
[] =
658 {"help", no_argument
, 0, 'h'},
659 {"version", no_argument
, 0, 'V'},
660 {NULL
, no_argument
, 0, 0}
663 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
664 setlocale (LC_MESSAGES
, "");
666 #if defined (HAVE_SETLOCALE)
667 setlocale (LC_CTYPE
, "");
669 bindtextdomain (PACKAGE
, LOCALEDIR
);
670 textdomain (PACKAGE
);
672 program_name
= av
[0];
673 xmalloc_set_program_name (program_name
);
675 expandargv (&ac
, &av
);
677 while ((opt
= getopt_long (ac
, av
, "HhVv", long_options
, (int *) NULL
)) != EOF
)
683 show_usage (stdout
, 0);
687 print_version ("sysdump");
693 show_usage (stderr
, 1);
698 /* The input and output files may be named on the command line. */
701 input_file
= av
[optind
];
704 fatal (_("no input file specified"));
706 file
= fopen (input_file
, FOPEN_RB
);
709 fatal (_("cannot open input file %s"), input_file
);