xref: /dflybsd-src/contrib/binutils-2.27/binutils/od-xcoff.c (revision e656dc90e3d65d744d534af2f5ea88cf8101ebcf)
1*a9fa9459Szrj /* od-xcoff.c -- dump information about an xcoff object file.
2*a9fa9459Szrj    Copyright (C) 2011-2016 Free Software Foundation, Inc.
3*a9fa9459Szrj    Written by Tristan Gingold, Adacore.
4*a9fa9459Szrj 
5*a9fa9459Szrj    This file is part of GNU Binutils.
6*a9fa9459Szrj 
7*a9fa9459Szrj    This program is free software; you can redistribute it and/or modify
8*a9fa9459Szrj    it under the terms of the GNU General Public License as published by
9*a9fa9459Szrj    the Free Software Foundation; either version 3, or (at your option)
10*a9fa9459Szrj    any later version.
11*a9fa9459Szrj 
12*a9fa9459Szrj    This program is distributed in the hope that it will be useful,
13*a9fa9459Szrj    but WITHOUT ANY WARRANTY; without even the implied warranty of
14*a9fa9459Szrj    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*a9fa9459Szrj    GNU General Public License for more details.
16*a9fa9459Szrj 
17*a9fa9459Szrj    You should have received a copy of the GNU General Public License
18*a9fa9459Szrj    along with this program; if not, write to the Free Software
19*a9fa9459Szrj    Foundation, 51 Franklin Street - Fifth Floor, Boston,
20*a9fa9459Szrj    MA 02110-1301, USA.  */
21*a9fa9459Szrj 
22*a9fa9459Szrj #include "sysdep.h"
23*a9fa9459Szrj #include <stddef.h>
24*a9fa9459Szrj #include <time.h>
25*a9fa9459Szrj #include "safe-ctype.h"
26*a9fa9459Szrj #include "bfd.h"
27*a9fa9459Szrj #include "objdump.h"
28*a9fa9459Szrj #include "bucomm.h"
29*a9fa9459Szrj #include "bfdlink.h"
30*a9fa9459Szrj /* Force the support of weak symbols.  */
31*a9fa9459Szrj #ifndef AIX_WEAK_SUPPORT
32*a9fa9459Szrj #define AIX_WEAK_SUPPORT 1
33*a9fa9459Szrj #endif
34*a9fa9459Szrj #include "coff/internal.h"
35*a9fa9459Szrj #include "coff/rs6000.h"
36*a9fa9459Szrj #include "coff/xcoff.h"
37*a9fa9459Szrj #include "libcoff.h"
38*a9fa9459Szrj #include "libxcoff.h"
39*a9fa9459Szrj 
40*a9fa9459Szrj /* Index of the options in the options[] array.  */
41*a9fa9459Szrj #define OPT_FILE_HEADER 0
42*a9fa9459Szrj #define OPT_AOUT 1
43*a9fa9459Szrj #define OPT_SECTIONS 2
44*a9fa9459Szrj #define OPT_SYMS 3
45*a9fa9459Szrj #define OPT_RELOCS 4
46*a9fa9459Szrj #define OPT_LINENO 5
47*a9fa9459Szrj #define OPT_LOADER 6
48*a9fa9459Szrj #define OPT_EXCEPT 7
49*a9fa9459Szrj #define OPT_TYPCHK 8
50*a9fa9459Szrj #define OPT_TRACEBACK 9
51*a9fa9459Szrj #define OPT_TOC 10
52*a9fa9459Szrj #define OPT_LDINFO 11
53*a9fa9459Szrj 
54*a9fa9459Szrj /* List of actions.  */
55*a9fa9459Szrj static struct objdump_private_option options[] =
56*a9fa9459Szrj   {
57*a9fa9459Szrj     { "header", 0 },
58*a9fa9459Szrj     { "aout", 0 },
59*a9fa9459Szrj     { "sections", 0 },
60*a9fa9459Szrj     { "syms", 0 },
61*a9fa9459Szrj     { "relocs", 0 },
62*a9fa9459Szrj     { "lineno", 0 },
63*a9fa9459Szrj     { "loader", 0 },
64*a9fa9459Szrj     { "except", 0 },
65*a9fa9459Szrj     { "typchk", 0 },
66*a9fa9459Szrj     { "traceback", 0 },
67*a9fa9459Szrj     { "toc", 0 },
68*a9fa9459Szrj     { "ldinfo", 0 },
69*a9fa9459Szrj     { NULL, 0 }
70*a9fa9459Szrj   };
71*a9fa9459Szrj 
72*a9fa9459Szrj /* Display help.  */
73*a9fa9459Szrj 
74*a9fa9459Szrj static void
xcoff_help(FILE * stream)75*a9fa9459Szrj xcoff_help (FILE *stream)
76*a9fa9459Szrj {
77*a9fa9459Szrj   fprintf (stream, _("\
78*a9fa9459Szrj For XCOFF files:\n\
79*a9fa9459Szrj   header      Display the file header\n\
80*a9fa9459Szrj   aout        Display the auxiliary header\n\
81*a9fa9459Szrj   sections    Display the section headers\n\
82*a9fa9459Szrj   syms        Display the symbols table\n\
83*a9fa9459Szrj   relocs      Display the relocation entries\n\
84*a9fa9459Szrj   lineno      Display the line number entries\n\
85*a9fa9459Szrj   loader      Display loader section\n\
86*a9fa9459Szrj   except      Display exception table\n\
87*a9fa9459Szrj   typchk      Display type-check section\n\
88*a9fa9459Szrj   traceback   Display traceback tags\n\
89*a9fa9459Szrj   toc         Display toc symbols\n\
90*a9fa9459Szrj   ldinfo      Display loader info in core files\n\
91*a9fa9459Szrj "));
92*a9fa9459Szrj }
93*a9fa9459Szrj 
94*a9fa9459Szrj /* Return TRUE if ABFD is handled.  */
95*a9fa9459Szrj 
96*a9fa9459Szrj static int
xcoff_filter(bfd * abfd)97*a9fa9459Szrj xcoff_filter (bfd *abfd)
98*a9fa9459Szrj {
99*a9fa9459Szrj   return bfd_get_flavour (abfd) == bfd_target_xcoff_flavour;
100*a9fa9459Szrj }
101*a9fa9459Szrj 
102*a9fa9459Szrj /* Translation entry type.  The last entry must be {0, NULL}.  */
103*a9fa9459Szrj 
104*a9fa9459Szrj struct xlat_table {
105*a9fa9459Szrj   unsigned int val;
106*a9fa9459Szrj   const char *name;
107*a9fa9459Szrj };
108*a9fa9459Szrj 
109*a9fa9459Szrj /* Display the list of name (from TABLE) for FLAGS, using comma to separate
110*a9fa9459Szrj    them.  A name is displayed if FLAGS & VAL is not 0.  */
111*a9fa9459Szrj 
112*a9fa9459Szrj static void
dump_flags(const struct xlat_table * table,unsigned int flags)113*a9fa9459Szrj dump_flags (const struct xlat_table *table, unsigned int flags)
114*a9fa9459Szrj {
115*a9fa9459Szrj   unsigned int r = flags;
116*a9fa9459Szrj   int first = 1;
117*a9fa9459Szrj   const struct xlat_table *t;
118*a9fa9459Szrj 
119*a9fa9459Szrj   for (t = table; t->name; t++)
120*a9fa9459Szrj     if ((flags & t->val) != 0)
121*a9fa9459Szrj       {
122*a9fa9459Szrj         r &= ~t->val;
123*a9fa9459Szrj 
124*a9fa9459Szrj         if (first)
125*a9fa9459Szrj           first = 0;
126*a9fa9459Szrj         else
127*a9fa9459Szrj           putchar (',');
128*a9fa9459Szrj         fputs (t->name, stdout);
129*a9fa9459Szrj       }
130*a9fa9459Szrj 
131*a9fa9459Szrj   /* Not decoded flags.  */
132*a9fa9459Szrj   if (r != 0)
133*a9fa9459Szrj     {
134*a9fa9459Szrj       if (!first)
135*a9fa9459Szrj         putchar (',');
136*a9fa9459Szrj       printf ("0x%x", r);
137*a9fa9459Szrj     }
138*a9fa9459Szrj }
139*a9fa9459Szrj 
140*a9fa9459Szrj /* Display the name corresponding to VAL from TABLE, using at most
141*a9fa9459Szrj    MAXLEN char (possibly passed with spaces).  */
142*a9fa9459Szrj 
143*a9fa9459Szrj static void
dump_value(const struct xlat_table * table,unsigned int val,int maxlen)144*a9fa9459Szrj dump_value (const struct xlat_table *table, unsigned int val, int maxlen)
145*a9fa9459Szrj {
146*a9fa9459Szrj   const struct xlat_table *t;
147*a9fa9459Szrj 
148*a9fa9459Szrj   for (t = table; t->name; t++)
149*a9fa9459Szrj     if (t->val == val)
150*a9fa9459Szrj       {
151*a9fa9459Szrj         printf ("%-*s", maxlen, t->name);
152*a9fa9459Szrj         return;
153*a9fa9459Szrj       }
154*a9fa9459Szrj   printf ("(%*x)", maxlen - 2, val);
155*a9fa9459Szrj }
156*a9fa9459Szrj 
157*a9fa9459Szrj /* Names of f_flags.  */
158*a9fa9459Szrj static const struct xlat_table f_flag_xlat[] =
159*a9fa9459Szrj   {
160*a9fa9459Szrj     { F_RELFLG,    "no-rel" },
161*a9fa9459Szrj     { F_EXEC,      "exec" },
162*a9fa9459Szrj     { F_LNNO,      "lineno" },
163*a9fa9459Szrj     { F_LSYMS,     "lsyms" },
164*a9fa9459Szrj 
165*a9fa9459Szrj     { F_FDPR_PROF, "fdpr-prof" },
166*a9fa9459Szrj     { F_FDPR_OPTI, "fdpr-opti" },
167*a9fa9459Szrj     { F_DSA,       "dsa" },
168*a9fa9459Szrj 
169*a9fa9459Szrj     { F_VARPG,     "varprg" },
170*a9fa9459Szrj 
171*a9fa9459Szrj     { F_DYNLOAD,   "dynload" },
172*a9fa9459Szrj     { F_SHROBJ,    "shrobj" },
173*a9fa9459Szrj     { F_NONEXEC,   "nonexec" },
174*a9fa9459Szrj 
175*a9fa9459Szrj     { 0, NULL }
176*a9fa9459Szrj   };
177*a9fa9459Szrj 
178*a9fa9459Szrj /* Names of s_flags.  */
179*a9fa9459Szrj static const struct xlat_table s_flag_xlat[] =
180*a9fa9459Szrj   {
181*a9fa9459Szrj     { STYP_PAD,    "pad" },
182*a9fa9459Szrj     { STYP_DWARF,  "dwarf" },
183*a9fa9459Szrj     { STYP_TEXT,   "text" },
184*a9fa9459Szrj     { STYP_DATA,   "data" },
185*a9fa9459Szrj     { STYP_BSS,    "bss" },
186*a9fa9459Szrj 
187*a9fa9459Szrj     { STYP_EXCEPT, "except" },
188*a9fa9459Szrj     { STYP_INFO,   "info" },
189*a9fa9459Szrj     { STYP_TDATA,  "tdata" },
190*a9fa9459Szrj     { STYP_TBSS,   "tbss" },
191*a9fa9459Szrj 
192*a9fa9459Szrj     { STYP_LOADER, "loader" },
193*a9fa9459Szrj     { STYP_DEBUG,  "debug" },
194*a9fa9459Szrj     { STYP_TYPCHK, "typchk" },
195*a9fa9459Szrj     { STYP_OVRFLO, "ovrflo" },
196*a9fa9459Szrj     { 0, NULL }
197*a9fa9459Szrj   };
198*a9fa9459Szrj 
199*a9fa9459Szrj /* Names of storage class.  */
200*a9fa9459Szrj static const struct xlat_table sc_xlat[] =
201*a9fa9459Szrj   {
202*a9fa9459Szrj #define SC_ENTRY(X) { C_##X, #X }
203*a9fa9459Szrj     SC_ENTRY(NULL),
204*a9fa9459Szrj     SC_ENTRY(AUTO),
205*a9fa9459Szrj     SC_ENTRY(EXT),
206*a9fa9459Szrj     SC_ENTRY(STAT),
207*a9fa9459Szrj     SC_ENTRY(REG),
208*a9fa9459Szrj     SC_ENTRY(EXTDEF),
209*a9fa9459Szrj     SC_ENTRY(LABEL),
210*a9fa9459Szrj     SC_ENTRY(ULABEL),
211*a9fa9459Szrj     SC_ENTRY(MOS),
212*a9fa9459Szrj     SC_ENTRY(ARG),
213*a9fa9459Szrj     /*    SC_ENTRY(STRARG), */
214*a9fa9459Szrj     SC_ENTRY(MOU),
215*a9fa9459Szrj     SC_ENTRY(UNTAG),
216*a9fa9459Szrj     SC_ENTRY(TPDEF),
217*a9fa9459Szrj     SC_ENTRY(USTATIC),
218*a9fa9459Szrj     SC_ENTRY(ENTAG),
219*a9fa9459Szrj     SC_ENTRY(MOE),
220*a9fa9459Szrj     SC_ENTRY(REGPARM),
221*a9fa9459Szrj     SC_ENTRY(FIELD),
222*a9fa9459Szrj     SC_ENTRY(BLOCK),
223*a9fa9459Szrj     SC_ENTRY(FCN),
224*a9fa9459Szrj     SC_ENTRY(EOS),
225*a9fa9459Szrj     SC_ENTRY(FILE),
226*a9fa9459Szrj     SC_ENTRY(LINE),
227*a9fa9459Szrj     SC_ENTRY(ALIAS),
228*a9fa9459Szrj     SC_ENTRY(HIDDEN),
229*a9fa9459Szrj     SC_ENTRY(HIDEXT),
230*a9fa9459Szrj     SC_ENTRY(BINCL),
231*a9fa9459Szrj     SC_ENTRY(EINCL),
232*a9fa9459Szrj     SC_ENTRY(INFO),
233*a9fa9459Szrj     SC_ENTRY(WEAKEXT),
234*a9fa9459Szrj     SC_ENTRY(DWARF),
235*a9fa9459Szrj 
236*a9fa9459Szrj     /* Stabs.  */
237*a9fa9459Szrj     SC_ENTRY (GSYM),
238*a9fa9459Szrj     SC_ENTRY (LSYM),
239*a9fa9459Szrj     SC_ENTRY (PSYM),
240*a9fa9459Szrj     SC_ENTRY (RSYM),
241*a9fa9459Szrj     SC_ENTRY (RPSYM),
242*a9fa9459Szrj     SC_ENTRY (STSYM),
243*a9fa9459Szrj     SC_ENTRY (TCSYM),
244*a9fa9459Szrj     SC_ENTRY (BCOMM),
245*a9fa9459Szrj     SC_ENTRY (ECOML),
246*a9fa9459Szrj     SC_ENTRY (ECOMM),
247*a9fa9459Szrj     SC_ENTRY (DECL),
248*a9fa9459Szrj     SC_ENTRY (ENTRY),
249*a9fa9459Szrj     SC_ENTRY (FUN),
250*a9fa9459Szrj     SC_ENTRY (BSTAT),
251*a9fa9459Szrj     SC_ENTRY (ESTAT),
252*a9fa9459Szrj 
253*a9fa9459Szrj     { 0, NULL }
254*a9fa9459Szrj #undef SC_ENTRY
255*a9fa9459Szrj   };
256*a9fa9459Szrj 
257*a9fa9459Szrj /* Names for symbol type.  */
258*a9fa9459Szrj static const struct xlat_table smtyp_xlat[] =
259*a9fa9459Szrj   {
260*a9fa9459Szrj     { XTY_ER, "ER" },
261*a9fa9459Szrj     { XTY_SD, "SD" },
262*a9fa9459Szrj     { XTY_LD, "LD" },
263*a9fa9459Szrj     { XTY_CM, "CM" },
264*a9fa9459Szrj     { XTY_EM, "EM" },
265*a9fa9459Szrj     { XTY_US, "US" },
266*a9fa9459Szrj     { 0, NULL }
267*a9fa9459Szrj   };
268*a9fa9459Szrj 
269*a9fa9459Szrj /* Names for storage-mapping class.  */
270*a9fa9459Szrj static const struct xlat_table smclas_xlat[] =
271*a9fa9459Szrj   {
272*a9fa9459Szrj #define SMCLAS_ENTRY(X) { XMC_##X, #X }
273*a9fa9459Szrj     SMCLAS_ENTRY (PR),
274*a9fa9459Szrj     SMCLAS_ENTRY (RO),
275*a9fa9459Szrj     SMCLAS_ENTRY (DB),
276*a9fa9459Szrj     SMCLAS_ENTRY (TC),
277*a9fa9459Szrj     SMCLAS_ENTRY (UA),
278*a9fa9459Szrj     SMCLAS_ENTRY (RW),
279*a9fa9459Szrj     SMCLAS_ENTRY (GL),
280*a9fa9459Szrj     SMCLAS_ENTRY (XO),
281*a9fa9459Szrj     SMCLAS_ENTRY (SV),
282*a9fa9459Szrj     SMCLAS_ENTRY (BS),
283*a9fa9459Szrj     SMCLAS_ENTRY (DS),
284*a9fa9459Szrj     SMCLAS_ENTRY (UC),
285*a9fa9459Szrj     SMCLAS_ENTRY (TI),
286*a9fa9459Szrj     SMCLAS_ENTRY (TB),
287*a9fa9459Szrj     SMCLAS_ENTRY (TC0),
288*a9fa9459Szrj     SMCLAS_ENTRY (TD),
289*a9fa9459Szrj     SMCLAS_ENTRY (SV64),
290*a9fa9459Szrj     SMCLAS_ENTRY (SV3264),
291*a9fa9459Szrj     { 0, NULL }
292*a9fa9459Szrj #undef SMCLAS_ENTRY
293*a9fa9459Szrj   };
294*a9fa9459Szrj 
295*a9fa9459Szrj /* Names for relocation type.  */
296*a9fa9459Szrj static const struct xlat_table rtype_xlat[] =
297*a9fa9459Szrj   {
298*a9fa9459Szrj #define RTYPE_ENTRY(X) { R_##X, #X }
299*a9fa9459Szrj     RTYPE_ENTRY (POS),
300*a9fa9459Szrj     RTYPE_ENTRY (NEG),
301*a9fa9459Szrj     RTYPE_ENTRY (REL),
302*a9fa9459Szrj     RTYPE_ENTRY (TOC),
303*a9fa9459Szrj     RTYPE_ENTRY (RTB),
304*a9fa9459Szrj     RTYPE_ENTRY (GL),
305*a9fa9459Szrj     RTYPE_ENTRY (TCL),
306*a9fa9459Szrj     RTYPE_ENTRY (BA),
307*a9fa9459Szrj     RTYPE_ENTRY (BR),
308*a9fa9459Szrj     RTYPE_ENTRY (RL),
309*a9fa9459Szrj     RTYPE_ENTRY (RLA),
310*a9fa9459Szrj     RTYPE_ENTRY (REF),
311*a9fa9459Szrj     RTYPE_ENTRY (TRL),
312*a9fa9459Szrj     RTYPE_ENTRY (TRLA),
313*a9fa9459Szrj     RTYPE_ENTRY (RRTBI),
314*a9fa9459Szrj     RTYPE_ENTRY (RRTBA),
315*a9fa9459Szrj     RTYPE_ENTRY (CAI),
316*a9fa9459Szrj     RTYPE_ENTRY (CREL),
317*a9fa9459Szrj     RTYPE_ENTRY (RBA),
318*a9fa9459Szrj     RTYPE_ENTRY (RBAC),
319*a9fa9459Szrj     RTYPE_ENTRY (RBR),
320*a9fa9459Szrj     RTYPE_ENTRY (RBRC),
321*a9fa9459Szrj     RTYPE_ENTRY (TLS),
322*a9fa9459Szrj     RTYPE_ENTRY (TLS_IE),
323*a9fa9459Szrj     RTYPE_ENTRY (TLS_LD),
324*a9fa9459Szrj     RTYPE_ENTRY (TLS_LE),
325*a9fa9459Szrj     RTYPE_ENTRY (TLSM),
326*a9fa9459Szrj     RTYPE_ENTRY (TLSML),
327*a9fa9459Szrj     RTYPE_ENTRY (TOCU),
328*a9fa9459Szrj     RTYPE_ENTRY (TOCL),
329*a9fa9459Szrj     { 0, NULL }
330*a9fa9459Szrj   };
331*a9fa9459Szrj 
332*a9fa9459Szrj /* Simplified section header.  */
333*a9fa9459Szrj struct xcoff32_section
334*a9fa9459Szrj {
335*a9fa9459Szrj   /* NUL terminated name.  */
336*a9fa9459Szrj   char name[9];
337*a9fa9459Szrj 
338*a9fa9459Szrj   /* Section flags.  */
339*a9fa9459Szrj   unsigned int flags;
340*a9fa9459Szrj 
341*a9fa9459Szrj   /* Offsets in file.  */
342*a9fa9459Szrj   ufile_ptr scnptr;
343*a9fa9459Szrj   ufile_ptr relptr;
344*a9fa9459Szrj   ufile_ptr lnnoptr;
345*a9fa9459Szrj 
346*a9fa9459Szrj   /* Number of relocs and line numbers.  */
347*a9fa9459Szrj   unsigned int nreloc;
348*a9fa9459Szrj   unsigned int nlnno;
349*a9fa9459Szrj };
350*a9fa9459Szrj 
351*a9fa9459Szrj /* Simplified symbol.  */
352*a9fa9459Szrj 
353*a9fa9459Szrj union xcoff32_symbol
354*a9fa9459Szrj {
355*a9fa9459Szrj   union external_auxent aux;
356*a9fa9459Szrj 
357*a9fa9459Szrj   struct sym
358*a9fa9459Szrj   {
359*a9fa9459Szrj     /* Pointer to the NUL-terminated name.  */
360*a9fa9459Szrj     char *name;
361*a9fa9459Szrj 
362*a9fa9459Szrj     /* XCOFF symbol fields.  */
363*a9fa9459Szrj     unsigned int val;
364*a9fa9459Szrj     unsigned short scnum;
365*a9fa9459Szrj     unsigned short ntype;
366*a9fa9459Szrj     unsigned char sclass;
367*a9fa9459Szrj     unsigned char numaux;
368*a9fa9459Szrj 
369*a9fa9459Szrj     /* Buffer in case the name is local.  */
370*a9fa9459Szrj     union
371*a9fa9459Szrj     {
372*a9fa9459Szrj       char name[9];
373*a9fa9459Szrj       unsigned int off;
374*a9fa9459Szrj     } raw;
375*a9fa9459Szrj   } sym;
376*a9fa9459Szrj };
377*a9fa9459Szrj 
378*a9fa9459Szrj /* Important fields to dump the file.  */
379*a9fa9459Szrj 
380*a9fa9459Szrj struct xcoff_dump
381*a9fa9459Szrj {
382*a9fa9459Szrj   /* From file header.  */
383*a9fa9459Szrj   unsigned short nscns;
384*a9fa9459Szrj   unsigned int symptr;
385*a9fa9459Szrj   unsigned int nsyms;
386*a9fa9459Szrj   unsigned short opthdr;
387*a9fa9459Szrj 
388*a9fa9459Szrj   /* Sections.  */
389*a9fa9459Szrj   struct xcoff32_section *sects;
390*a9fa9459Szrj 
391*a9fa9459Szrj   /* Symbols.  */
392*a9fa9459Szrj   union xcoff32_symbol *syms;
393*a9fa9459Szrj   char *strings;
394*a9fa9459Szrj   unsigned int strings_size;
395*a9fa9459Szrj };
396*a9fa9459Szrj 
397*a9fa9459Szrj /* Print a symbol (if possible).  */
398*a9fa9459Szrj 
399*a9fa9459Szrj static void
xcoff32_print_symbol(struct xcoff_dump * data,unsigned int symndx)400*a9fa9459Szrj xcoff32_print_symbol (struct xcoff_dump *data, unsigned int symndx)
401*a9fa9459Szrj {
402*a9fa9459Szrj   if (data->syms != NULL
403*a9fa9459Szrj       && symndx < data->nsyms
404*a9fa9459Szrj       && data->syms[symndx].sym.name != NULL)
405*a9fa9459Szrj     printf ("%s", data->syms[symndx].sym.name);
406*a9fa9459Szrj   else
407*a9fa9459Szrj     printf ("%u", symndx);
408*a9fa9459Szrj }
409*a9fa9459Szrj 
410*a9fa9459Szrj /* Dump the file header.  */
411*a9fa9459Szrj 
412*a9fa9459Szrj static void
dump_xcoff32_file_header(bfd * abfd,struct external_filehdr * fhdr,struct xcoff_dump * data)413*a9fa9459Szrj dump_xcoff32_file_header (bfd *abfd, struct external_filehdr *fhdr,
414*a9fa9459Szrj                           struct xcoff_dump *data)
415*a9fa9459Szrj {
416*a9fa9459Szrj   unsigned int timdat = bfd_h_get_32 (abfd, fhdr->f_timdat);
417*a9fa9459Szrj   unsigned short flags = bfd_h_get_16 (abfd, fhdr->f_flags);
418*a9fa9459Szrj 
419*a9fa9459Szrj   printf (_("  nbr sections:  %d\n"), data->nscns);
420*a9fa9459Szrj   printf (_("  time and date: 0x%08x  - "), timdat);
421*a9fa9459Szrj   if (timdat == 0)
422*a9fa9459Szrj     printf (_("not set\n"));
423*a9fa9459Szrj   else
424*a9fa9459Szrj     {
425*a9fa9459Szrj       /* Not correct on all platforms, but works on unix.  */
426*a9fa9459Szrj       time_t t = timdat;
427*a9fa9459Szrj       fputs (ctime (&t), stdout);
428*a9fa9459Szrj     }
429*a9fa9459Szrj   printf (_("  symbols off:   0x%08x\n"), data->symptr);
430*a9fa9459Szrj   printf (_("  nbr symbols:   %d\n"), data->nsyms);
431*a9fa9459Szrj   printf (_("  opt hdr sz:    %d\n"), data->opthdr);
432*a9fa9459Szrj   printf (_("  flags:         0x%04x "), flags);
433*a9fa9459Szrj   dump_flags (f_flag_xlat, flags);
434*a9fa9459Szrj   putchar ('\n');
435*a9fa9459Szrj }
436*a9fa9459Szrj 
437*a9fa9459Szrj /* Dump the a.out header.  */
438*a9fa9459Szrj 
439*a9fa9459Szrj static void
dump_xcoff32_aout_header(bfd * abfd,struct xcoff_dump * data)440*a9fa9459Szrj dump_xcoff32_aout_header (bfd *abfd, struct xcoff_dump *data)
441*a9fa9459Szrj {
442*a9fa9459Szrj   AOUTHDR auxhdr;
443*a9fa9459Szrj   unsigned short magic;
444*a9fa9459Szrj   unsigned int sz = data->opthdr;
445*a9fa9459Szrj 
446*a9fa9459Szrj   printf (_("Auxiliary header:\n"));
447*a9fa9459Szrj   if (data->opthdr == 0)
448*a9fa9459Szrj     {
449*a9fa9459Szrj       printf (_("  No aux header\n"));
450*a9fa9459Szrj       return;
451*a9fa9459Szrj     }
452*a9fa9459Szrj   if (data->opthdr > sizeof (auxhdr))
453*a9fa9459Szrj     {
454*a9fa9459Szrj       printf (_("warning: optional header size too large (> %d)\n"),
455*a9fa9459Szrj               (int)sizeof (auxhdr));
456*a9fa9459Szrj       sz = sizeof (auxhdr);
457*a9fa9459Szrj     }
458*a9fa9459Szrj   if (bfd_bread (&auxhdr, sz, abfd) != sz)
459*a9fa9459Szrj     {
460*a9fa9459Szrj       non_fatal (_("cannot read auxhdr"));
461*a9fa9459Szrj       return;
462*a9fa9459Szrj     }
463*a9fa9459Szrj 
464*a9fa9459Szrj   magic = bfd_h_get_16 (abfd, auxhdr.magic);
465*a9fa9459Szrj   /* We don't translate these strings as they are fields name.  */
466*a9fa9459Szrj   printf ("  o_mflag (magic): 0x%04x 0%04o\n", magic, magic);
467*a9fa9459Szrj   printf ("  o_vstamp:        0x%04x\n",
468*a9fa9459Szrj           (unsigned short)bfd_h_get_16 (abfd, auxhdr.vstamp));
469*a9fa9459Szrj   printf ("  o_tsize:         0x%08x\n",
470*a9fa9459Szrj           (unsigned int)bfd_h_get_32 (abfd, auxhdr.tsize));
471*a9fa9459Szrj   printf ("  o_dsize:         0x%08x\n",
472*a9fa9459Szrj           (unsigned int)bfd_h_get_32 (abfd, auxhdr.dsize));
473*a9fa9459Szrj   printf ("  o_entry:         0x%08x\n",
474*a9fa9459Szrj           (unsigned int)bfd_h_get_32 (abfd, auxhdr.entry));
475*a9fa9459Szrj   printf ("  o_text_start:    0x%08x\n",
476*a9fa9459Szrj           (unsigned int)bfd_h_get_32 (abfd, auxhdr.text_start));
477*a9fa9459Szrj   printf ("  o_data_start:    0x%08x\n",
478*a9fa9459Szrj           (unsigned int)bfd_h_get_32 (abfd, auxhdr.data_start));
479*a9fa9459Szrj   if (sz == offsetof (AOUTHDR, o_toc))
480*a9fa9459Szrj     return;
481*a9fa9459Szrj   printf ("  o_toc:           0x%08x\n",
482*a9fa9459Szrj           (unsigned int)bfd_h_get_32 (abfd, auxhdr.o_toc));
483*a9fa9459Szrj   printf ("  o_snentry:       0x%04x\n",
484*a9fa9459Szrj           (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_snentry));
485*a9fa9459Szrj   printf ("  o_sntext:        0x%04x\n",
486*a9fa9459Szrj           (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_sntext));
487*a9fa9459Szrj   printf ("  o_sndata:        0x%04x\n",
488*a9fa9459Szrj           (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_sndata));
489*a9fa9459Szrj   printf ("  o_sntoc:         0x%04x\n",
490*a9fa9459Szrj           (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_sntoc));
491*a9fa9459Szrj   printf ("  o_snloader:      0x%04x\n",
492*a9fa9459Szrj           (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_snloader));
493*a9fa9459Szrj   printf ("  o_snbss:         0x%04x\n",
494*a9fa9459Szrj           (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_snbss));
495*a9fa9459Szrj   printf ("  o_algntext:      %u\n",
496*a9fa9459Szrj           (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_algntext));
497*a9fa9459Szrj   printf ("  o_algndata:      %u\n",
498*a9fa9459Szrj           (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_algndata));
499*a9fa9459Szrj   printf ("  o_modtype:       0x%04x",
500*a9fa9459Szrj           (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_modtype));
501*a9fa9459Szrj   if (ISPRINT (auxhdr.o_modtype[0]) && ISPRINT (auxhdr.o_modtype[1]))
502*a9fa9459Szrj     printf (" (%c%c)", auxhdr.o_modtype[0], auxhdr.o_modtype[1]);
503*a9fa9459Szrj   putchar ('\n');
504*a9fa9459Szrj   printf ("  o_cputype:       0x%04x\n",
505*a9fa9459Szrj           (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_cputype));
506*a9fa9459Szrj   printf ("  o_maxstack:      0x%08x\n",
507*a9fa9459Szrj           (unsigned int)bfd_h_get_32 (abfd, auxhdr.o_maxstack));
508*a9fa9459Szrj   printf ("  o_maxdata:       0x%08x\n",
509*a9fa9459Szrj           (unsigned int)bfd_h_get_32 (abfd, auxhdr.o_maxdata));
510*a9fa9459Szrj #if 0
511*a9fa9459Szrj   printf ("  o_debugger:      0x%08x\n",
512*a9fa9459Szrj           (unsigned int)bfd_h_get_32 (abfd, auxhdr.o_debugger));
513*a9fa9459Szrj #endif
514*a9fa9459Szrj }
515*a9fa9459Szrj 
516*a9fa9459Szrj /* Dump the sections header.  */
517*a9fa9459Szrj 
518*a9fa9459Szrj static void
dump_xcoff32_sections_header(bfd * abfd,struct xcoff_dump * data)519*a9fa9459Szrj dump_xcoff32_sections_header (bfd *abfd, struct xcoff_dump *data)
520*a9fa9459Szrj {
521*a9fa9459Szrj   unsigned int i;
522*a9fa9459Szrj   unsigned int off;
523*a9fa9459Szrj 
524*a9fa9459Szrj   off = sizeof (struct external_filehdr) + data->opthdr;
525*a9fa9459Szrj   printf (_("Section headers (at %u+%u=0x%08x to 0x%08x):\n"),
526*a9fa9459Szrj           (unsigned int)sizeof (struct external_filehdr), data->opthdr, off,
527*a9fa9459Szrj           off + (unsigned int)sizeof (struct external_scnhdr) * data->nscns);
528*a9fa9459Szrj   if (data->nscns == 0)
529*a9fa9459Szrj     {
530*a9fa9459Szrj       printf (_("  No section header\n"));
531*a9fa9459Szrj       return;
532*a9fa9459Szrj     }
533*a9fa9459Szrj   if (bfd_seek (abfd, off, SEEK_SET) != 0)
534*a9fa9459Szrj     {
535*a9fa9459Szrj       non_fatal (_("cannot read section header"));
536*a9fa9459Szrj       return;
537*a9fa9459Szrj     }
538*a9fa9459Szrj   /* We don't translate this string as it consists in fields name.  */
539*a9fa9459Szrj   printf (" # Name     paddr    vaddr    size     scnptr   relptr   lnnoptr  nrel  nlnno\n");
540*a9fa9459Szrj   for (i = 0; i < data->nscns; i++)
541*a9fa9459Szrj     {
542*a9fa9459Szrj       struct external_scnhdr scn;
543*a9fa9459Szrj       unsigned int flags;
544*a9fa9459Szrj 
545*a9fa9459Szrj       if (bfd_bread (&scn, sizeof (scn), abfd) != sizeof (scn))
546*a9fa9459Szrj         {
547*a9fa9459Szrj           non_fatal (_("cannot read section header"));
548*a9fa9459Szrj           return;
549*a9fa9459Szrj         }
550*a9fa9459Szrj       flags = bfd_h_get_32 (abfd, scn.s_flags);
551*a9fa9459Szrj       printf ("%2d %-8.8s %08x %08x %08x %08x %08x %08x %-5d %-5d\n",
552*a9fa9459Szrj               i + 1, scn.s_name,
553*a9fa9459Szrj               (unsigned int)bfd_h_get_32 (abfd, scn.s_paddr),
554*a9fa9459Szrj               (unsigned int)bfd_h_get_32 (abfd, scn.s_vaddr),
555*a9fa9459Szrj               (unsigned int)bfd_h_get_32 (abfd, scn.s_size),
556*a9fa9459Szrj               (unsigned int)bfd_h_get_32 (abfd, scn.s_scnptr),
557*a9fa9459Szrj               (unsigned int)bfd_h_get_32 (abfd, scn.s_relptr),
558*a9fa9459Szrj               (unsigned int)bfd_h_get_32 (abfd, scn.s_lnnoptr),
559*a9fa9459Szrj               (unsigned int)bfd_h_get_16 (abfd, scn.s_nreloc),
560*a9fa9459Szrj               (unsigned int)bfd_h_get_16 (abfd, scn.s_nlnno));
561*a9fa9459Szrj       printf (_("            Flags: %08x "), flags);
562*a9fa9459Szrj 
563*a9fa9459Szrj       if (~flags == 0)
564*a9fa9459Szrj         {
565*a9fa9459Szrj           /* Stripped executable ?  */
566*a9fa9459Szrj           putchar ('\n');
567*a9fa9459Szrj         }
568*a9fa9459Szrj       else if (flags & STYP_OVRFLO)
569*a9fa9459Szrj         printf (_("overflow - nreloc: %u, nlnno: %u\n"),
570*a9fa9459Szrj                 (unsigned int)bfd_h_get_32 (abfd, scn.s_paddr),
571*a9fa9459Szrj                 (unsigned int)bfd_h_get_32 (abfd, scn.s_vaddr));
572*a9fa9459Szrj       else
573*a9fa9459Szrj         {
574*a9fa9459Szrj           dump_flags (s_flag_xlat, flags);
575*a9fa9459Szrj           putchar ('\n');
576*a9fa9459Szrj         }
577*a9fa9459Szrj     }
578*a9fa9459Szrj }
579*a9fa9459Szrj 
580*a9fa9459Szrj /* Read section table.  */
581*a9fa9459Szrj 
582*a9fa9459Szrj static void
xcoff32_read_sections(bfd * abfd,struct xcoff_dump * data)583*a9fa9459Szrj xcoff32_read_sections (bfd *abfd, struct xcoff_dump *data)
584*a9fa9459Szrj {
585*a9fa9459Szrj   int i;
586*a9fa9459Szrj 
587*a9fa9459Szrj   if (bfd_seek (abfd, sizeof (struct external_filehdr) + data->opthdr,
588*a9fa9459Szrj                 SEEK_SET) != 0)
589*a9fa9459Szrj     {
590*a9fa9459Szrj       non_fatal (_("cannot read section headers"));
591*a9fa9459Szrj       return;
592*a9fa9459Szrj     }
593*a9fa9459Szrj 
594*a9fa9459Szrj   data->sects = xmalloc (data->nscns * sizeof (struct xcoff32_section));
595*a9fa9459Szrj   for (i = 0; i < data->nscns; i++)
596*a9fa9459Szrj     {
597*a9fa9459Szrj       struct external_scnhdr scn;
598*a9fa9459Szrj       struct xcoff32_section *s = &data->sects[i];
599*a9fa9459Szrj 
600*a9fa9459Szrj       if (bfd_bread (&scn, sizeof (scn), abfd) != sizeof (scn))
601*a9fa9459Szrj         {
602*a9fa9459Szrj           non_fatal (_("cannot read section header"));
603*a9fa9459Szrj           free (data->sects);
604*a9fa9459Szrj           data->sects = NULL;
605*a9fa9459Szrj           return;
606*a9fa9459Szrj         }
607*a9fa9459Szrj       memcpy (s->name, scn.s_name, 8);
608*a9fa9459Szrj       s->name[8] = 0;
609*a9fa9459Szrj       s->flags = bfd_h_get_32 (abfd, scn.s_flags);
610*a9fa9459Szrj 
611*a9fa9459Szrj       s->scnptr = bfd_h_get_32 (abfd, scn.s_scnptr);
612*a9fa9459Szrj       s->relptr = bfd_h_get_32 (abfd, scn.s_relptr);
613*a9fa9459Szrj       s->lnnoptr = bfd_h_get_32 (abfd, scn.s_lnnoptr);
614*a9fa9459Szrj 
615*a9fa9459Szrj       s->nreloc = bfd_h_get_16 (abfd, scn.s_nreloc);
616*a9fa9459Szrj       s->nlnno = bfd_h_get_16 (abfd, scn.s_nlnno);
617*a9fa9459Szrj 
618*a9fa9459Szrj       if (s->flags == STYP_OVRFLO)
619*a9fa9459Szrj         {
620*a9fa9459Szrj           if (s->nreloc > 0 && s->nreloc <= data->nscns)
621*a9fa9459Szrj             data->sects[s->nreloc - 1].nreloc =
622*a9fa9459Szrj               bfd_h_get_32 (abfd, scn.s_paddr);
623*a9fa9459Szrj           if (s->nlnno > 0 && s->nlnno <= data->nscns)
624*a9fa9459Szrj             data->sects[s->nlnno - 1].nlnno =
625*a9fa9459Szrj               bfd_h_get_32 (abfd, scn.s_vaddr);
626*a9fa9459Szrj         }
627*a9fa9459Szrj     }
628*a9fa9459Szrj }
629*a9fa9459Szrj 
630*a9fa9459Szrj /* Read symbols.  */
631*a9fa9459Szrj 
632*a9fa9459Szrj static void
xcoff32_read_symbols(bfd * abfd,struct xcoff_dump * data)633*a9fa9459Szrj xcoff32_read_symbols (bfd *abfd, struct xcoff_dump *data)
634*a9fa9459Szrj {
635*a9fa9459Szrj   unsigned int i;
636*a9fa9459Szrj   char stsz_arr[4];
637*a9fa9459Szrj   unsigned int stptr;
638*a9fa9459Szrj 
639*a9fa9459Szrj   if (data->nsyms == 0)
640*a9fa9459Szrj     return;
641*a9fa9459Szrj 
642*a9fa9459Szrj   stptr = data->symptr
643*a9fa9459Szrj     + data->nsyms * (unsigned)sizeof (struct external_syment);
644*a9fa9459Szrj 
645*a9fa9459Szrj   /* Read string table.  */
646*a9fa9459Szrj   if (bfd_seek (abfd, stptr, SEEK_SET) != 0
647*a9fa9459Szrj       || bfd_bread (&stsz_arr, sizeof (stsz_arr), abfd) != sizeof (stsz_arr))
648*a9fa9459Szrj     {
649*a9fa9459Szrj       non_fatal (_("cannot read strings table length"));
650*a9fa9459Szrj       data->strings_size = 0;
651*a9fa9459Szrj     }
652*a9fa9459Szrj   else
653*a9fa9459Szrj     {
654*a9fa9459Szrj       data->strings_size = bfd_h_get_32 (abfd, stsz_arr);
655*a9fa9459Szrj       if (data->strings_size > sizeof (stsz_arr))
656*a9fa9459Szrj         {
657*a9fa9459Szrj           unsigned int remsz = data->strings_size - sizeof (stsz_arr);
658*a9fa9459Szrj 
659*a9fa9459Szrj           data->strings = xmalloc (data->strings_size);
660*a9fa9459Szrj 
661*a9fa9459Szrj           memcpy (data->strings, stsz_arr, sizeof (stsz_arr));
662*a9fa9459Szrj           if (bfd_bread (data->strings + sizeof (stsz_arr), remsz, abfd)
663*a9fa9459Szrj               != remsz)
664*a9fa9459Szrj             {
665*a9fa9459Szrj               non_fatal (_("cannot read strings table"));
666*a9fa9459Szrj               goto clean;
667*a9fa9459Szrj             }
668*a9fa9459Szrj         }
669*a9fa9459Szrj     }
670*a9fa9459Szrj 
671*a9fa9459Szrj   if (bfd_seek (abfd, data->symptr, SEEK_SET) != 0)
672*a9fa9459Szrj     {
673*a9fa9459Szrj       non_fatal (_("cannot read symbol table"));
674*a9fa9459Szrj       goto clean;
675*a9fa9459Szrj     }
676*a9fa9459Szrj 
677*a9fa9459Szrj   data->syms = (union xcoff32_symbol *)
678*a9fa9459Szrj     xmalloc (data->nsyms * sizeof (union xcoff32_symbol));
679*a9fa9459Szrj 
680*a9fa9459Szrj   for (i = 0; i < data->nsyms; i++)
681*a9fa9459Szrj     {
682*a9fa9459Szrj       struct external_syment sym;
683*a9fa9459Szrj       int j;
684*a9fa9459Szrj       union xcoff32_symbol *s = &data->syms[i];
685*a9fa9459Szrj 
686*a9fa9459Szrj       if (bfd_bread (&sym, sizeof (sym), abfd) != sizeof (sym))
687*a9fa9459Szrj         {
688*a9fa9459Szrj           non_fatal (_("cannot read symbol entry"));
689*a9fa9459Szrj           goto clean;
690*a9fa9459Szrj         }
691*a9fa9459Szrj 
692*a9fa9459Szrj       s->sym.val = bfd_h_get_32 (abfd, sym.e_value);
693*a9fa9459Szrj       s->sym.scnum = bfd_h_get_16 (abfd, sym.e_scnum);
694*a9fa9459Szrj       s->sym.ntype = bfd_h_get_16 (abfd, sym.e_type);
695*a9fa9459Szrj       s->sym.sclass = bfd_h_get_8 (abfd, sym.e_sclass);
696*a9fa9459Szrj       s->sym.numaux = bfd_h_get_8 (abfd, sym.e_numaux);
697*a9fa9459Szrj 
698*a9fa9459Szrj       if (sym.e.e_name[0])
699*a9fa9459Szrj         {
700*a9fa9459Szrj           memcpy (s->sym.raw.name, sym.e.e_name, sizeof (sym.e.e_name));
701*a9fa9459Szrj           s->sym.raw.name[8] = 0;
702*a9fa9459Szrj           s->sym.name = s->sym.raw.name;
703*a9fa9459Szrj         }
704*a9fa9459Szrj       else
705*a9fa9459Szrj         {
706*a9fa9459Szrj           unsigned int soff = bfd_h_get_32 (abfd, sym.e.e.e_offset);
707*a9fa9459Szrj 
708*a9fa9459Szrj           if ((s->sym.sclass & DBXMASK) == 0 && soff < data->strings_size)
709*a9fa9459Szrj             s->sym.name = data->strings + soff;
710*a9fa9459Szrj           else
711*a9fa9459Szrj             {
712*a9fa9459Szrj               s->sym.name = NULL;
713*a9fa9459Szrj               s->sym.raw.off = soff;
714*a9fa9459Szrj             }
715*a9fa9459Szrj         }
716*a9fa9459Szrj 
717*a9fa9459Szrj       for (j = 0; j < s->sym.numaux; j++, i++)
718*a9fa9459Szrj         {
719*a9fa9459Szrj            if (bfd_bread (&s[j + 1].aux,
720*a9fa9459Szrj                           sizeof (union external_auxent), abfd)
721*a9fa9459Szrj                != sizeof (union external_auxent))
722*a9fa9459Szrj             {
723*a9fa9459Szrj               non_fatal (_("cannot read symbol aux entry"));
724*a9fa9459Szrj               goto clean;
725*a9fa9459Szrj             }
726*a9fa9459Szrj         }
727*a9fa9459Szrj     }
728*a9fa9459Szrj   return;
729*a9fa9459Szrj  clean:
730*a9fa9459Szrj   free (data->syms);
731*a9fa9459Szrj   data->syms = NULL;
732*a9fa9459Szrj   free (data->strings);
733*a9fa9459Szrj   data->strings = NULL;
734*a9fa9459Szrj }
735*a9fa9459Szrj 
736*a9fa9459Szrj /* Dump xcoff symbols.  */
737*a9fa9459Szrj 
738*a9fa9459Szrj static void
dump_xcoff32_symbols(bfd * abfd,struct xcoff_dump * data)739*a9fa9459Szrj dump_xcoff32_symbols (bfd *abfd, struct xcoff_dump *data)
740*a9fa9459Szrj {
741*a9fa9459Szrj   unsigned int i;
742*a9fa9459Szrj   asection *debugsec;
743*a9fa9459Szrj   char *debug = NULL;
744*a9fa9459Szrj 
745*a9fa9459Szrj   printf (_("Symbols table (strtable at 0x%08x)"),
746*a9fa9459Szrj           data->symptr
747*a9fa9459Szrj           + data->nsyms * (unsigned)sizeof (struct external_syment));
748*a9fa9459Szrj   if (data->nsyms == 0 || data->syms == NULL)
749*a9fa9459Szrj     {
750*a9fa9459Szrj       printf (_(":\n  No symbols\n"));
751*a9fa9459Szrj       return;
752*a9fa9459Szrj     }
753*a9fa9459Szrj 
754*a9fa9459Szrj   /* Read strings table.  */
755*a9fa9459Szrj   if (data->strings_size == 0)
756*a9fa9459Szrj     printf (_(" (no strings):\n"));
757*a9fa9459Szrj   else
758*a9fa9459Szrj     printf (_(" (strings size: %08x):\n"), data->strings_size);
759*a9fa9459Szrj 
760*a9fa9459Szrj   /* Read debug section.  */
761*a9fa9459Szrj   debugsec = bfd_get_section_by_name (abfd, ".debug");
762*a9fa9459Szrj   if (debugsec != NULL)
763*a9fa9459Szrj     {
764*a9fa9459Szrj       bfd_size_type size;
765*a9fa9459Szrj 
766*a9fa9459Szrj       size = bfd_get_section_size (debugsec);
767*a9fa9459Szrj       debug = (char *) xmalloc (size);
768*a9fa9459Szrj       bfd_get_section_contents (abfd, debugsec, debug, 0, size);
769*a9fa9459Szrj     }
770*a9fa9459Szrj 
771*a9fa9459Szrj   /* Translators: 'sc' is for storage class, 'off' for offset.  */
772*a9fa9459Szrj   printf (_("  # sc         value    section  type aux name/off\n"));
773*a9fa9459Szrj   for (i = 0; i < data->nsyms; i++)
774*a9fa9459Szrj     {
775*a9fa9459Szrj       union xcoff32_symbol *s = &data->syms[i];
776*a9fa9459Szrj       int j;
777*a9fa9459Szrj 
778*a9fa9459Szrj       printf ("%3u ", i);
779*a9fa9459Szrj       dump_value (sc_xlat, s->sym.sclass, 10);
780*a9fa9459Szrj       printf (" %08x ", s->sym.val);
781*a9fa9459Szrj       if (s->sym.scnum > 0 && s->sym.scnum <= data->nscns)
782*a9fa9459Szrj         {
783*a9fa9459Szrj           if (data->sects != NULL)
784*a9fa9459Szrj             printf ("%-8s", data->sects[s->sym.scnum - 1].name);
785*a9fa9459Szrj           else
786*a9fa9459Szrj             printf ("%-8u", s->sym.scnum);
787*a9fa9459Szrj         }
788*a9fa9459Szrj       else
789*a9fa9459Szrj         switch ((signed short)s->sym.scnum)
790*a9fa9459Szrj           {
791*a9fa9459Szrj           case N_DEBUG:
792*a9fa9459Szrj             printf ("N_DEBUG ");
793*a9fa9459Szrj             break;
794*a9fa9459Szrj           case N_ABS:
795*a9fa9459Szrj             printf ("N_ABS   ");
796*a9fa9459Szrj             break;
797*a9fa9459Szrj           case N_UNDEF:
798*a9fa9459Szrj             printf ("N_UNDEF ");
799*a9fa9459Szrj             break;
800*a9fa9459Szrj           default:
801*a9fa9459Szrj             printf ("(%04x)  ", s->sym.scnum);
802*a9fa9459Szrj           }
803*a9fa9459Szrj       printf (" %04x %3u ", s->sym.ntype, s->sym.numaux);
804*a9fa9459Szrj       if (s->sym.name != NULL)
805*a9fa9459Szrj         printf ("%s", s->sym.name);
806*a9fa9459Szrj       else
807*a9fa9459Szrj         {
808*a9fa9459Szrj           if ((s->sym.sclass & DBXMASK) != 0 && debug != NULL)
809*a9fa9459Szrj             printf ("%s", debug + s->sym.raw.off);
810*a9fa9459Szrj           else
811*a9fa9459Szrj             printf ("%08x", s->sym.raw.off);
812*a9fa9459Szrj         }
813*a9fa9459Szrj       putchar ('\n');
814*a9fa9459Szrj 
815*a9fa9459Szrj       for (j = 0; j < s->sym.numaux; j++, i++)
816*a9fa9459Szrj         {
817*a9fa9459Szrj           union external_auxent *aux = &s[j + 1].aux;
818*a9fa9459Szrj 
819*a9fa9459Szrj           printf (" %3u ", i + 1);
820*a9fa9459Szrj           switch (s->sym.sclass)
821*a9fa9459Szrj             {
822*a9fa9459Szrj             case C_STAT:
823*a9fa9459Szrj               /* Section length, number of relocs and line number.  */
824*a9fa9459Szrj               printf (_("  scnlen: %08x  nreloc: %-6u  nlinno: %-6u\n"),
825*a9fa9459Szrj                       (unsigned)bfd_h_get_32 (abfd, aux->x_scn.x_scnlen),
826*a9fa9459Szrj                       (unsigned)bfd_h_get_16 (abfd, aux->x_scn.x_nreloc),
827*a9fa9459Szrj                       (unsigned)bfd_h_get_16 (abfd, aux->x_scn.x_nlinno));
828*a9fa9459Szrj               break;
829*a9fa9459Szrj             case C_DWARF:
830*a9fa9459Szrj               /* Section length and number of relocs.  */
831*a9fa9459Szrj               printf (_("  scnlen: %08x  nreloc: %-6u\n"),
832*a9fa9459Szrj                       (unsigned)bfd_h_get_32 (abfd, aux->x_scn.x_scnlen),
833*a9fa9459Szrj                       (unsigned)bfd_h_get_16 (abfd, aux->x_scn.x_nreloc));
834*a9fa9459Szrj               break;
835*a9fa9459Szrj             case C_EXT:
836*a9fa9459Szrj             case C_WEAKEXT:
837*a9fa9459Szrj             case C_HIDEXT:
838*a9fa9459Szrj               if (j == 0 && s->sym.numaux > 1)
839*a9fa9459Szrj                 {
840*a9fa9459Szrj                   /* Function aux entry  (Do not translate).  */
841*a9fa9459Szrj                   printf ("  exptr: %08x fsize: %08x lnnoptr: %08x endndx: %u\n",
842*a9fa9459Szrj                           (unsigned)bfd_h_get_32 (abfd, aux->x_sym.x_tagndx),
843*a9fa9459Szrj                           (unsigned)bfd_h_get_32
844*a9fa9459Szrj                             (abfd, aux->x_sym.x_misc.x_fsize),
845*a9fa9459Szrj                           (unsigned)bfd_h_get_32
846*a9fa9459Szrj                             (abfd, aux->x_sym.x_fcnary.x_fcn.x_lnnoptr),
847*a9fa9459Szrj                           (unsigned)bfd_h_get_32
848*a9fa9459Szrj                             (abfd, aux->x_sym.x_fcnary.x_fcn.x_endndx));
849*a9fa9459Szrj                 }
850*a9fa9459Szrj               else if (j == 1 || (j == 0 && s->sym.numaux == 1))
851*a9fa9459Szrj                 {
852*a9fa9459Szrj                   /* csect aux entry.  */
853*a9fa9459Szrj                   unsigned char smtyp;
854*a9fa9459Szrj                   unsigned int scnlen;
855*a9fa9459Szrj 
856*a9fa9459Szrj                   smtyp = bfd_h_get_8 (abfd, aux->x_csect.x_smtyp);
857*a9fa9459Szrj                   scnlen = bfd_h_get_32 (abfd, aux->x_csect.x_scnlen);
858*a9fa9459Szrj 
859*a9fa9459Szrj                   if (smtyp == XTY_LD)
860*a9fa9459Szrj                     printf ("  scnsym: %-8u", scnlen);
861*a9fa9459Szrj                   else
862*a9fa9459Szrj                     printf ("  scnlen: %08x", scnlen);
863*a9fa9459Szrj                   printf (" h: parm=%08x sn=%04x al: 2**%u",
864*a9fa9459Szrj                           (unsigned)bfd_h_get_32 (abfd, aux->x_csect.x_parmhash),
865*a9fa9459Szrj                           (unsigned)bfd_h_get_16 (abfd, aux->x_csect.x_snhash),
866*a9fa9459Szrj                           SMTYP_ALIGN (smtyp));
867*a9fa9459Szrj                   printf (" typ: ");
868*a9fa9459Szrj                   dump_value (smtyp_xlat, SMTYP_SMTYP (smtyp), 2);
869*a9fa9459Szrj                   printf (" cl: ");
870*a9fa9459Szrj                   dump_value
871*a9fa9459Szrj                     (smclas_xlat,
872*a9fa9459Szrj                      (unsigned)bfd_h_get_8 (abfd, aux->x_csect.x_smclas), 6);
873*a9fa9459Szrj                   putchar ('\n');
874*a9fa9459Szrj                 }
875*a9fa9459Szrj               else
876*a9fa9459Szrj                 /* Do not translate - generic field name.  */
877*a9fa9459Szrj                 printf ("aux\n");
878*a9fa9459Szrj               break;
879*a9fa9459Szrj             case C_FILE:
880*a9fa9459Szrj               {
881*a9fa9459Szrj                 unsigned int off;
882*a9fa9459Szrj 
883*a9fa9459Szrj                 printf (" ftype: %02x ",
884*a9fa9459Szrj                         (unsigned)bfd_h_get_8 (abfd, aux->x_file.x_ftype));
885*a9fa9459Szrj                 if (aux->x_file.x_n.x_fname[0] != 0)
886*a9fa9459Szrj                   printf ("fname: %.14s", aux->x_file.x_n.x_fname);
887*a9fa9459Szrj                 else
888*a9fa9459Szrj                   {
889*a9fa9459Szrj                     off = (unsigned)bfd_h_get_32
890*a9fa9459Szrj                       (abfd, aux->x_file.x_n.x_n.x_offset);
891*a9fa9459Szrj                     if (data->strings != NULL && off < data->strings_size)
892*a9fa9459Szrj                       printf (" %s", data->strings + off);
893*a9fa9459Szrj                     else
894*a9fa9459Szrj                       printf (_("offset: %08x"), off);
895*a9fa9459Szrj                   }
896*a9fa9459Szrj                 putchar ('\n');
897*a9fa9459Szrj               }
898*a9fa9459Szrj               break;
899*a9fa9459Szrj             case C_BLOCK:
900*a9fa9459Szrj             case C_FCN:
901*a9fa9459Szrj               printf ("  lnno: %u\n",
902*a9fa9459Szrj                       (unsigned)bfd_h_get_16
903*a9fa9459Szrj                       (abfd, aux->x_sym.x_misc.x_lnsz.x_lnno));
904*a9fa9459Szrj               break;
905*a9fa9459Szrj             default:
906*a9fa9459Szrj               /* Do not translate - generic field name.  */
907*a9fa9459Szrj               printf ("aux\n");
908*a9fa9459Szrj               break;
909*a9fa9459Szrj             }
910*a9fa9459Szrj         }
911*a9fa9459Szrj 
912*a9fa9459Szrj     }
913*a9fa9459Szrj   free (debug);
914*a9fa9459Szrj }
915*a9fa9459Szrj 
916*a9fa9459Szrj /* Dump xcoff relocation entries.  */
917*a9fa9459Szrj 
918*a9fa9459Szrj static void
dump_xcoff32_relocs(bfd * abfd,struct xcoff_dump * data)919*a9fa9459Szrj dump_xcoff32_relocs (bfd *abfd, struct xcoff_dump *data)
920*a9fa9459Szrj {
921*a9fa9459Szrj   unsigned int i;
922*a9fa9459Szrj 
923*a9fa9459Szrj   if (data->sects == NULL)
924*a9fa9459Szrj     {
925*a9fa9459Szrj       non_fatal (_("cannot read section headers"));
926*a9fa9459Szrj       return;
927*a9fa9459Szrj     }
928*a9fa9459Szrj 
929*a9fa9459Szrj   for (i = 0; i < data->nscns; i++)
930*a9fa9459Szrj     {
931*a9fa9459Szrj       struct xcoff32_section *sect = &data->sects[i];
932*a9fa9459Szrj       unsigned int nrel = sect->nreloc;
933*a9fa9459Szrj       unsigned int j;
934*a9fa9459Szrj 
935*a9fa9459Szrj       if (nrel == 0)
936*a9fa9459Szrj         continue;
937*a9fa9459Szrj       printf (_("Relocations for %s (%u)\n"), sect->name, nrel);
938*a9fa9459Szrj       if (bfd_seek (abfd, sect->relptr, SEEK_SET) != 0)
939*a9fa9459Szrj         {
940*a9fa9459Szrj           non_fatal (_("cannot read relocations"));
941*a9fa9459Szrj           continue;
942*a9fa9459Szrj         }
943*a9fa9459Szrj       /* Do not translate: fields name.  */
944*a9fa9459Szrj       printf ("vaddr    sgn mod sz type  symndx symbol\n");
945*a9fa9459Szrj       for (j = 0; j < nrel; j++)
946*a9fa9459Szrj         {
947*a9fa9459Szrj           struct external_reloc rel;
948*a9fa9459Szrj           unsigned char rsize;
949*a9fa9459Szrj           unsigned int symndx;
950*a9fa9459Szrj 
951*a9fa9459Szrj           if (bfd_bread (&rel, sizeof (rel), abfd) != sizeof (rel))
952*a9fa9459Szrj             {
953*a9fa9459Szrj               non_fatal (_("cannot read relocation entry"));
954*a9fa9459Szrj               return;
955*a9fa9459Szrj             }
956*a9fa9459Szrj           rsize = bfd_h_get_8 (abfd, rel.r_size);
957*a9fa9459Szrj           printf ("%08x  %c   %c  %-2u ",
958*a9fa9459Szrj                   (unsigned int)bfd_h_get_32 (abfd, rel.r_vaddr),
959*a9fa9459Szrj                   rsize & 0x80 ? 'S' : 'U',
960*a9fa9459Szrj                   rsize & 0x40 ? 'm' : ' ',
961*a9fa9459Szrj                   (rsize & 0x3f) + 1);
962*a9fa9459Szrj           dump_value (rtype_xlat, bfd_h_get_8 (abfd, rel.r_type), 6);
963*a9fa9459Szrj           symndx = bfd_h_get_32 (abfd, rel.r_symndx);
964*a9fa9459Szrj           printf ("%-6u ", symndx);
965*a9fa9459Szrj           xcoff32_print_symbol (data, symndx);
966*a9fa9459Szrj           putchar ('\n');
967*a9fa9459Szrj         }
968*a9fa9459Szrj       putchar ('\n');
969*a9fa9459Szrj     }
970*a9fa9459Szrj }
971*a9fa9459Szrj 
972*a9fa9459Szrj /* Dump xcoff line number entries.  */
973*a9fa9459Szrj 
974*a9fa9459Szrj static void
dump_xcoff32_lineno(bfd * abfd,struct xcoff_dump * data)975*a9fa9459Szrj dump_xcoff32_lineno (bfd *abfd, struct xcoff_dump *data)
976*a9fa9459Szrj {
977*a9fa9459Szrj   unsigned int i;
978*a9fa9459Szrj 
979*a9fa9459Szrj   if (data->sects == NULL)
980*a9fa9459Szrj     {
981*a9fa9459Szrj       non_fatal (_("cannot read section headers"));
982*a9fa9459Szrj       return;
983*a9fa9459Szrj     }
984*a9fa9459Szrj 
985*a9fa9459Szrj   for (i = 0; i < data->nscns; i++)
986*a9fa9459Szrj     {
987*a9fa9459Szrj       struct xcoff32_section *sect = &data->sects[i];
988*a9fa9459Szrj       unsigned int nlnno = sect->nlnno;
989*a9fa9459Szrj       unsigned int j;
990*a9fa9459Szrj 
991*a9fa9459Szrj       if (nlnno == 0)
992*a9fa9459Szrj         continue;
993*a9fa9459Szrj       printf (_("Line numbers for %s (%u)\n"), sect->name, nlnno);
994*a9fa9459Szrj       if (bfd_seek (abfd, sect->lnnoptr, SEEK_SET) != 0)
995*a9fa9459Szrj         {
996*a9fa9459Szrj           non_fatal (_("cannot read line numbers"));
997*a9fa9459Szrj           continue;
998*a9fa9459Szrj         }
999*a9fa9459Szrj       /* Line number, symbol index and physical address.  */
1000*a9fa9459Szrj       printf (_("lineno  symndx/paddr\n"));
1001*a9fa9459Szrj       for (j = 0; j < nlnno; j++)
1002*a9fa9459Szrj         {
1003*a9fa9459Szrj           struct external_lineno ln;
1004*a9fa9459Szrj           unsigned int no;
1005*a9fa9459Szrj 
1006*a9fa9459Szrj           if (bfd_bread (&ln, sizeof (ln), abfd) != sizeof (ln))
1007*a9fa9459Szrj             {
1008*a9fa9459Szrj               non_fatal (_("cannot read line number entry"));
1009*a9fa9459Szrj               return;
1010*a9fa9459Szrj             }
1011*a9fa9459Szrj           no = bfd_h_get_16 (abfd, ln.l_lnno);
1012*a9fa9459Szrj           printf (" %-6u ", no);
1013*a9fa9459Szrj           if (no == 0)
1014*a9fa9459Szrj             {
1015*a9fa9459Szrj               unsigned int symndx = bfd_h_get_32 (abfd, ln.l_addr.l_symndx);
1016*a9fa9459Szrj               xcoff32_print_symbol (data, symndx);
1017*a9fa9459Szrj             }
1018*a9fa9459Szrj           else
1019*a9fa9459Szrj             printf ("0x%08x",
1020*a9fa9459Szrj                     (unsigned int)bfd_h_get_32 (abfd, ln.l_addr.l_paddr));
1021*a9fa9459Szrj           putchar ('\n');
1022*a9fa9459Szrj         }
1023*a9fa9459Szrj     }
1024*a9fa9459Szrj }
1025*a9fa9459Szrj 
1026*a9fa9459Szrj /* Dump xcoff loader section.  */
1027*a9fa9459Szrj 
1028*a9fa9459Szrj static void
dump_xcoff32_loader(bfd * abfd)1029*a9fa9459Szrj dump_xcoff32_loader (bfd *abfd)
1030*a9fa9459Szrj {
1031*a9fa9459Szrj   asection *loader;
1032*a9fa9459Szrj   bfd_size_type size = 0;
1033*a9fa9459Szrj   struct external_ldhdr *lhdr;
1034*a9fa9459Szrj   struct external_ldsym *ldsym;
1035*a9fa9459Szrj   struct external_ldrel *ldrel;
1036*a9fa9459Szrj   bfd_byte *ldr_data;
1037*a9fa9459Szrj   unsigned int version;
1038*a9fa9459Szrj   unsigned int ndsyms;
1039*a9fa9459Szrj   unsigned int ndrel;
1040*a9fa9459Szrj   unsigned int stlen;
1041*a9fa9459Szrj   unsigned int stoff;
1042*a9fa9459Szrj   unsigned int impoff;
1043*a9fa9459Szrj   unsigned int nimpid;
1044*a9fa9459Szrj   unsigned int i;
1045*a9fa9459Szrj   const char *p;
1046*a9fa9459Szrj 
1047*a9fa9459Szrj   loader = bfd_get_section_by_name (abfd, ".loader");
1048*a9fa9459Szrj 
1049*a9fa9459Szrj   if (loader == NULL)
1050*a9fa9459Szrj     {
1051*a9fa9459Szrj       printf (_("no .loader section in file\n"));
1052*a9fa9459Szrj       return;
1053*a9fa9459Szrj     }
1054*a9fa9459Szrj   size = bfd_get_section_size (loader);
1055*a9fa9459Szrj   if (size < sizeof (*lhdr))
1056*a9fa9459Szrj     {
1057*a9fa9459Szrj       printf (_("section .loader is too short\n"));
1058*a9fa9459Szrj       return;
1059*a9fa9459Szrj     }
1060*a9fa9459Szrj 
1061*a9fa9459Szrj   ldr_data = (bfd_byte *) xmalloc (size);
1062*a9fa9459Szrj   bfd_get_section_contents (abfd, loader, ldr_data, 0, size);
1063*a9fa9459Szrj   lhdr = (struct external_ldhdr *)ldr_data;
1064*a9fa9459Szrj   printf (_("Loader header:\n"));
1065*a9fa9459Szrj   version = bfd_h_get_32 (abfd, lhdr->l_version);
1066*a9fa9459Szrj   printf (_("  version:           %u\n"), version);
1067*a9fa9459Szrj   if (version != 1)
1068*a9fa9459Szrj     {
1069*a9fa9459Szrj       printf (_(" Unhandled version\n"));
1070*a9fa9459Szrj       free (ldr_data);
1071*a9fa9459Szrj       return;
1072*a9fa9459Szrj     }
1073*a9fa9459Szrj   ndsyms = bfd_h_get_32 (abfd, lhdr->l_nsyms);
1074*a9fa9459Szrj   printf (_("  nbr symbols:       %u\n"), ndsyms);
1075*a9fa9459Szrj   ndrel = bfd_h_get_32 (abfd, lhdr->l_nreloc);
1076*a9fa9459Szrj   printf (_("  nbr relocs:        %u\n"), ndrel);
1077*a9fa9459Szrj   /* Import string table length.  */
1078*a9fa9459Szrj   printf (_("  import strtab len: %u\n"),
1079*a9fa9459Szrj           (unsigned) bfd_h_get_32 (abfd, lhdr->l_istlen));
1080*a9fa9459Szrj   nimpid = bfd_h_get_32 (abfd, lhdr->l_nimpid);
1081*a9fa9459Szrj   printf (_("  nbr import files:  %u\n"), nimpid);
1082*a9fa9459Szrj   impoff = bfd_h_get_32 (abfd, lhdr->l_impoff);
1083*a9fa9459Szrj   printf (_("  import file off:   %u\n"), impoff);
1084*a9fa9459Szrj   stlen = bfd_h_get_32 (abfd, lhdr->l_stlen);
1085*a9fa9459Szrj   printf (_("  string table len:  %u\n"), stlen);
1086*a9fa9459Szrj   stoff = bfd_h_get_32 (abfd, lhdr->l_stoff);
1087*a9fa9459Szrj   printf (_("  string table off:  %u\n"), stoff);
1088*a9fa9459Szrj 
1089*a9fa9459Szrj   ldsym = (struct external_ldsym *)(ldr_data + sizeof (*lhdr));
1090*a9fa9459Szrj   printf (_("Dynamic symbols:\n"));
1091*a9fa9459Szrj   /* Do not translate: field names.  */
1092*a9fa9459Szrj   printf ("     # value     sc IFEW ty class file  pa name\n");
1093*a9fa9459Szrj   for (i = 0; i < ndsyms; i++, ldsym++)
1094*a9fa9459Szrj     {
1095*a9fa9459Szrj       unsigned char smtype;
1096*a9fa9459Szrj 
1097*a9fa9459Szrj       printf (_("  %4u %08x %3u "), i,
1098*a9fa9459Szrj               (unsigned)bfd_h_get_32 (abfd, ldsym->l_value),
1099*a9fa9459Szrj               (unsigned)bfd_h_get_16 (abfd, ldsym->l_scnum));
1100*a9fa9459Szrj       smtype = bfd_h_get_8 (abfd, ldsym->l_smtype);
1101*a9fa9459Szrj       putchar (smtype & 0x40 ? 'I' : ' ');
1102*a9fa9459Szrj       putchar (smtype & 0x20 ? 'F' : ' ');
1103*a9fa9459Szrj       putchar (smtype & 0x10 ? 'E' : ' ');
1104*a9fa9459Szrj       putchar (smtype & 0x08 ? 'W' : ' ');
1105*a9fa9459Szrj       putchar (' ');
1106*a9fa9459Szrj       dump_value (smtyp_xlat, SMTYP_SMTYP (smtype), 2);
1107*a9fa9459Szrj       putchar (' ');
1108*a9fa9459Szrj       dump_value
1109*a9fa9459Szrj         (smclas_xlat, (unsigned)bfd_h_get_8 (abfd, ldsym->l_smclas), 6);
1110*a9fa9459Szrj       printf (_(" %3u %3u "),
1111*a9fa9459Szrj               (unsigned)bfd_h_get_32 (abfd, ldsym->l_ifile),
1112*a9fa9459Szrj               (unsigned)bfd_h_get_32 (abfd, ldsym->l_parm));
1113*a9fa9459Szrj       if (ldsym->_l._l_name[0] != 0)
1114*a9fa9459Szrj         printf ("%-.8s", ldsym->_l._l_name);
1115*a9fa9459Szrj       else
1116*a9fa9459Szrj         {
1117*a9fa9459Szrj           unsigned int off = bfd_h_get_32 (abfd, ldsym->_l._l_l._l_offset);
1118*a9fa9459Szrj           if (off > stlen)
1119*a9fa9459Szrj             printf (_("(bad offset: %u)"), off);
1120*a9fa9459Szrj           else
1121*a9fa9459Szrj             printf ("%s", ldr_data + stoff + off);
1122*a9fa9459Szrj         }
1123*a9fa9459Szrj       putchar ('\n');
1124*a9fa9459Szrj     }
1125*a9fa9459Szrj 
1126*a9fa9459Szrj   printf (_("Dynamic relocs:\n"));
1127*a9fa9459Szrj   /* Do not translate fields name.  */
1128*a9fa9459Szrj   printf ("  vaddr    sec    sz typ   sym\n");
1129*a9fa9459Szrj   ldrel = (struct external_ldrel *)(ldr_data + sizeof (*lhdr)
1130*a9fa9459Szrj                                     + ndsyms * sizeof (*ldsym));
1131*a9fa9459Szrj   for (i = 0; i < ndrel; i++, ldrel++)
1132*a9fa9459Szrj     {
1133*a9fa9459Szrj       unsigned int rsize;
1134*a9fa9459Szrj       unsigned int rtype;
1135*a9fa9459Szrj       unsigned int symndx;
1136*a9fa9459Szrj 
1137*a9fa9459Szrj       rsize = bfd_h_get_8 (abfd, ldrel->l_rtype + 0);
1138*a9fa9459Szrj       rtype = bfd_h_get_8 (abfd, ldrel->l_rtype + 1);
1139*a9fa9459Szrj 
1140*a9fa9459Szrj       printf ("  %08x %3u %c%c %2u ",
1141*a9fa9459Szrj               (unsigned)bfd_h_get_32 (abfd, ldrel->l_vaddr),
1142*a9fa9459Szrj               (unsigned)bfd_h_get_16 (abfd, ldrel->l_rsecnm),
1143*a9fa9459Szrj               rsize & 0x80 ? 'S' : 'U',
1144*a9fa9459Szrj               rsize & 0x40 ? 'm' : ' ',
1145*a9fa9459Szrj               (rsize & 0x3f) + 1);
1146*a9fa9459Szrj       dump_value (rtype_xlat, rtype, 6);
1147*a9fa9459Szrj       symndx = bfd_h_get_32 (abfd, ldrel->l_symndx);
1148*a9fa9459Szrj       switch (symndx)
1149*a9fa9459Szrj         {
1150*a9fa9459Szrj         case 0:
1151*a9fa9459Szrj           printf (".text");
1152*a9fa9459Szrj           break;
1153*a9fa9459Szrj         case 1:
1154*a9fa9459Szrj           printf (".data");
1155*a9fa9459Szrj           break;
1156*a9fa9459Szrj         case 2:
1157*a9fa9459Szrj           printf (".bss");
1158*a9fa9459Szrj           break;
1159*a9fa9459Szrj         default:
1160*a9fa9459Szrj           printf ("%u", symndx - 3);
1161*a9fa9459Szrj           break;
1162*a9fa9459Szrj         }
1163*a9fa9459Szrj       putchar ('\n');
1164*a9fa9459Szrj     }
1165*a9fa9459Szrj 
1166*a9fa9459Szrj   printf (_("Import files:\n"));
1167*a9fa9459Szrj   p = (char *)ldr_data + impoff;
1168*a9fa9459Szrj   for (i = 0; i < nimpid; i++)
1169*a9fa9459Szrj     {
1170*a9fa9459Szrj       int n1, n2, n3;
1171*a9fa9459Szrj 
1172*a9fa9459Szrj       n1 = strlen (p);
1173*a9fa9459Szrj       n2 = strlen (p + n1 + 1);
1174*a9fa9459Szrj       n3 = strlen (p + n1 + 1 + n2+ 1);
1175*a9fa9459Szrj       printf (" %2u: %s,%s,%s\n", i,
1176*a9fa9459Szrj               p, p + n1 + 1, p + n1 + n2 + 2);
1177*a9fa9459Szrj       p += n1 + n2 + n3 + 3;
1178*a9fa9459Szrj     }
1179*a9fa9459Szrj 
1180*a9fa9459Szrj   free (ldr_data);
1181*a9fa9459Szrj }
1182*a9fa9459Szrj 
1183*a9fa9459Szrj /* Dump xcoff exception section.  */
1184*a9fa9459Szrj 
1185*a9fa9459Szrj static void
dump_xcoff32_except(bfd * abfd,struct xcoff_dump * data)1186*a9fa9459Szrj dump_xcoff32_except (bfd *abfd, struct xcoff_dump *data)
1187*a9fa9459Szrj {
1188*a9fa9459Szrj   asection *sec;
1189*a9fa9459Szrj   bfd_size_type size = 0;
1190*a9fa9459Szrj   bfd_byte *excp_data;
1191*a9fa9459Szrj   struct external_exceptab *exceptab;
1192*a9fa9459Szrj   unsigned int i;
1193*a9fa9459Szrj 
1194*a9fa9459Szrj   sec = bfd_get_section_by_name (abfd, ".except");
1195*a9fa9459Szrj 
1196*a9fa9459Szrj   if (sec == NULL)
1197*a9fa9459Szrj     {
1198*a9fa9459Szrj       printf (_("no .except section in file\n"));
1199*a9fa9459Szrj       return;
1200*a9fa9459Szrj     }
1201*a9fa9459Szrj   size = bfd_get_section_size (sec);
1202*a9fa9459Szrj   excp_data = (bfd_byte *) xmalloc (size);
1203*a9fa9459Szrj   bfd_get_section_contents (abfd, sec, excp_data, 0, size);
1204*a9fa9459Szrj   exceptab = (struct external_exceptab *)excp_data;
1205*a9fa9459Szrj 
1206*a9fa9459Szrj   printf (_("Exception table:\n"));
1207*a9fa9459Szrj   /* Do not translate fields name.  */
1208*a9fa9459Szrj   printf ("lang reason sym/addr\n");
1209*a9fa9459Szrj   for (i = 0; i * sizeof (*exceptab) < size; i++, exceptab++)
1210*a9fa9459Szrj     {
1211*a9fa9459Szrj       unsigned int reason;
1212*a9fa9459Szrj       unsigned int addr;
1213*a9fa9459Szrj 
1214*a9fa9459Szrj       addr = bfd_get_32 (abfd, exceptab->e_addr.e_paddr);
1215*a9fa9459Szrj       reason = bfd_get_8 (abfd, exceptab->e_reason);
1216*a9fa9459Szrj       printf ("  %02x     %02x ",
1217*a9fa9459Szrj               (unsigned) bfd_get_8 (abfd, exceptab->e_lang), reason);
1218*a9fa9459Szrj       if (reason == 0)
1219*a9fa9459Szrj         xcoff32_print_symbol (data, addr);
1220*a9fa9459Szrj       else
1221*a9fa9459Szrj         printf ("@%08x", addr);
1222*a9fa9459Szrj       putchar ('\n');
1223*a9fa9459Szrj     }
1224*a9fa9459Szrj   free (excp_data);
1225*a9fa9459Szrj }
1226*a9fa9459Szrj 
1227*a9fa9459Szrj /* Dump xcoff type-check section.  */
1228*a9fa9459Szrj 
1229*a9fa9459Szrj static void
dump_xcoff32_typchk(bfd * abfd)1230*a9fa9459Szrj dump_xcoff32_typchk (bfd *abfd)
1231*a9fa9459Szrj {
1232*a9fa9459Szrj   asection *sec;
1233*a9fa9459Szrj   bfd_size_type size = 0;
1234*a9fa9459Szrj   bfd_byte *data;
1235*a9fa9459Szrj   unsigned int i;
1236*a9fa9459Szrj 
1237*a9fa9459Szrj   sec = bfd_get_section_by_name (abfd, ".typchk");
1238*a9fa9459Szrj 
1239*a9fa9459Szrj   if (sec == NULL)
1240*a9fa9459Szrj     {
1241*a9fa9459Szrj       printf (_("no .typchk section in file\n"));
1242*a9fa9459Szrj       return;
1243*a9fa9459Szrj     }
1244*a9fa9459Szrj   size = bfd_get_section_size (sec);
1245*a9fa9459Szrj   data = (bfd_byte *) xmalloc (size);
1246*a9fa9459Szrj   bfd_get_section_contents (abfd, sec, data, 0, size);
1247*a9fa9459Szrj 
1248*a9fa9459Szrj   printf (_("Type-check section:\n"));
1249*a9fa9459Szrj   /* Do not translate field names.  */
1250*a9fa9459Szrj   printf ("offset    len  lang-id general-hash language-hash\n");
1251*a9fa9459Szrj   for (i = 0; i < size;)
1252*a9fa9459Szrj     {
1253*a9fa9459Szrj       unsigned int len;
1254*a9fa9459Szrj 
1255*a9fa9459Szrj       len = bfd_get_16 (abfd, data + i);
1256*a9fa9459Szrj       printf ("%08x: %-4u ", i, len);
1257*a9fa9459Szrj       i += 2;
1258*a9fa9459Szrj 
1259*a9fa9459Szrj       if (len == 10)
1260*a9fa9459Szrj         {
1261*a9fa9459Szrj           /* Expected format.  */
1262*a9fa9459Szrj           printf ("%04x    %08x     %08x\n",
1263*a9fa9459Szrj                   (unsigned) bfd_get_16 (abfd, data + i),
1264*a9fa9459Szrj                   (unsigned) bfd_get_32 (abfd, data + i + 2),
1265*a9fa9459Szrj                   (unsigned) bfd_get_32 (abfd, data + i + 2 + 4));
1266*a9fa9459Szrj         }
1267*a9fa9459Szrj       else
1268*a9fa9459Szrj         {
1269*a9fa9459Szrj           unsigned int j;
1270*a9fa9459Szrj 
1271*a9fa9459Szrj           for (j = 0; j < len; j++)
1272*a9fa9459Szrj             {
1273*a9fa9459Szrj               if (j % 16 == 0)
1274*a9fa9459Szrj                 printf ("\n    ");
1275*a9fa9459Szrj               printf (" %02x", (unsigned char)data[i + j]);
1276*a9fa9459Szrj             }
1277*a9fa9459Szrj           putchar ('\n');
1278*a9fa9459Szrj         }
1279*a9fa9459Szrj       i += len;
1280*a9fa9459Szrj     }
1281*a9fa9459Szrj   free (data);
1282*a9fa9459Szrj }
1283*a9fa9459Szrj 
1284*a9fa9459Szrj /* Dump xcoff traceback tags section.  */
1285*a9fa9459Szrj 
1286*a9fa9459Szrj static void
dump_xcoff32_tbtags(bfd * abfd,const char * text,bfd_size_type text_size,unsigned int text_start,unsigned int func_start)1287*a9fa9459Szrj dump_xcoff32_tbtags (bfd *abfd,
1288*a9fa9459Szrj                      const char *text, bfd_size_type text_size,
1289*a9fa9459Szrj                      unsigned int text_start, unsigned int func_start)
1290*a9fa9459Szrj {
1291*a9fa9459Szrj   unsigned int i;
1292*a9fa9459Szrj 
1293*a9fa9459Szrj   if (func_start - text_start > text_size)
1294*a9fa9459Szrj     {
1295*a9fa9459Szrj       printf (_(" address beyond section size\n"));
1296*a9fa9459Szrj       return;
1297*a9fa9459Szrj     }
1298*a9fa9459Szrj   for (i = func_start - text_start; i < text_size; i+= 4)
1299*a9fa9459Szrj     if (bfd_get_32 (abfd, text + i) == 0)
1300*a9fa9459Szrj       {
1301*a9fa9459Szrj         unsigned int tb1;
1302*a9fa9459Szrj         unsigned int tb2;
1303*a9fa9459Szrj         unsigned int off;
1304*a9fa9459Szrj 
1305*a9fa9459Szrj         printf (_(" tags at %08x\n"), i + 4);
1306*a9fa9459Szrj         if (i + 8 >= text_size)
1307*a9fa9459Szrj           goto truncated;
1308*a9fa9459Szrj 
1309*a9fa9459Szrj         tb1 = bfd_get_32 (abfd, text + i + 4);
1310*a9fa9459Szrj         tb2 = bfd_get_32 (abfd, text + i + 8);
1311*a9fa9459Szrj         off = i + 12;
1312*a9fa9459Szrj         printf (" version: %u, lang: %u, global_link: %u, is_eprol: %u, has_tboff: %u, int_proc: %u\n",
1313*a9fa9459Szrj                 (tb1 >> 24) & 0xff,
1314*a9fa9459Szrj                 (tb1 >> 16) & 0xff,
1315*a9fa9459Szrj                 (tb1 >> 15) & 1,
1316*a9fa9459Szrj                 (tb1 >> 14) & 1,
1317*a9fa9459Szrj                 (tb1 >> 13) & 1,
1318*a9fa9459Szrj                 (tb1 >> 12) & 1);
1319*a9fa9459Szrj         printf (" has_ctl: %u, tocless: %u, fp_pres: %u, log_abort: %u, int_hndl: %u\n",
1320*a9fa9459Szrj                 (tb1 >> 11) & 1,
1321*a9fa9459Szrj                 (tb1 >> 10) & 1,
1322*a9fa9459Szrj                 (tb1 >> 9) & 1,
1323*a9fa9459Szrj                 (tb1 >> 8) & 1,
1324*a9fa9459Szrj                 (tb1 >> 7) & 1);
1325*a9fa9459Szrj         printf (" name_pres: %u, uses_alloca: %u, cl_dis_inv: %u, saves_cr: %u, saves_lr: %u\n",
1326*a9fa9459Szrj                 (tb1 >> 6) & 1,
1327*a9fa9459Szrj                 (tb1 >> 5) & 1,
1328*a9fa9459Szrj                 (tb1 >> 2) & 7,
1329*a9fa9459Szrj                 (tb1 >> 1) & 1,
1330*a9fa9459Szrj                 (tb1 >> 0) & 1);
1331*a9fa9459Szrj         printf (" stores_bc: %u, fixup: %u, fpr_saved: %-2u, spare3: %u, gpr_saved: %-2u\n",
1332*a9fa9459Szrj                 (tb2 >> 31) & 1,
1333*a9fa9459Szrj                 (tb2 >> 30) & 1,
1334*a9fa9459Szrj                 (tb2 >> 24) & 63,
1335*a9fa9459Szrj                 (tb2 >> 22) & 3,
1336*a9fa9459Szrj                 (tb2 >> 16) & 63);
1337*a9fa9459Szrj         printf (" fixparms: %-3u  floatparms: %-3u  parm_on_stk: %u\n",
1338*a9fa9459Szrj                 (tb2 >> 8) & 0xff,
1339*a9fa9459Szrj                 (tb2 >> 1) & 0x7f,
1340*a9fa9459Szrj                 (tb2 >> 0) & 1);
1341*a9fa9459Szrj 
1342*a9fa9459Szrj         if (((tb2 >> 1) & 0x7fff) != 0)
1343*a9fa9459Szrj           {
1344*a9fa9459Szrj             unsigned int parminfo;
1345*a9fa9459Szrj 
1346*a9fa9459Szrj             if (off >= text_size)
1347*a9fa9459Szrj               goto truncated;
1348*a9fa9459Szrj             parminfo = bfd_get_32 (abfd, text + off);
1349*a9fa9459Szrj             off += 4;
1350*a9fa9459Szrj             printf (" parminfo: 0x%08x\n", parminfo);
1351*a9fa9459Szrj           }
1352*a9fa9459Szrj 
1353*a9fa9459Szrj         if ((tb1 >> 13) & 1)
1354*a9fa9459Szrj           {
1355*a9fa9459Szrj             unsigned int tboff;
1356*a9fa9459Szrj 
1357*a9fa9459Szrj             if (off >= text_size)
1358*a9fa9459Szrj               goto truncated;
1359*a9fa9459Szrj             tboff = bfd_get_32 (abfd, text + off);
1360*a9fa9459Szrj             off += 4;
1361*a9fa9459Szrj             printf (" tb_offset: 0x%08x (start=0x%08x)\n",
1362*a9fa9459Szrj                     tboff, text_start + i - tboff);
1363*a9fa9459Szrj           }
1364*a9fa9459Szrj         if ((tb1 >> 7) & 1)
1365*a9fa9459Szrj           {
1366*a9fa9459Szrj             unsigned int hand_mask;
1367*a9fa9459Szrj 
1368*a9fa9459Szrj             if (off >= text_size)
1369*a9fa9459Szrj               goto truncated;
1370*a9fa9459Szrj             hand_mask = bfd_get_32 (abfd, text + off);
1371*a9fa9459Szrj             off += 4;
1372*a9fa9459Szrj             printf (" hand_mask_offset: 0x%08x\n", hand_mask);
1373*a9fa9459Szrj           }
1374*a9fa9459Szrj         if ((tb1 >> 11) & 1)
1375*a9fa9459Szrj           {
1376*a9fa9459Szrj             unsigned int ctl_info;
1377*a9fa9459Szrj             unsigned int j;
1378*a9fa9459Szrj 
1379*a9fa9459Szrj             if (off >= text_size)
1380*a9fa9459Szrj               goto truncated;
1381*a9fa9459Szrj             ctl_info = bfd_get_32 (abfd, text + off);
1382*a9fa9459Szrj             off += 4;
1383*a9fa9459Szrj             printf (_(" number of CTL anchors: %u\n"), ctl_info);
1384*a9fa9459Szrj             for (j = 0; j < ctl_info; j++)
1385*a9fa9459Szrj               {
1386*a9fa9459Szrj                 if (off >= text_size)
1387*a9fa9459Szrj                   goto truncated;
1388*a9fa9459Szrj                 printf ("  CTL[%u]: %08x\n",
1389*a9fa9459Szrj                         j, (unsigned)bfd_get_32 (abfd, text + off));
1390*a9fa9459Szrj                 off += 4;
1391*a9fa9459Szrj               }
1392*a9fa9459Szrj           }
1393*a9fa9459Szrj         if ((tb1 >> 6) & 1)
1394*a9fa9459Szrj           {
1395*a9fa9459Szrj             unsigned int name_len;
1396*a9fa9459Szrj             unsigned int j;
1397*a9fa9459Szrj 
1398*a9fa9459Szrj             if (off >= text_size)
1399*a9fa9459Szrj               goto truncated;
1400*a9fa9459Szrj             name_len = bfd_get_16 (abfd, text + off);
1401*a9fa9459Szrj             off += 2;
1402*a9fa9459Szrj             printf (_(" Name (len: %u): "), name_len);
1403*a9fa9459Szrj             if (off + name_len >= text_size)
1404*a9fa9459Szrj               {
1405*a9fa9459Szrj                 printf (_("[truncated]\n"));
1406*a9fa9459Szrj                 goto truncated;
1407*a9fa9459Szrj               }
1408*a9fa9459Szrj             for (j = 0; j < name_len; j++)
1409*a9fa9459Szrj               if (ISPRINT (text[off + j]))
1410*a9fa9459Szrj                 putchar (text[off + j]);
1411*a9fa9459Szrj               else
1412*a9fa9459Szrj                 printf ("[%02x]", (unsigned char)text[off + j]);
1413*a9fa9459Szrj             putchar ('\n');
1414*a9fa9459Szrj             off += name_len;
1415*a9fa9459Szrj           }
1416*a9fa9459Szrj         if ((tb1 >> 5) & 1)
1417*a9fa9459Szrj           {
1418*a9fa9459Szrj             if (off >= text_size)
1419*a9fa9459Szrj               goto truncated;
1420*a9fa9459Szrj             printf (" alloca reg: %u\n",
1421*a9fa9459Szrj                     (unsigned) bfd_get_8 (abfd, text + off));
1422*a9fa9459Szrj             off++;
1423*a9fa9459Szrj           }
1424*a9fa9459Szrj         printf (_(" (end of tags at %08x)\n"), text_start + off);
1425*a9fa9459Szrj         return;
1426*a9fa9459Szrj       }
1427*a9fa9459Szrj   printf (_(" no tags found\n"));
1428*a9fa9459Szrj   return;
1429*a9fa9459Szrj 
1430*a9fa9459Szrj  truncated:
1431*a9fa9459Szrj   printf (_(" Truncated .text section\n"));
1432*a9fa9459Szrj   return;
1433*a9fa9459Szrj }
1434*a9fa9459Szrj 
1435*a9fa9459Szrj static void
dump_xcoff32_traceback(bfd * abfd,struct xcoff_dump * data)1436*a9fa9459Szrj dump_xcoff32_traceback (bfd *abfd, struct xcoff_dump *data)
1437*a9fa9459Szrj {
1438*a9fa9459Szrj   unsigned int i;
1439*a9fa9459Szrj   unsigned int scnum_text = -1;
1440*a9fa9459Szrj   unsigned int text_vma;
1441*a9fa9459Szrj   asection *text_sec;
1442*a9fa9459Szrj   bfd_size_type text_size;
1443*a9fa9459Szrj   char *text;
1444*a9fa9459Szrj 
1445*a9fa9459Szrj   if (data->syms == NULL || data->sects == NULL)
1446*a9fa9459Szrj     return;
1447*a9fa9459Szrj 
1448*a9fa9459Szrj   /* Read text section.  */
1449*a9fa9459Szrj   text_sec = bfd_get_section_by_name (abfd, ".text");
1450*a9fa9459Szrj   if (text_sec == NULL)
1451*a9fa9459Szrj     return;
1452*a9fa9459Szrj   text_vma = bfd_get_section_vma (abfd, text_sec);
1453*a9fa9459Szrj 
1454*a9fa9459Szrj   text_size = bfd_get_section_size (text_sec);
1455*a9fa9459Szrj   text = (char *) xmalloc (text_size);
1456*a9fa9459Szrj   bfd_get_section_contents (abfd, text_sec, text, 0, text_size);
1457*a9fa9459Szrj 
1458*a9fa9459Szrj   for (i = 0; i < data->nscns; i++)
1459*a9fa9459Szrj     if (data->sects[i].flags == STYP_TEXT)
1460*a9fa9459Szrj       {
1461*a9fa9459Szrj         scnum_text = i + 1;
1462*a9fa9459Szrj         break;
1463*a9fa9459Szrj       }
1464*a9fa9459Szrj   if (scnum_text == (unsigned int)-1)
1465*a9fa9459Szrj     return;
1466*a9fa9459Szrj 
1467*a9fa9459Szrj   for (i = 0; i < data->nsyms; i++)
1468*a9fa9459Szrj     {
1469*a9fa9459Szrj       union xcoff32_symbol *s = &data->syms[i];
1470*a9fa9459Szrj 
1471*a9fa9459Szrj       switch (s->sym.sclass)
1472*a9fa9459Szrj         {
1473*a9fa9459Szrj         case C_EXT:
1474*a9fa9459Szrj         case C_HIDEXT:
1475*a9fa9459Szrj         case C_WEAKEXT:
1476*a9fa9459Szrj           if (s->sym.scnum == scnum_text
1477*a9fa9459Szrj               && s->sym.numaux > 0)
1478*a9fa9459Szrj             {
1479*a9fa9459Szrj               union external_auxent *aux = &s[s->sym.numaux].aux;
1480*a9fa9459Szrj 
1481*a9fa9459Szrj               unsigned int smtyp;
1482*a9fa9459Szrj               unsigned int smclas;
1483*a9fa9459Szrj 
1484*a9fa9459Szrj               smtyp = bfd_h_get_8 (abfd, aux->x_csect.x_smtyp);
1485*a9fa9459Szrj               smclas = bfd_h_get_8 (abfd, aux->x_csect.x_smclas);
1486*a9fa9459Szrj               if (SMTYP_SMTYP (smtyp) == XTY_LD
1487*a9fa9459Szrj                   && (smclas == XMC_PR
1488*a9fa9459Szrj                       || smclas == XMC_GL
1489*a9fa9459Szrj                       || smclas == XMC_XO))
1490*a9fa9459Szrj                 {
1491*a9fa9459Szrj                   printf ("%08x: ", s->sym.val);
1492*a9fa9459Szrj                   xcoff32_print_symbol (data, i);
1493*a9fa9459Szrj                   putchar ('\n');
1494*a9fa9459Szrj                   dump_xcoff32_tbtags (abfd, text, text_size,
1495*a9fa9459Szrj                                        text_vma, s->sym.val);
1496*a9fa9459Szrj                 }
1497*a9fa9459Szrj             }
1498*a9fa9459Szrj           break;
1499*a9fa9459Szrj         default:
1500*a9fa9459Szrj           break;
1501*a9fa9459Szrj         }
1502*a9fa9459Szrj       i += s->sym.numaux;
1503*a9fa9459Szrj     }
1504*a9fa9459Szrj   free (text);
1505*a9fa9459Szrj }
1506*a9fa9459Szrj 
1507*a9fa9459Szrj /* Dump the TOC symbols.  */
1508*a9fa9459Szrj 
1509*a9fa9459Szrj static void
dump_xcoff32_toc(bfd * abfd,struct xcoff_dump * data)1510*a9fa9459Szrj dump_xcoff32_toc (bfd *abfd, struct xcoff_dump *data)
1511*a9fa9459Szrj {
1512*a9fa9459Szrj   unsigned int i;
1513*a9fa9459Szrj   unsigned int nbr_ent;
1514*a9fa9459Szrj   unsigned int size;
1515*a9fa9459Szrj 
1516*a9fa9459Szrj   printf (_("TOC:\n"));
1517*a9fa9459Szrj 
1518*a9fa9459Szrj   if (data->syms == NULL)
1519*a9fa9459Szrj     return;
1520*a9fa9459Szrj 
1521*a9fa9459Szrj   nbr_ent = 0;
1522*a9fa9459Szrj   size = 0;
1523*a9fa9459Szrj 
1524*a9fa9459Szrj   for (i = 0; i < data->nsyms; i++)
1525*a9fa9459Szrj     {
1526*a9fa9459Szrj       union xcoff32_symbol *s = &data->syms[i];
1527*a9fa9459Szrj 
1528*a9fa9459Szrj       switch (s->sym.sclass)
1529*a9fa9459Szrj         {
1530*a9fa9459Szrj         case C_EXT:
1531*a9fa9459Szrj         case C_HIDEXT:
1532*a9fa9459Szrj         case C_WEAKEXT:
1533*a9fa9459Szrj           if (s->sym.numaux > 0)
1534*a9fa9459Szrj             {
1535*a9fa9459Szrj               union external_auxent *aux = &s[s->sym.numaux].aux;
1536*a9fa9459Szrj               unsigned int smclas;
1537*a9fa9459Szrj               unsigned int ent_sz;
1538*a9fa9459Szrj 
1539*a9fa9459Szrj               smclas = bfd_h_get_8 (abfd, aux->x_csect.x_smclas);
1540*a9fa9459Szrj               if (smclas == XMC_TC
1541*a9fa9459Szrj                   || smclas == XMC_TD
1542*a9fa9459Szrj                   || smclas == XMC_TC0)
1543*a9fa9459Szrj                 {
1544*a9fa9459Szrj                   ent_sz = bfd_h_get_32 (abfd, aux->x_scn.x_scnlen);
1545*a9fa9459Szrj                   printf ("%08x %08x ",
1546*a9fa9459Szrj                           s->sym.val, ent_sz);
1547*a9fa9459Szrj                   xcoff32_print_symbol (data, i);
1548*a9fa9459Szrj                   putchar ('\n');
1549*a9fa9459Szrj                   nbr_ent++;
1550*a9fa9459Szrj                   size += ent_sz;
1551*a9fa9459Szrj                 }
1552*a9fa9459Szrj             }
1553*a9fa9459Szrj           break;
1554*a9fa9459Szrj         default:
1555*a9fa9459Szrj           break;
1556*a9fa9459Szrj         }
1557*a9fa9459Szrj       i += s->sym.numaux;
1558*a9fa9459Szrj     }
1559*a9fa9459Szrj   printf (_("Nbr entries: %-8u Size: %08x (%u)\n"),
1560*a9fa9459Szrj           nbr_ent, size, size);
1561*a9fa9459Szrj }
1562*a9fa9459Szrj 
1563*a9fa9459Szrj /* Handle an rs6000 xcoff file.  */
1564*a9fa9459Szrj 
1565*a9fa9459Szrj static void
dump_xcoff32(bfd * abfd,struct external_filehdr * fhdr)1566*a9fa9459Szrj dump_xcoff32 (bfd *abfd, struct external_filehdr *fhdr)
1567*a9fa9459Szrj {
1568*a9fa9459Szrj   struct xcoff_dump data;
1569*a9fa9459Szrj 
1570*a9fa9459Szrj   data.nscns = bfd_h_get_16 (abfd, fhdr->f_nscns);
1571*a9fa9459Szrj   data.symptr = bfd_h_get_32 (abfd, fhdr->f_symptr);
1572*a9fa9459Szrj   data.nsyms = bfd_h_get_32 (abfd, fhdr->f_nsyms);
1573*a9fa9459Szrj   data.opthdr = bfd_h_get_16 (abfd, fhdr->f_opthdr);
1574*a9fa9459Szrj   data.sects = NULL;
1575*a9fa9459Szrj   data.syms = NULL;
1576*a9fa9459Szrj   data.strings = NULL;
1577*a9fa9459Szrj   data.strings_size = 0;
1578*a9fa9459Szrj 
1579*a9fa9459Szrj   if (options[OPT_FILE_HEADER].selected)
1580*a9fa9459Szrj     dump_xcoff32_file_header (abfd, fhdr, &data);
1581*a9fa9459Szrj 
1582*a9fa9459Szrj   if (options[OPT_AOUT].selected)
1583*a9fa9459Szrj     dump_xcoff32_aout_header (abfd, &data);
1584*a9fa9459Szrj 
1585*a9fa9459Szrj   if (options[OPT_SYMS].selected
1586*a9fa9459Szrj       || options[OPT_RELOCS].selected
1587*a9fa9459Szrj       || options[OPT_LINENO].selected
1588*a9fa9459Szrj       || options[OPT_TRACEBACK].selected)
1589*a9fa9459Szrj     xcoff32_read_sections (abfd, &data);
1590*a9fa9459Szrj 
1591*a9fa9459Szrj   if (options[OPT_SECTIONS].selected)
1592*a9fa9459Szrj     dump_xcoff32_sections_header (abfd, &data);
1593*a9fa9459Szrj 
1594*a9fa9459Szrj   if (options[OPT_SYMS].selected
1595*a9fa9459Szrj       || options[OPT_RELOCS].selected
1596*a9fa9459Szrj       || options[OPT_LINENO].selected
1597*a9fa9459Szrj       || options[OPT_EXCEPT].selected
1598*a9fa9459Szrj       || options[OPT_TRACEBACK].selected
1599*a9fa9459Szrj       || options[OPT_TOC].selected)
1600*a9fa9459Szrj     xcoff32_read_symbols (abfd, &data);
1601*a9fa9459Szrj 
1602*a9fa9459Szrj   if (options[OPT_SYMS].selected)
1603*a9fa9459Szrj     dump_xcoff32_symbols (abfd, &data);
1604*a9fa9459Szrj 
1605*a9fa9459Szrj   if (options[OPT_RELOCS].selected)
1606*a9fa9459Szrj     dump_xcoff32_relocs (abfd, &data);
1607*a9fa9459Szrj 
1608*a9fa9459Szrj   if (options[OPT_LINENO].selected)
1609*a9fa9459Szrj     dump_xcoff32_lineno (abfd, &data);
1610*a9fa9459Szrj 
1611*a9fa9459Szrj   if (options[OPT_LOADER].selected)
1612*a9fa9459Szrj     dump_xcoff32_loader (abfd);
1613*a9fa9459Szrj 
1614*a9fa9459Szrj   if (options[OPT_EXCEPT].selected)
1615*a9fa9459Szrj     dump_xcoff32_except (abfd, &data);
1616*a9fa9459Szrj 
1617*a9fa9459Szrj   if (options[OPT_TYPCHK].selected)
1618*a9fa9459Szrj     dump_xcoff32_typchk (abfd);
1619*a9fa9459Szrj 
1620*a9fa9459Szrj   if (options[OPT_TRACEBACK].selected)
1621*a9fa9459Szrj     dump_xcoff32_traceback (abfd, &data);
1622*a9fa9459Szrj 
1623*a9fa9459Szrj   if (options[OPT_TOC].selected)
1624*a9fa9459Szrj     dump_xcoff32_toc (abfd, &data);
1625*a9fa9459Szrj 
1626*a9fa9459Szrj   free (data.sects);
1627*a9fa9459Szrj   free (data.strings);
1628*a9fa9459Szrj   free (data.syms);
1629*a9fa9459Szrj }
1630*a9fa9459Szrj 
1631*a9fa9459Szrj /* Dump ABFD (according to the options[] array).  */
1632*a9fa9459Szrj 
1633*a9fa9459Szrj static void
xcoff_dump_obj(bfd * abfd)1634*a9fa9459Szrj xcoff_dump_obj (bfd *abfd)
1635*a9fa9459Szrj {
1636*a9fa9459Szrj   struct external_filehdr fhdr;
1637*a9fa9459Szrj   unsigned short magic;
1638*a9fa9459Szrj 
1639*a9fa9459Szrj   /* Read file header.  */
1640*a9fa9459Szrj   if (bfd_seek (abfd, 0, SEEK_SET) != 0
1641*a9fa9459Szrj       || bfd_bread (&fhdr, sizeof (fhdr), abfd) != sizeof (fhdr))
1642*a9fa9459Szrj     {
1643*a9fa9459Szrj       non_fatal (_("cannot read header"));
1644*a9fa9459Szrj       return;
1645*a9fa9459Szrj     }
1646*a9fa9459Szrj 
1647*a9fa9459Szrj   /* Decoding.  We don't use the bfd/coff function to get all the fields.  */
1648*a9fa9459Szrj   magic = bfd_h_get_16 (abfd, fhdr.f_magic);
1649*a9fa9459Szrj   if (options[OPT_FILE_HEADER].selected)
1650*a9fa9459Szrj     {
1651*a9fa9459Szrj       printf (_("File header:\n"));
1652*a9fa9459Szrj       printf (_("  magic:         0x%04x (0%04o)  "), magic, magic);
1653*a9fa9459Szrj       switch (magic)
1654*a9fa9459Szrj         {
1655*a9fa9459Szrj         case U802WRMAGIC:
1656*a9fa9459Szrj           printf (_("(WRMAGIC: writable text segments)"));
1657*a9fa9459Szrj           break;
1658*a9fa9459Szrj         case U802ROMAGIC:
1659*a9fa9459Szrj           printf (_("(ROMAGIC: readonly sharablee text segments)"));
1660*a9fa9459Szrj           break;
1661*a9fa9459Szrj         case U802TOCMAGIC:
1662*a9fa9459Szrj           printf (_("(TOCMAGIC: readonly text segments and TOC)"));
1663*a9fa9459Szrj           break;
1664*a9fa9459Szrj         default:
1665*a9fa9459Szrj           printf (_("unknown magic"));
1666*a9fa9459Szrj 	  break;
1667*a9fa9459Szrj         }
1668*a9fa9459Szrj       putchar ('\n');
1669*a9fa9459Szrj     }
1670*a9fa9459Szrj   if (magic == U802ROMAGIC || magic == U802WRMAGIC || magic == U802TOCMAGIC)
1671*a9fa9459Szrj     dump_xcoff32 (abfd, &fhdr);
1672*a9fa9459Szrj   else
1673*a9fa9459Szrj     printf (_("  Unhandled magic\n"));
1674*a9fa9459Szrj }
1675*a9fa9459Szrj 
1676*a9fa9459Szrj /* Handle an AIX dumpx core file.  */
1677*a9fa9459Szrj 
1678*a9fa9459Szrj static void
dump_dumpx_core(bfd * abfd,struct external_core_dumpx * hdr)1679*a9fa9459Szrj dump_dumpx_core (bfd *abfd, struct external_core_dumpx *hdr)
1680*a9fa9459Szrj {
1681*a9fa9459Szrj   if (options[OPT_FILE_HEADER].selected)
1682*a9fa9459Szrj     {
1683*a9fa9459Szrj       printf ("  signal:     %u\n", bfd_h_get_8 (abfd, hdr->c_signo));
1684*a9fa9459Szrj       printf ("  flags:      0x%02x\n", bfd_h_get_8 (abfd, hdr->c_flag));
1685*a9fa9459Szrj       printf ("  entries:    %u\n",
1686*a9fa9459Szrj 	      (unsigned) bfd_h_get_16 (abfd, hdr->c_entries));
1687*a9fa9459Szrj #ifdef BFD64
1688*a9fa9459Szrj       printf ("  fdsinfox:   offset: 0x%08" BFD_VMA_FMT "x\n",
1689*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_fdsinfox));
1690*a9fa9459Szrj       printf ("  loader:     offset: 0x%08" BFD_VMA_FMT "x, "
1691*a9fa9459Szrj 	      "size: 0x%" BFD_VMA_FMT"x\n",
1692*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_loader),
1693*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_lsize));
1694*a9fa9459Szrj       printf ("  thr:        offset: 0x%08" BFD_VMA_FMT "x, nbr: %u\n",
1695*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_thr),
1696*a9fa9459Szrj 	      (unsigned) bfd_h_get_32 (abfd, hdr->c_n_thr));
1697*a9fa9459Szrj       printf ("  segregions: offset: 0x%08" BFD_VMA_FMT "x, "
1698*a9fa9459Szrj 	      "nbr: %" BFD_VMA_FMT "u\n",
1699*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_segregion),
1700*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_segs));
1701*a9fa9459Szrj       printf ("  stack:      offset: 0x%08" BFD_VMA_FMT "x, "
1702*a9fa9459Szrj 	      "org: 0x%" BFD_VMA_FMT"x, "
1703*a9fa9459Szrj 	      "size: 0x%" BFD_VMA_FMT"x\n",
1704*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_stack),
1705*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_stackorg),
1706*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_size));
1707*a9fa9459Szrj       printf ("  data:       offset: 0x%08" BFD_VMA_FMT "x, "
1708*a9fa9459Szrj 	      "org: 0x%" BFD_VMA_FMT"x, "
1709*a9fa9459Szrj 	      "size: 0x%" BFD_VMA_FMT"x\n",
1710*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_data),
1711*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_dataorg),
1712*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_datasize));
1713*a9fa9459Szrj       printf ("  sdata:         org: 0x%" BFD_VMA_FMT"x, "
1714*a9fa9459Szrj 	      "size: 0x%" BFD_VMA_FMT"x\n",
1715*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_sdorg),
1716*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_sdsize));
1717*a9fa9459Szrj       printf ("  vmmregions: offset: 0x%" BFD_VMA_FMT"x, "
1718*a9fa9459Szrj 	      "num: 0x%" BFD_VMA_FMT"x\n",
1719*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_vmm),
1720*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_vmmregions));
1721*a9fa9459Szrj       printf ("  impl:       0x%08x\n",
1722*a9fa9459Szrj 	      (unsigned) bfd_h_get_32 (abfd, hdr->c_impl));
1723*a9fa9459Szrj       printf ("  cprs:       0x%" BFD_VMA_FMT "x\n",
1724*a9fa9459Szrj 	      bfd_h_get_64 (abfd, hdr->c_cprs));
1725*a9fa9459Szrj #endif
1726*a9fa9459Szrj     }
1727*a9fa9459Szrj   if (options[OPT_LDINFO].selected)
1728*a9fa9459Szrj     {
1729*a9fa9459Szrj #ifdef BFD64
1730*a9fa9459Szrj       file_ptr off = (file_ptr) bfd_h_get_64 (abfd, hdr->c_loader);
1731*a9fa9459Szrj       bfd_size_type len = (bfd_size_type) bfd_h_get_64 (abfd, hdr->c_lsize);
1732*a9fa9459Szrj       char *ldr;
1733*a9fa9459Szrj 
1734*a9fa9459Szrj       ldr = xmalloc (len);
1735*a9fa9459Szrj       if (bfd_seek (abfd, off, SEEK_SET) != 0
1736*a9fa9459Szrj 	  || bfd_bread (ldr, len, abfd) != len)
1737*a9fa9459Szrj 	non_fatal (_("cannot read loader info table"));
1738*a9fa9459Szrj       else
1739*a9fa9459Szrj 	{
1740*a9fa9459Szrj 	  char *p;
1741*a9fa9459Szrj 
1742*a9fa9459Szrj 	  printf ("\n"
1743*a9fa9459Szrj 		  "ld info:\n");
1744*a9fa9459Szrj 	  printf ("  next     core off textorg  textsize dataorg  datasize\n");
1745*a9fa9459Szrj 	  p = ldr;
1746*a9fa9459Szrj 	  while (1)
1747*a9fa9459Szrj 	    {
1748*a9fa9459Szrj 	      struct external_ld_info32 *l = (struct external_ld_info32 *)p;
1749*a9fa9459Szrj 	      unsigned int next;
1750*a9fa9459Szrj 	      size_t n1;
1751*a9fa9459Szrj 
1752*a9fa9459Szrj 	      next = bfd_h_get_32 (abfd, l->ldinfo_next);
1753*a9fa9459Szrj 	      printf ("  %08x %08x %08x %08x %08x %08x\n",
1754*a9fa9459Szrj 		      next,
1755*a9fa9459Szrj 		      (unsigned) bfd_h_get_32 (abfd, l->core_offset),
1756*a9fa9459Szrj 		      (unsigned) bfd_h_get_32 (abfd, l->ldinfo_textorg),
1757*a9fa9459Szrj 		      (unsigned) bfd_h_get_32 (abfd, l->ldinfo_textsize),
1758*a9fa9459Szrj 		      (unsigned) bfd_h_get_32 (abfd, l->ldinfo_dataorg),
1759*a9fa9459Szrj 		      (unsigned) bfd_h_get_32 (abfd, l->ldinfo_datasize));
1760*a9fa9459Szrj 	      n1 = strlen ((char *) l->ldinfo_filename);
1761*a9fa9459Szrj 	      printf ("    %s %s\n",
1762*a9fa9459Szrj 		      l->ldinfo_filename, l->ldinfo_filename + n1 + 1);
1763*a9fa9459Szrj 	      if (next == 0)
1764*a9fa9459Szrj 		break;
1765*a9fa9459Szrj 	      p += next;
1766*a9fa9459Szrj 	    }
1767*a9fa9459Szrj 	}
1768*a9fa9459Szrj #else
1769*a9fa9459Szrj       printf (_("\n"
1770*a9fa9459Szrj 		"ldinfo dump not supported in 32 bits environments\n"));
1771*a9fa9459Szrj #endif
1772*a9fa9459Szrj     }
1773*a9fa9459Szrj }
1774*a9fa9459Szrj 
1775*a9fa9459Szrj /* Dump a core file.  */
1776*a9fa9459Szrj 
1777*a9fa9459Szrj static void
xcoff_dump_core(bfd * abfd)1778*a9fa9459Szrj xcoff_dump_core (bfd *abfd)
1779*a9fa9459Szrj {
1780*a9fa9459Szrj   struct external_core_dumpx hdr;
1781*a9fa9459Szrj   unsigned int version;
1782*a9fa9459Szrj 
1783*a9fa9459Szrj   /* Read file header.  */
1784*a9fa9459Szrj   if (bfd_seek (abfd, 0, SEEK_SET) != 0
1785*a9fa9459Szrj       || bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
1786*a9fa9459Szrj     {
1787*a9fa9459Szrj       non_fatal (_("cannot core read header"));
1788*a9fa9459Szrj       return;
1789*a9fa9459Szrj     }
1790*a9fa9459Szrj 
1791*a9fa9459Szrj   version = bfd_h_get_32 (abfd, hdr.c_version);
1792*a9fa9459Szrj   if (options[OPT_FILE_HEADER].selected)
1793*a9fa9459Szrj     {
1794*a9fa9459Szrj       printf (_("Core header:\n"));
1795*a9fa9459Szrj       printf (_("  version:    0x%08x  "), version);
1796*a9fa9459Szrj       switch (version)
1797*a9fa9459Szrj 	{
1798*a9fa9459Szrj 	case CORE_DUMPX_VERSION:
1799*a9fa9459Szrj 	  printf (_("(dumpx format - aix4.3 / 32 bits)"));
1800*a9fa9459Szrj 	  break;
1801*a9fa9459Szrj 	case CORE_DUMPXX_VERSION:
1802*a9fa9459Szrj 	  printf (_("(dumpxx format - aix5.0 / 64 bits)"));
1803*a9fa9459Szrj 	  break;
1804*a9fa9459Szrj 	default:
1805*a9fa9459Szrj 	  printf (_("unknown format"));
1806*a9fa9459Szrj 	  break;
1807*a9fa9459Szrj 	}
1808*a9fa9459Szrj       putchar ('\n');
1809*a9fa9459Szrj     }
1810*a9fa9459Szrj   if (version == CORE_DUMPX_VERSION)
1811*a9fa9459Szrj     dump_dumpx_core (abfd, &hdr);
1812*a9fa9459Szrj   else
1813*a9fa9459Szrj     printf (_("  Unhandled magic\n"));
1814*a9fa9459Szrj }
1815*a9fa9459Szrj 
1816*a9fa9459Szrj /* Dump an XCOFF file.  */
1817*a9fa9459Szrj 
1818*a9fa9459Szrj static void
xcoff_dump(bfd * abfd)1819*a9fa9459Szrj xcoff_dump (bfd *abfd)
1820*a9fa9459Szrj {
1821*a9fa9459Szrj   /* We rely on BFD to decide if the file is a core file.  Note that core
1822*a9fa9459Szrj      files are only supported on native environment by BFD.  */
1823*a9fa9459Szrj   switch (bfd_get_format (abfd))
1824*a9fa9459Szrj     {
1825*a9fa9459Szrj     case bfd_core:
1826*a9fa9459Szrj       xcoff_dump_core (abfd);
1827*a9fa9459Szrj       break;
1828*a9fa9459Szrj     default:
1829*a9fa9459Szrj       xcoff_dump_obj (abfd);
1830*a9fa9459Szrj       break;
1831*a9fa9459Szrj     }
1832*a9fa9459Szrj }
1833*a9fa9459Szrj 
1834*a9fa9459Szrj /* Vector for xcoff.  */
1835*a9fa9459Szrj 
1836*a9fa9459Szrj const struct objdump_private_desc objdump_private_desc_xcoff =
1837*a9fa9459Szrj   {
1838*a9fa9459Szrj     xcoff_help,
1839*a9fa9459Szrj     xcoff_filter,
1840*a9fa9459Szrj     xcoff_dump,
1841*a9fa9459Szrj     options
1842*a9fa9459Szrj   };
1843