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