summaryrefslogtreecommitdiffstats
path: root/binutils-2.24/binutils/od-xcoff.c
diff options
context:
space:
mode:
Diffstat (limited to 'binutils-2.24/binutils/od-xcoff.c')
-rw-r--r--binutils-2.24/binutils/od-xcoff.c1842
1 files changed, 0 insertions, 1842 deletions
diff --git a/binutils-2.24/binutils/od-xcoff.c b/binutils-2.24/binutils/od-xcoff.c
deleted file mode 100644
index 223e192c..00000000
--- a/binutils-2.24/binutils/od-xcoff.c
+++ /dev/null
@@ -1,1842 +0,0 @@
-/* od-xcoff.c -- dump information about an xcoff object file.
- Copyright 2011-2013 Free Software Foundation, Inc.
- Written by Tristan Gingold, Adacore.
-
- This file is part of GNU Binutils.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, 51 Franklin Street - Fifth Floor, Boston,
- MA 02110-1301, USA. */
-
-#include "sysdep.h"
-#include <stddef.h>
-#include <time.h>
-#include "safe-ctype.h"
-#include "bfd.h"
-#include "objdump.h"
-#include "bucomm.h"
-#include "bfdlink.h"
-/* Force the support of weak symbols. */
-#ifndef AIX_WEAK_SUPPORT
-#define AIX_WEAK_SUPPORT 1
-#endif
-#include "coff/internal.h"
-#include "coff/rs6000.h"
-#include "coff/xcoff.h"
-#include "libcoff.h"
-#include "libxcoff.h"
-
-/* Index of the options in the options[] array. */
-#define OPT_FILE_HEADER 0
-#define OPT_AOUT 1
-#define OPT_SECTIONS 2
-#define OPT_SYMS 3
-#define OPT_RELOCS 4
-#define OPT_LINENO 5
-#define OPT_LOADER 6
-#define OPT_EXCEPT 7
-#define OPT_TYPCHK 8
-#define OPT_TRACEBACK 9
-#define OPT_TOC 10
-#define OPT_LDINFO 11
-
-/* List of actions. */
-static struct objdump_private_option options[] =
- {
- { "header", 0 },
- { "aout", 0 },
- { "sections", 0 },
- { "syms", 0 },
- { "relocs", 0 },
- { "lineno", 0 },
- { "loader", 0 },
- { "except", 0 },
- { "typchk", 0 },
- { "traceback", 0 },
- { "toc", 0 },
- { "ldinfo", 0 },
- { NULL, 0 }
- };
-
-/* Display help. */
-
-static void
-xcoff_help (FILE *stream)
-{
- fprintf (stream, _("\
-For XCOFF files:\n\
- header Display the file header\n\
- aout Display the auxiliary header\n\
- sections Display the section headers\n\
- syms Display the symbols table\n\
- relocs Display the relocation entries\n\
- lineno Display the line number entries\n\
- loader Display loader section\n\
- except Display exception table\n\
- typchk Display type-check section\n\
- traceback Display traceback tags\n\
- toc Display toc symbols\n\
- ldinfo Display loader info in core files\n\
-"));
-}
-
-/* Return TRUE if ABFD is handled. */
-
-static int
-xcoff_filter (bfd *abfd)
-{
- return bfd_get_flavour (abfd) == bfd_target_xcoff_flavour;
-}
-
-/* Translation entry type. The last entry must be {0, NULL}. */
-
-struct xlat_table {
- unsigned int val;
- const char *name;
-};
-
-/* Display the list of name (from TABLE) for FLAGS, using comma to separate
- them. A name is displayed if FLAGS & VAL is not 0. */
-
-static void
-dump_flags (const struct xlat_table *table, unsigned int flags)
-{
- unsigned int r = flags;
- int first = 1;
- const struct xlat_table *t;
-
- for (t = table; t->name; t++)
- if ((flags & t->val) != 0)
- {
- r &= ~t->val;
-
- if (first)
- first = 0;
- else
- putchar (',');
- fputs (t->name, stdout);
- }
-
- /* Not decoded flags. */
- if (r != 0)
- {
- if (!first)
- putchar (',');
- printf ("0x%x", r);
- }
-}
-
-/* Display the name corresponding to VAL from TABLE, using at most
- MAXLEN char (possibly passed with spaces). */
-
-static void
-dump_value (const struct xlat_table *table, unsigned int val, int maxlen)
-{
- const struct xlat_table *t;
-
- for (t = table; t->name; t++)
- if (t->val == val)
- {
- printf ("%-*s", maxlen, t->name);
- return;
- }
- printf ("(%*x)", maxlen - 2, val);
-}
-
-/* Names of f_flags. */
-static const struct xlat_table f_flag_xlat[] =
- {
- { F_RELFLG, "no-rel" },
- { F_EXEC, "exec" },
- { F_LNNO, "lineno" },
- { F_LSYMS, "lsyms" },
-
- { F_FDPR_PROF, "fdpr-prof" },
- { F_FDPR_OPTI, "fdpr-opti" },
- { F_DSA, "dsa" },
-
- { F_VARPG, "varprg" },
-
- { F_DYNLOAD, "dynload" },
- { F_SHROBJ, "shrobj" },
- { F_NONEXEC, "nonexec" },
-
- { 0, NULL }
- };
-
-/* Names of s_flags. */
-static const struct xlat_table s_flag_xlat[] =
- {
- { STYP_PAD, "pad" },
- { STYP_DWARF, "dwarf" },
- { STYP_TEXT, "text" },
- { STYP_DATA, "data" },
- { STYP_BSS, "bss" },
-
- { STYP_EXCEPT, "except" },
- { STYP_INFO, "info" },
- { STYP_TDATA, "tdata" },
- { STYP_TBSS, "tbss" },
-
- { STYP_LOADER, "loader" },
- { STYP_DEBUG, "debug" },
- { STYP_TYPCHK, "typchk" },
- { STYP_OVRFLO, "ovrflo" },
- { 0, NULL }
- };
-
-/* Names of storage class. */
-static const struct xlat_table sc_xlat[] =
- {
-#define SC_ENTRY(X) { C_##X, #X }
- SC_ENTRY(NULL),
- SC_ENTRY(AUTO),
- SC_ENTRY(EXT),
- SC_ENTRY(STAT),
- SC_ENTRY(REG),
- SC_ENTRY(EXTDEF),
- SC_ENTRY(LABEL),
- SC_ENTRY(ULABEL),
- SC_ENTRY(MOS),
- SC_ENTRY(ARG),
- /* SC_ENTRY(STRARG), */
- SC_ENTRY(MOU),
- SC_ENTRY(UNTAG),
- SC_ENTRY(TPDEF),
- SC_ENTRY(USTATIC),
- SC_ENTRY(ENTAG),
- SC_ENTRY(MOE),
- SC_ENTRY(REGPARM),
- SC_ENTRY(FIELD),
- SC_ENTRY(BLOCK),
- SC_ENTRY(FCN),
- SC_ENTRY(EOS),
- SC_ENTRY(FILE),
- SC_ENTRY(LINE),
- SC_ENTRY(ALIAS),
- SC_ENTRY(HIDDEN),
- SC_ENTRY(HIDEXT),
- SC_ENTRY(BINCL),
- SC_ENTRY(EINCL),
- SC_ENTRY(INFO),
- SC_ENTRY(WEAKEXT),
- SC_ENTRY(DWARF),
-
- /* Stabs. */
- SC_ENTRY (GSYM),
- SC_ENTRY (LSYM),
- SC_ENTRY (PSYM),
- SC_ENTRY (RSYM),
- SC_ENTRY (RPSYM),
- SC_ENTRY (STSYM),
- SC_ENTRY (TCSYM),
- SC_ENTRY (BCOMM),
- SC_ENTRY (ECOML),
- SC_ENTRY (ECOMM),
- SC_ENTRY (DECL),
- SC_ENTRY (ENTRY),
- SC_ENTRY (FUN),
- SC_ENTRY (BSTAT),
- SC_ENTRY (ESTAT),
-
- { 0, NULL }
-#undef SC_ENTRY
- };
-
-/* Names for symbol type. */
-static const struct xlat_table smtyp_xlat[] =
- {
- { XTY_ER, "ER" },
- { XTY_SD, "SD" },
- { XTY_LD, "LD" },
- { XTY_CM, "CM" },
- { XTY_EM, "EM" },
- { XTY_US, "US" },
- { 0, NULL }
- };
-
-/* Names for storage-mapping class. */
-static const struct xlat_table smclas_xlat[] =
- {
-#define SMCLAS_ENTRY(X) { XMC_##X, #X }
- SMCLAS_ENTRY (PR),
- SMCLAS_ENTRY (RO),
- SMCLAS_ENTRY (DB),
- SMCLAS_ENTRY (TC),
- SMCLAS_ENTRY (UA),
- SMCLAS_ENTRY (RW),
- SMCLAS_ENTRY (GL),
- SMCLAS_ENTRY (XO),
- SMCLAS_ENTRY (SV),
- SMCLAS_ENTRY (BS),
- SMCLAS_ENTRY (DS),
- SMCLAS_ENTRY (UC),
- SMCLAS_ENTRY (TI),
- SMCLAS_ENTRY (TB),
- SMCLAS_ENTRY (TC0),
- SMCLAS_ENTRY (TD),
- SMCLAS_ENTRY (SV64),
- SMCLAS_ENTRY (SV3264),
- { 0, NULL }
-#undef SMCLAS_ENTRY
- };
-
-/* Names for relocation type. */
-static const struct xlat_table rtype_xlat[] =
- {
-#define RTYPE_ENTRY(X) { R_##X, #X }
- RTYPE_ENTRY (POS),
- RTYPE_ENTRY (NEG),
- RTYPE_ENTRY (REL),
- RTYPE_ENTRY (TOC),
- RTYPE_ENTRY (RTB),
- RTYPE_ENTRY (GL),
- RTYPE_ENTRY (TCL),
- RTYPE_ENTRY (BA),
- RTYPE_ENTRY (BR),
- RTYPE_ENTRY (RL),
- RTYPE_ENTRY (RLA),
- RTYPE_ENTRY (REF),
- RTYPE_ENTRY (TRL),
- RTYPE_ENTRY (TRLA),
- RTYPE_ENTRY (RRTBI),
- RTYPE_ENTRY (RRTBA),
- RTYPE_ENTRY (CAI),
- RTYPE_ENTRY (CREL),
- RTYPE_ENTRY (RBA),
- RTYPE_ENTRY (RBAC),
- RTYPE_ENTRY (RBR),
- RTYPE_ENTRY (RBRC),
- RTYPE_ENTRY (TLS),
- RTYPE_ENTRY (TLS_IE),
- RTYPE_ENTRY (TLS_LD),
- RTYPE_ENTRY (TLS_LE),
- RTYPE_ENTRY (TLSM),
- RTYPE_ENTRY (TLSML),
- RTYPE_ENTRY (TOCU),
- RTYPE_ENTRY (TOCL),
- { 0, NULL }
- };
-
-/* Simplified section header. */
-struct xcoff32_section
-{
- /* NUL terminated name. */
- char name[9];
-
- /* Section flags. */
- unsigned int flags;
-
- /* Offsets in file. */
- ufile_ptr scnptr;
- ufile_ptr relptr;
- ufile_ptr lnnoptr;
-
- /* Number of relocs and line numbers. */
- unsigned int nreloc;
- unsigned int nlnno;
-};
-
-/* Simplified symbol. */
-
-union xcoff32_symbol
-{
- union external_auxent aux;
-
- struct sym
- {
- /* Pointer to the NUL-terminated name. */
- char *name;
-
- /* XCOFF symbol fields. */
- unsigned int val;
- unsigned short scnum;
- unsigned short ntype;
- unsigned char sclass;
- unsigned char numaux;
-
- /* Buffer in case the name is local. */
- union
- {
- char name[9];
- unsigned int off;
- } raw;
- } sym;
-};
-
-/* Important fields to dump the file. */
-
-struct xcoff_dump
-{
- /* From file header. */
- unsigned short nscns;
- unsigned int symptr;
- unsigned int nsyms;
- unsigned short opthdr;
-
- /* Sections. */
- struct xcoff32_section *sects;
-
- /* Symbols. */
- union xcoff32_symbol *syms;
- char *strings;
- unsigned int strings_size;
-};
-
-/* Print a symbol (if possible). */
-
-static void
-xcoff32_print_symbol (struct xcoff_dump *data, unsigned int symndx)
-{
- if (data->syms != NULL
- && symndx < data->nsyms
- && data->syms[symndx].sym.name != NULL)
- printf ("%s", data->syms[symndx].sym.name);
- else
- printf ("%u", symndx);
-}
-
-/* Dump the file header. */
-
-static void
-dump_xcoff32_file_header (bfd *abfd, struct external_filehdr *fhdr,
- struct xcoff_dump *data)
-{
- unsigned int timdat = bfd_h_get_32 (abfd, fhdr->f_timdat);
- unsigned short flags = bfd_h_get_16 (abfd, fhdr->f_flags);
-
- printf (_(" nbr sections: %d\n"), data->nscns);
- printf (_(" time and date: 0x%08x - "), timdat);
- if (timdat == 0)
- printf (_("not set\n"));
- else
- {
- /* Not correct on all platforms, but works on unix. */
- time_t t = timdat;
- fputs (ctime (&t), stdout);
- }
- printf (_(" symbols off: 0x%08x\n"), data->symptr);
- printf (_(" nbr symbols: %d\n"), data->nsyms);
- printf (_(" opt hdr sz: %d\n"), data->opthdr);
- printf (_(" flags: 0x%04x "), flags);
- dump_flags (f_flag_xlat, flags);
- putchar ('\n');
-}
-
-/* Dump the a.out header. */
-
-static void
-dump_xcoff32_aout_header (bfd *abfd, struct xcoff_dump *data)
-{
- AOUTHDR auxhdr;
- unsigned short magic;
- unsigned int sz = data->opthdr;
-
- printf (_("Auxiliary header:\n"));
- if (data->opthdr == 0)
- {
- printf (_(" No aux header\n"));
- return;
- }
- if (data->opthdr > sizeof (auxhdr))
- {
- printf (_("warning: optional header size too large (> %d)\n"),
- (int)sizeof (auxhdr));
- sz = sizeof (auxhdr);
- }
- if (bfd_bread (&auxhdr, sz, abfd) != sz)
- {
- non_fatal (_("cannot read auxhdr"));
- return;
- }
-
- magic = bfd_h_get_16 (abfd, auxhdr.magic);
- /* We don't translate these strings as they are fields name. */
- printf (" o_mflag (magic): 0x%04x 0%04o\n", magic, magic);
- printf (" o_vstamp: 0x%04x\n",
- (unsigned short)bfd_h_get_16 (abfd, auxhdr.vstamp));
- printf (" o_tsize: 0x%08x\n",
- (unsigned int)bfd_h_get_32 (abfd, auxhdr.tsize));
- printf (" o_dsize: 0x%08x\n",
- (unsigned int)bfd_h_get_32 (abfd, auxhdr.dsize));
- printf (" o_entry: 0x%08x\n",
- (unsigned int)bfd_h_get_32 (abfd, auxhdr.entry));
- printf (" o_text_start: 0x%08x\n",
- (unsigned int)bfd_h_get_32 (abfd, auxhdr.text_start));
- printf (" o_data_start: 0x%08x\n",
- (unsigned int)bfd_h_get_32 (abfd, auxhdr.data_start));
- if (sz == offsetof (AOUTHDR, o_toc))
- return;
- printf (" o_toc: 0x%08x\n",
- (unsigned int)bfd_h_get_32 (abfd, auxhdr.o_toc));
- printf (" o_snentry: 0x%04x\n",
- (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_snentry));
- printf (" o_sntext: 0x%04x\n",
- (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_sntext));
- printf (" o_sndata: 0x%04x\n",
- (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_sndata));
- printf (" o_sntoc: 0x%04x\n",
- (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_sntoc));
- printf (" o_snloader: 0x%04x\n",
- (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_snloader));
- printf (" o_snbss: 0x%04x\n",
- (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_snbss));
- printf (" o_algntext: %u\n",
- (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_algntext));
- printf (" o_algndata: %u\n",
- (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_algndata));
- printf (" o_modtype: 0x%04x",
- (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_modtype));
- if (ISPRINT (auxhdr.o_modtype[0]) && ISPRINT (auxhdr.o_modtype[1]))
- printf (" (%c%c)", auxhdr.o_modtype[0], auxhdr.o_modtype[1]);
- putchar ('\n');
- printf (" o_cputype: 0x%04x\n",
- (unsigned int)bfd_h_get_16 (abfd, auxhdr.o_cputype));
- printf (" o_maxstack: 0x%08x\n",
- (unsigned int)bfd_h_get_32 (abfd, auxhdr.o_maxstack));
- printf (" o_maxdata: 0x%08x\n",
- (unsigned int)bfd_h_get_32 (abfd, auxhdr.o_maxdata));
-#if 0
- printf (" o_debugger: 0x%08x\n",
- (unsigned int)bfd_h_get_32 (abfd, auxhdr.o_debugger));
-#endif
-}
-
-/* Dump the sections header. */
-
-static void
-dump_xcoff32_sections_header (bfd *abfd, struct xcoff_dump *data)
-{
- unsigned int i;
- unsigned int off;
-
- off = sizeof (struct external_filehdr) + data->opthdr;
- printf (_("Section headers (at %u+%u=0x%08x to 0x%08x):\n"),
- (unsigned int)sizeof (struct external_filehdr), data->opthdr, off,
- off + (unsigned int)sizeof (struct external_scnhdr) * data->nscns);
- if (data->nscns == 0)
- {
- printf (_(" No section header\n"));
- return;
- }
- if (bfd_seek (abfd, off, SEEK_SET) != 0)
- {
- non_fatal (_("cannot read section header"));
- return;
- }
- /* We don't translate this string as it consists in fields name. */
- printf (" # Name paddr vaddr size scnptr relptr lnnoptr nrel nlnno\n");
- for (i = 0; i < data->nscns; i++)
- {
- struct external_scnhdr scn;
- unsigned int flags;
-
- if (bfd_bread (&scn, sizeof (scn), abfd) != sizeof (scn))
- {
- non_fatal (_("cannot read section header"));
- return;
- }
- flags = bfd_h_get_32 (abfd, scn.s_flags);
- printf ("%2d %-8.8s %08x %08x %08x %08x %08x %08x %-5d %-5d\n",
- i + 1, scn.s_name,
- (unsigned int)bfd_h_get_32 (abfd, scn.s_paddr),
- (unsigned int)bfd_h_get_32 (abfd, scn.s_vaddr),
- (unsigned int)bfd_h_get_32 (abfd, scn.s_size),
- (unsigned int)bfd_h_get_32 (abfd, scn.s_scnptr),
- (unsigned int)bfd_h_get_32 (abfd, scn.s_relptr),
- (unsigned int)bfd_h_get_32 (abfd, scn.s_lnnoptr),
- (unsigned int)bfd_h_get_16 (abfd, scn.s_nreloc),
- (unsigned int)bfd_h_get_16 (abfd, scn.s_nlnno));
- printf (_(" Flags: %08x "), flags);
-
- if (~flags == 0)
- {
- /* Stripped executable ? */
- putchar ('\n');
- }
- else if (flags & STYP_OVRFLO)
- printf (_("overflow - nreloc: %u, nlnno: %u\n"),
- (unsigned int)bfd_h_get_32 (abfd, scn.s_paddr),
- (unsigned int)bfd_h_get_32 (abfd, scn.s_vaddr));
- else
- {
- dump_flags (s_flag_xlat, flags);
- putchar ('\n');
- }
- }
-}
-
-/* Read section table. */
-
-static void
-xcoff32_read_sections (bfd *abfd, struct xcoff_dump *data)
-{
- int i;
-
- if (bfd_seek (abfd, sizeof (struct external_filehdr) + data->opthdr,
- SEEK_SET) != 0)
- {
- non_fatal (_("cannot read section headers"));
- return;
- }
-
- data->sects = xmalloc (data->nscns * sizeof (struct xcoff32_section));
- for (i = 0; i < data->nscns; i++)
- {
- struct external_scnhdr scn;
- struct xcoff32_section *s = &data->sects[i];
-
- if (bfd_bread (&scn, sizeof (scn), abfd) != sizeof (scn))
- {
- non_fatal (_("cannot read section header"));
- free (data->sects);
- data->sects = NULL;
- return;
- }
- memcpy (s->name, scn.s_name, 8);
- s->name[8] = 0;
- s->flags = bfd_h_get_32 (abfd, scn.s_flags);
-
- s->scnptr = bfd_h_get_32 (abfd, scn.s_scnptr);
- s->relptr = bfd_h_get_32 (abfd, scn.s_relptr);
- s->lnnoptr = bfd_h_get_32 (abfd, scn.s_lnnoptr);
-
- s->nreloc = bfd_h_get_16 (abfd, scn.s_nreloc);
- s->nlnno = bfd_h_get_16 (abfd, scn.s_nlnno);
-
- if (s->flags == STYP_OVRFLO)
- {
- if (s->nreloc > 0 && s->nreloc <= data->nscns)
- data->sects[s->nreloc - 1].nreloc =
- bfd_h_get_32 (abfd, scn.s_paddr);
- if (s->nlnno > 0 && s->nlnno <= data->nscns)
- data->sects[s->nlnno - 1].nlnno =
- bfd_h_get_32 (abfd, scn.s_vaddr);
- }
- }
-}
-
-/* Read symbols. */
-
-static void
-xcoff32_read_symbols (bfd *abfd, struct xcoff_dump *data)
-{
- unsigned int i;
- char stsz_arr[4];
- unsigned int stptr;
-
- if (data->nsyms == 0)
- return;
-
- stptr = data->symptr
- + data->nsyms * (unsigned)sizeof (struct external_syment);
-
- /* Read string table. */
- if (bfd_seek (abfd, stptr, SEEK_SET) != 0
- || bfd_bread (&stsz_arr, sizeof (stsz_arr), abfd) != sizeof (stsz_arr))
- {
- non_fatal (_("cannot read strings table length"));
- data->strings_size = 0;
- }
- else
- {
- data->strings_size = bfd_h_get_32 (abfd, stsz_arr);
- if (data->strings_size > sizeof (stsz_arr))
- {
- unsigned int remsz = data->strings_size - sizeof (stsz_arr);
-
- data->strings = xmalloc (data->strings_size);
-
- memcpy (data->strings, stsz_arr, sizeof (stsz_arr));
- if (bfd_bread (data->strings + sizeof (stsz_arr), remsz, abfd)
- != remsz)
- {
- non_fatal (_("cannot read strings table"));
- goto clean;
- }
- }
- }
-
- if (bfd_seek (abfd, data->symptr, SEEK_SET) != 0)
- {
- non_fatal (_("cannot read symbol table"));
- goto clean;
- }
-
- data->syms = (union xcoff32_symbol *)
- xmalloc (data->nsyms * sizeof (union xcoff32_symbol));
-
- for (i = 0; i < data->nsyms; i++)
- {
- struct external_syment sym;
- int j;
- union xcoff32_symbol *s = &data->syms[i];
-
- if (bfd_bread (&sym, sizeof (sym), abfd) != sizeof (sym))
- {
- non_fatal (_("cannot read symbol entry"));
- goto clean;
- }
-
- s->sym.val = bfd_h_get_32 (abfd, sym.e_value);
- s->sym.scnum = bfd_h_get_16 (abfd, sym.e_scnum);
- s->sym.ntype = bfd_h_get_16 (abfd, sym.e_type);
- s->sym.sclass = bfd_h_get_8 (abfd, sym.e_sclass);
- s->sym.numaux = bfd_h_get_8 (abfd, sym.e_numaux);
-
- if (sym.e.e_name[0])
- {
- memcpy (s->sym.raw.name, sym.e.e_name, sizeof (sym.e.e_name));
- s->sym.raw.name[8] = 0;
- s->sym.name = s->sym.raw.name;
- }
- else
- {
- unsigned int soff = bfd_h_get_32 (abfd, sym.e.e.e_offset);
-
- if ((s->sym.sclass & DBXMASK) == 0 && soff < data->strings_size)
- s->sym.name = data->strings + soff;
- else
- {
- s->sym.name = NULL;
- s->sym.raw.off = soff;
- }
- }
-
- for (j = 0; j < s->sym.numaux; j++, i++)
- {
- if (bfd_bread (&s[j + 1].aux,
- sizeof (union external_auxent), abfd)
- != sizeof (union external_auxent))
- {
- non_fatal (_("cannot read symbol aux entry"));
- goto clean;
- }
- }
- }
- return;
- clean:
- free (data->syms);
- data->syms = NULL;
- free (data->strings);
- data->strings = NULL;
-}
-
-/* Dump xcoff symbols. */
-
-static void
-dump_xcoff32_symbols (bfd *abfd, struct xcoff_dump *data)
-{
- unsigned int i;
- asection *debugsec;
- char *debug = NULL;
-
- printf (_("Symbols table (strtable at 0x%08x)"),
- data->symptr
- + data->nsyms * (unsigned)sizeof (struct external_syment));
- if (data->nsyms == 0 || data->syms == NULL)
- {
- printf (_(":\n No symbols\n"));
- return;
- }
-
- /* Read strings table. */
- if (data->strings_size == 0)
- printf (_(" (no strings):\n"));
- else
- printf (_(" (strings size: %08x):\n"), data->strings_size);
-
- /* Read debug section. */
- debugsec = bfd_get_section_by_name (abfd, ".debug");
- if (debugsec != NULL)
- {
- bfd_size_type size;
-
- size = bfd_get_section_size (debugsec);
- debug = (char *) xmalloc (size);
- bfd_get_section_contents (abfd, debugsec, debug, 0, size);
- }
-
- /* Translators: 'sc' is for storage class, 'off' for offset. */
- printf (_(" # sc value section type aux name/off\n"));
- for (i = 0; i < data->nsyms; i++)
- {
- union xcoff32_symbol *s = &data->syms[i];
- int j;
-
- printf ("%3u ", i);
- dump_value (sc_xlat, s->sym.sclass, 10);
- printf (" %08x ", s->sym.val);
- if (s->sym.scnum > 0 && s->sym.scnum <= data->nscns)
- {
- if (data->sects != NULL)
- printf ("%-8s", data->sects[s->sym.scnum - 1].name);
- else
- printf ("%-8u", s->sym.scnum);
- }
- else
- switch ((signed short)s->sym.scnum)
- {
- case N_DEBUG:
- printf ("N_DEBUG ");
- break;
- case N_ABS:
- printf ("N_ABS ");
- break;
- case N_UNDEF:
- printf ("N_UNDEF ");
- break;
- default:
- printf ("(%04x) ", s->sym.scnum);
- }
- printf (" %04x %3u ", s->sym.ntype, s->sym.numaux);
- if (s->sym.name != NULL)
- printf ("%s", s->sym.name);
- else
- {
- if ((s->sym.sclass & DBXMASK) != 0 && debug != NULL)
- printf ("%s", debug + s->sym.raw.off);
- else
- printf ("%08x", s->sym.raw.off);
- }
- putchar ('\n');
-
- for (j = 0; j < s->sym.numaux; j++, i++)
- {
- union external_auxent *aux = &s[j + 1].aux;
-
- printf (" %3u ", i + 1);
- switch (s->sym.sclass)
- {
- case C_STAT:
- /* Section length, number of relocs and line number. */
- printf (_(" scnlen: %08x nreloc: %-6u nlinno: %-6u\n"),
- (unsigned)bfd_h_get_32 (abfd, aux->x_scn.x_scnlen),
- (unsigned)bfd_h_get_16 (abfd, aux->x_scn.x_nreloc),
- (unsigned)bfd_h_get_16 (abfd, aux->x_scn.x_nlinno));
- break;
- case C_DWARF:
- /* Section length and number of relocs. */
- printf (_(" scnlen: %08x nreloc: %-6u\n"),
- (unsigned)bfd_h_get_32 (abfd, aux->x_scn.x_scnlen),
- (unsigned)bfd_h_get_16 (abfd, aux->x_scn.x_nreloc));
- break;
- case C_EXT:
- case C_WEAKEXT:
- case C_HIDEXT:
- if (j == 0 && s->sym.numaux > 1)
- {
- /* Function aux entry (Do not translate). */
- printf (" exptr: %08x fsize: %08x lnnoptr: %08x endndx: %u\n",
- (unsigned)bfd_h_get_32 (abfd, aux->x_sym.x_tagndx),
- (unsigned)bfd_h_get_32
- (abfd, aux->x_sym.x_misc.x_fsize),
- (unsigned)bfd_h_get_32
- (abfd, aux->x_sym.x_fcnary.x_fcn.x_lnnoptr),
- (unsigned)bfd_h_get_32
- (abfd, aux->x_sym.x_fcnary.x_fcn.x_endndx));
- }
- else if (j == 1 || (j == 0 && s->sym.numaux == 1))
- {
- /* csect aux entry. */
- unsigned char smtyp;
- unsigned int scnlen;
-
- smtyp = bfd_h_get_8 (abfd, aux->x_csect.x_smtyp);
- scnlen = bfd_h_get_32 (abfd, aux->x_csect.x_scnlen);
-
- if (smtyp == XTY_LD)
- printf (" scnsym: %-8u", scnlen);
- else
- printf (" scnlen: %08x", scnlen);
- printf (" h: parm=%08x sn=%04x al: 2**%u",
- (unsigned)bfd_h_get_32 (abfd, aux->x_csect.x_parmhash),
- (unsigned)bfd_h_get_16 (abfd, aux->x_csect.x_snhash),
- SMTYP_ALIGN (smtyp));
- printf (" typ: ");
- dump_value (smtyp_xlat, SMTYP_SMTYP (smtyp), 2);
- printf (" cl: ");
- dump_value
- (smclas_xlat,
- (unsigned)bfd_h_get_8 (abfd, aux->x_csect.x_smclas), 6);
- putchar ('\n');
- }
- else
- /* Do not translate - generic field name. */
- printf ("aux\n");
- break;
- case C_FILE:
- {
- unsigned int off;
-
- printf (" ftype: %02x ",
- (unsigned)bfd_h_get_8 (abfd, aux->x_file.x_ftype));
- if (aux->x_file.x_n.x_fname[0] != 0)
- printf ("fname: %.14s", aux->x_file.x_n.x_fname);
- else
- {
- off = (unsigned)bfd_h_get_32
- (abfd, aux->x_file.x_n.x_n.x_offset);
- if (data->strings != NULL && off < data->strings_size)
- printf (" %s", data->strings + off);
- else
- printf (_("offset: %08x"), off);
- }
- putchar ('\n');
- }
- break;
- case C_BLOCK:
- case C_FCN:
- printf (" lnno: %u\n",
- (unsigned)bfd_h_get_16
- (abfd, aux->x_sym.x_misc.x_lnsz.x_lnno));
- break;
- default:
- /* Do not translate - generic field name. */
- printf ("aux\n");
- break;
- }
- }
-
- }
- free (debug);
-}
-
-/* Dump xcoff relocation entries. */
-
-static void
-dump_xcoff32_relocs (bfd *abfd, struct xcoff_dump *data)
-{
- unsigned int i;
-
- if (data->sects == NULL)
- {
- non_fatal (_("cannot read section headers"));
- return;
- }
-
- for (i = 0; i < data->nscns; i++)
- {
- struct xcoff32_section *sect = &data->sects[i];
- unsigned int nrel = sect->nreloc;
- unsigned int j;
-
- if (nrel == 0)
- continue;
- printf (_("Relocations for %s (%u)\n"), sect->name, nrel);
- if (bfd_seek (abfd, sect->relptr, SEEK_SET) != 0)
- {
- non_fatal (_("cannot read relocations"));
- continue;
- }
- /* Do not translate: fields name. */
- printf ("vaddr sgn mod sz type symndx symbol\n");
- for (j = 0; j < nrel; j++)
- {
- struct external_reloc rel;
- unsigned char rsize;
- unsigned int symndx;
-
- if (bfd_bread (&rel, sizeof (rel), abfd) != sizeof (rel))
- {
- non_fatal (_("cannot read relocation entry"));
- return;
- }
- rsize = bfd_h_get_8 (abfd, rel.r_size);
- printf ("%08x %c %c %-2u ",
- (unsigned int)bfd_h_get_32 (abfd, rel.r_vaddr),
- rsize & 0x80 ? 'S' : 'U',
- rsize & 0x40 ? 'm' : ' ',
- (rsize & 0x3f) + 1);
- dump_value (rtype_xlat, bfd_h_get_8 (abfd, rel.r_type), 6);
- symndx = bfd_h_get_32 (abfd, rel.r_symndx);
- printf ("%-6u ", symndx);
- xcoff32_print_symbol (data, symndx);
- putchar ('\n');
- }
- putchar ('\n');
- }
-}
-
-/* Dump xcoff line number entries. */
-
-static void
-dump_xcoff32_lineno (bfd *abfd, struct xcoff_dump *data)
-{
- unsigned int i;
-
- if (data->sects == NULL)
- {
- non_fatal (_("cannot read section headers"));
- return;
- }
-
- for (i = 0; i < data->nscns; i++)
- {
- struct xcoff32_section *sect = &data->sects[i];
- unsigned int nlnno = sect->nlnno;
- unsigned int j;
-
- if (nlnno == 0)
- continue;
- printf (_("Line numbers for %s (%u)\n"), sect->name, nlnno);
- if (bfd_seek (abfd, sect->lnnoptr, SEEK_SET) != 0)
- {
- non_fatal (_("cannot read line numbers"));
- continue;
- }
- /* Line number, symbol index and physical address. */
- printf (_("lineno symndx/paddr\n"));
- for (j = 0; j < nlnno; j++)
- {
- struct external_lineno ln;
- unsigned int no;
-
- if (bfd_bread (&ln, sizeof (ln), abfd) != sizeof (ln))
- {
- non_fatal (_("cannot read line number entry"));
- return;
- }
- no = bfd_h_get_16 (abfd, ln.l_lnno);
- printf (" %-6u ", no);
- if (no == 0)
- {
- unsigned int symndx = bfd_h_get_32 (abfd, ln.l_addr.l_symndx);
- xcoff32_print_symbol (data, symndx);
- }
- else
- printf ("0x%08x",
- (unsigned int)bfd_h_get_32 (abfd, ln.l_addr.l_paddr));
- putchar ('\n');
- }
- }
-}
-
-/* Dump xcoff loader section. */
-
-static void
-dump_xcoff32_loader (bfd *abfd)
-{
- asection *loader;
- bfd_size_type size = 0;
- struct external_ldhdr *lhdr;
- struct external_ldsym *ldsym;
- struct external_ldrel *ldrel;
- bfd_byte *ldr_data;
- unsigned int version;
- unsigned int ndsyms;
- unsigned int ndrel;
- unsigned int stlen;
- unsigned int stoff;
- unsigned int impoff;
- unsigned int nimpid;
- unsigned int i;
- const char *p;
-
- loader = bfd_get_section_by_name (abfd, ".loader");
-
- if (loader == NULL)
- {
- printf (_("no .loader section in file\n"));
- return;
- }
- size = bfd_get_section_size (loader);
- if (size < sizeof (*lhdr))
- {
- printf (_("section .loader is too short\n"));
- return;
- }
-
- ldr_data = (bfd_byte *) xmalloc (size);
- bfd_get_section_contents (abfd, loader, ldr_data, 0, size);
- lhdr = (struct external_ldhdr *)ldr_data;
- printf (_("Loader header:\n"));
- version = bfd_h_get_32 (abfd, lhdr->l_version);
- printf (_(" version: %u\n"), version);
- if (version != 1)
- {
- printf (_(" Unhandled version\n"));
- free (ldr_data);
- return;
- }
- ndsyms = bfd_h_get_32 (abfd, lhdr->l_nsyms);
- printf (_(" nbr symbols: %u\n"), ndsyms);
- ndrel = bfd_h_get_32 (abfd, lhdr->l_nreloc);
- printf (_(" nbr relocs: %u\n"), ndrel);
- /* Import string table length. */
- printf (_(" import strtab len: %u\n"),
- (unsigned) bfd_h_get_32 (abfd, lhdr->l_istlen));
- nimpid = bfd_h_get_32 (abfd, lhdr->l_nimpid);
- printf (_(" nbr import files: %u\n"), nimpid);
- impoff = bfd_h_get_32 (abfd, lhdr->l_impoff);
- printf (_(" import file off: %u\n"), impoff);
- stlen = bfd_h_get_32 (abfd, lhdr->l_stlen);
- printf (_(" string table len: %u\n"), stlen);
- stoff = bfd_h_get_32 (abfd, lhdr->l_stoff);
- printf (_(" string table off: %u\n"), stoff);
-
- ldsym = (struct external_ldsym *)(ldr_data + sizeof (*lhdr));
- printf (_("Dynamic symbols:\n"));
- /* Do not translate: field names. */
- printf (" # value sc IFEW ty class file pa name\n");
- for (i = 0; i < ndsyms; i++, ldsym++)
- {
- unsigned char smtype;
-
- printf (_(" %4u %08x %3u "), i,
- (unsigned)bfd_h_get_32 (abfd, ldsym->l_value),
- (unsigned)bfd_h_get_16 (abfd, ldsym->l_scnum));
- smtype = bfd_h_get_8 (abfd, ldsym->l_smtype);
- putchar (smtype & 0x40 ? 'I' : ' ');
- putchar (smtype & 0x20 ? 'F' : ' ');
- putchar (smtype & 0x10 ? 'E' : ' ');
- putchar (smtype & 0x08 ? 'W' : ' ');
- putchar (' ');
- dump_value (smtyp_xlat, SMTYP_SMTYP (smtype), 2);
- putchar (' ');
- dump_value
- (smclas_xlat, (unsigned)bfd_h_get_8 (abfd, ldsym->l_smclas), 6);
- printf (_(" %3u %3u "),
- (unsigned)bfd_h_get_32 (abfd, ldsym->l_ifile),
- (unsigned)bfd_h_get_32 (abfd, ldsym->l_parm));
- if (ldsym->_l._l_name[0] != 0)
- printf ("%-.8s", ldsym->_l._l_name);
- else
- {
- unsigned int off = bfd_h_get_32 (abfd, ldsym->_l._l_l._l_offset);
- if (off > stlen)
- printf (_("(bad offset: %u)"), off);
- else
- printf ("%s", ldr_data + stoff + off);
- }
- putchar ('\n');
- }
-
- printf (_("Dynamic relocs:\n"));
- /* Do not translate fields name. */
- printf (" vaddr sec sz typ sym\n");
- ldrel = (struct external_ldrel *)(ldr_data + sizeof (*lhdr)
- + ndsyms * sizeof (*ldsym));
- for (i = 0; i < ndrel; i++, ldrel++)
- {
- unsigned int rsize;
- unsigned int rtype;
- unsigned int symndx;
-
- rsize = bfd_h_get_8 (abfd, ldrel->l_rtype + 0);
- rtype = bfd_h_get_8 (abfd, ldrel->l_rtype + 1);
-
- printf (" %08x %3u %c%c %2u ",
- (unsigned)bfd_h_get_32 (abfd, ldrel->l_vaddr),
- (unsigned)bfd_h_get_16 (abfd, ldrel->l_rsecnm),
- rsize & 0x80 ? 'S' : 'U',
- rsize & 0x40 ? 'm' : ' ',
- (rsize & 0x3f) + 1);
- dump_value (rtype_xlat, rtype, 6);
- symndx = bfd_h_get_32 (abfd, ldrel->l_symndx);
- switch (symndx)
- {
- case 0:
- printf (".text");
- break;
- case 1:
- printf (".data");
- break;
- case 2:
- printf (".bss");
- break;
- default:
- printf ("%u", symndx - 3);
- break;
- }
- putchar ('\n');
- }
-
- printf (_("Import files:\n"));
- p = (char *)ldr_data + impoff;
- for (i = 0; i < nimpid; i++)
- {
- int n1, n2, n3;
-
- n1 = strlen (p);
- n2 = strlen (p + n1 + 1);
- n3 = strlen (p + n1 + 1 + n2+ 1);
- printf (" %2u: %s,%s,%s\n", i,
- p, p + n1 + 1, p + n1 + n2 + 2);
- p += n1 + n2 + n3 + 3;
- }
-
- free (ldr_data);
-}
-
-/* Dump xcoff exception section. */
-
-static void
-dump_xcoff32_except (bfd *abfd, struct xcoff_dump *data)
-{
- asection *sec;
- bfd_size_type size = 0;
- bfd_byte *excp_data;
- struct external_exceptab *exceptab;
- unsigned int i;
-
- sec = bfd_get_section_by_name (abfd, ".except");
-
- if (sec == NULL)
- {
- printf (_("no .except section in file\n"));
- return;
- }
- size = bfd_get_section_size (sec);
- excp_data = (bfd_byte *) xmalloc (size);
- bfd_get_section_contents (abfd, sec, excp_data, 0, size);
- exceptab = (struct external_exceptab *)excp_data;
-
- printf (_("Exception table:\n"));
- /* Do not translate fields name. */
- printf ("lang reason sym/addr\n");
- for (i = 0; i * sizeof (*exceptab) < size; i++, exceptab++)
- {
- unsigned int reason;
- unsigned int addr;
-
- addr = bfd_get_32 (abfd, exceptab->e_addr.e_paddr);
- reason = bfd_get_8 (abfd, exceptab->e_reason);
- printf (" %02x %02x ",
- (unsigned) bfd_get_8 (abfd, exceptab->e_lang), reason);
- if (reason == 0)
- xcoff32_print_symbol (data, addr);
- else
- printf ("@%08x", addr);
- putchar ('\n');
- }
- free (excp_data);
-}
-
-/* Dump xcoff type-check section. */
-
-static void
-dump_xcoff32_typchk (bfd *abfd)
-{
- asection *sec;
- bfd_size_type size = 0;
- bfd_byte *data;
- unsigned int i;
-
- sec = bfd_get_section_by_name (abfd, ".typchk");
-
- if (sec == NULL)
- {
- printf (_("no .typchk section in file\n"));
- return;
- }
- size = bfd_get_section_size (sec);
- data = (bfd_byte *) xmalloc (size);
- bfd_get_section_contents (abfd, sec, data, 0, size);
-
- printf (_("Type-check section:\n"));
- /* Do not translate field names. */
- printf ("offset len lang-id general-hash language-hash\n");
- for (i = 0; i < size;)
- {
- unsigned int len;
-
- len = bfd_get_16 (abfd, data + i);
- printf ("%08x: %-4u ", i, len);
- i += 2;
-
- if (len == 10)
- {
- /* Expected format. */
- printf ("%04x %08x %08x\n",
- (unsigned) bfd_get_16 (abfd, data + i),
- (unsigned) bfd_get_32 (abfd, data + i + 2),
- (unsigned) bfd_get_32 (abfd, data + i + 2 + 4));
- }
- else
- {
- unsigned int j;
-
- for (j = 0; j < len; j++)
- {
- if (j % 16 == 0)
- printf ("\n ");
- printf (" %02x", (unsigned char)data[i + j]);
- }
- putchar ('\n');
- }
- i += len;
- }
- free (data);
-}
-
-/* Dump xcoff traceback tags section. */
-
-static void
-dump_xcoff32_tbtags (bfd *abfd,
- const char *text, bfd_size_type text_size,
- unsigned int text_start, unsigned int func_start)
-{
- unsigned int i;
-
- if (func_start - text_start > text_size)
- {
- printf (_(" address beyond section size\n"));
- return;
- }
- for (i = func_start - text_start; i < text_size; i+= 4)
- if (bfd_get_32 (abfd, text + i) == 0)
- {
- unsigned int tb1;
- unsigned int tb2;
- unsigned int off;
-
- printf (_(" tags at %08x\n"), i + 4);
- if (i + 8 >= text_size)
- goto truncated;
-
- tb1 = bfd_get_32 (abfd, text + i + 4);
- tb2 = bfd_get_32 (abfd, text + i + 8);
- off = i + 12;
- printf (" version: %u, lang: %u, global_link: %u, is_eprol: %u, has_tboff: %u, int_proc: %u\n",
- (tb1 >> 24) & 0xff,
- (tb1 >> 16) & 0xff,
- (tb1 >> 15) & 1,
- (tb1 >> 14) & 1,
- (tb1 >> 13) & 1,
- (tb1 >> 12) & 1);
- printf (" has_ctl: %u, tocless: %u, fp_pres: %u, log_abort: %u, int_hndl: %u\n",
- (tb1 >> 11) & 1,
- (tb1 >> 10) & 1,
- (tb1 >> 9) & 1,
- (tb1 >> 8) & 1,
- (tb1 >> 7) & 1);
- printf (" name_pres: %u, uses_alloca: %u, cl_dis_inv: %u, saves_cr: %u, saves_lr: %u\n",
- (tb1 >> 6) & 1,
- (tb1 >> 5) & 1,
- (tb1 >> 2) & 7,
- (tb1 >> 1) & 1,
- (tb1 >> 0) & 1);
- printf (" stores_bc: %u, fixup: %u, fpr_saved: %-2u, spare3: %u, gpr_saved: %-2u\n",
- (tb2 >> 31) & 1,
- (tb2 >> 30) & 1,
- (tb2 >> 24) & 63,
- (tb2 >> 22) & 3,
- (tb2 >> 16) & 63);
- printf (" fixparms: %-3u floatparms: %-3u parm_on_stk: %u\n",
- (tb2 >> 8) & 0xff,
- (tb2 >> 1) & 0x7f,
- (tb2 >> 0) & 1);
-
- if (((tb2 >> 1) & 0x7fff) != 0)
- {
- unsigned int parminfo;
-
- if (off >= text_size)
- goto truncated;
- parminfo = bfd_get_32 (abfd, text + off);
- off += 4;
- printf (" parminfo: 0x%08x\n", parminfo);
- }
-
- if ((tb1 >> 13) & 1)
- {
- unsigned int tboff;
-
- if (off >= text_size)
- goto truncated;
- tboff = bfd_get_32 (abfd, text + off);
- off += 4;
- printf (" tb_offset: 0x%08x (start=0x%08x)\n",
- tboff, text_start + i - tboff);
- }
- if ((tb1 >> 7) & 1)
- {
- unsigned int hand_mask;
-
- if (off >= text_size)
- goto truncated;
- hand_mask = bfd_get_32 (abfd, text + off);
- off += 4;
- printf (" hand_mask_offset: 0x%08x\n", hand_mask);
- }
- if ((tb1 >> 11) & 1)
- {
- unsigned int ctl_info;
- unsigned int j;
-
- if (off >= text_size)
- goto truncated;
- ctl_info = bfd_get_32 (abfd, text + off);
- off += 4;
- printf (_(" number of CTL anchors: %u\n"), ctl_info);
- for (j = 0; j < ctl_info; j++)
- {
- if (off >= text_size)
- goto truncated;
- printf (" CTL[%u]: %08x\n",
- j, (unsigned)bfd_get_32 (abfd, text + off));
- off += 4;
- }
- }
- if ((tb1 >> 6) & 1)
- {
- unsigned int name_len;
- unsigned int j;
-
- if (off >= text_size)
- goto truncated;
- name_len = bfd_get_16 (abfd, text + off);
- off += 2;
- printf (_(" Name (len: %u): "), name_len);
- if (off + name_len >= text_size)
- {
- printf (_("[truncated]\n"));
- goto truncated;
- }
- for (j = 0; j < name_len; j++)
- if (ISPRINT (text[off + j]))
- putchar (text[off + j]);
- else
- printf ("[%02x]", (unsigned char)text[off + j]);
- putchar ('\n');
- off += name_len;
- }
- if ((tb1 >> 5) & 1)
- {
- if (off >= text_size)
- goto truncated;
- printf (" alloca reg: %u\n",
- (unsigned) bfd_get_8 (abfd, text + off));
- off++;
- }
- printf (_(" (end of tags at %08x)\n"), text_start + off);
- return;
- }
- printf (_(" no tags found\n"));
- return;
-
- truncated:
- printf (_(" Truncated .text section\n"));
- return;
-}
-
-static void
-dump_xcoff32_traceback (bfd *abfd, struct xcoff_dump *data)
-{
- unsigned int i;
- unsigned int scnum_text = -1;
- unsigned int text_vma;
- asection *text_sec;
- bfd_size_type text_size;
- char *text;
-
- if (data->syms == NULL || data->sects == NULL)
- return;
-
- /* Read text section. */
- text_sec = bfd_get_section_by_name (abfd, ".text");
- if (text_sec == NULL)
- return;
- text_vma = bfd_get_section_vma (abfd, text_sec);
-
- text_size = bfd_get_section_size (text_sec);
- text = (char *) xmalloc (text_size);
- bfd_get_section_contents (abfd, text_sec, text, 0, text_size);
-
- for (i = 0; i < data->nscns; i++)
- if (data->sects[i].flags == STYP_TEXT)
- {
- scnum_text = i + 1;
- break;
- }
- if (scnum_text == (unsigned int)-1)
- return;
-
- for (i = 0; i < data->nsyms; i++)
- {
- union xcoff32_symbol *s = &data->syms[i];
-
- switch (s->sym.sclass)
- {
- case C_EXT:
- case C_HIDEXT:
- case C_WEAKEXT:
- if (s->sym.scnum == scnum_text
- && s->sym.numaux > 0)
- {
- union external_auxent *aux = &s[s->sym.numaux].aux;
-
- unsigned int smtyp;
- unsigned int smclas;
-
- smtyp = bfd_h_get_8 (abfd, aux->x_csect.x_smtyp);
- smclas = bfd_h_get_8 (abfd, aux->x_csect.x_smclas);
- if (SMTYP_SMTYP (smtyp) == XTY_LD
- && (smclas == XMC_PR
- || smclas == XMC_GL
- || smclas == XMC_XO))
- {
- printf ("%08x: ", s->sym.val);
- xcoff32_print_symbol (data, i);
- putchar ('\n');
- dump_xcoff32_tbtags (abfd, text, text_size,
- text_vma, s->sym.val);
- }
- }
- break;
- default:
- break;
- }
- i += s->sym.numaux;
- }
- free (text);
-}
-
-/* Dump the TOC symbols. */
-
-static void
-dump_xcoff32_toc (bfd *abfd, struct xcoff_dump *data)
-{
- unsigned int i;
- unsigned int nbr_ent;
- unsigned int size;
-
- printf (_("TOC:\n"));
-
- if (data->syms == NULL)
- return;
-
- nbr_ent = 0;
- size = 0;
-
- for (i = 0; i < data->nsyms; i++)
- {
- union xcoff32_symbol *s = &data->syms[i];
-
- switch (s->sym.sclass)
- {
- case C_EXT:
- case C_HIDEXT:
- case C_WEAKEXT:
- if (s->sym.numaux > 0)
- {
- union external_auxent *aux = &s[s->sym.numaux].aux;
- unsigned int smclas;
- unsigned int ent_sz;
-
- smclas = bfd_h_get_8 (abfd, aux->x_csect.x_smclas);
- if (smclas == XMC_TC
- || smclas == XMC_TD
- || smclas == XMC_TC0)
- {
- ent_sz = bfd_h_get_32 (abfd, aux->x_scn.x_scnlen);
- printf ("%08x %08x ",
- s->sym.val, ent_sz);
- xcoff32_print_symbol (data, i);
- putchar ('\n');
- nbr_ent++;
- size += ent_sz;
- }
- }
- break;
- default:
- break;
- }
- i += s->sym.numaux;
- }
- printf (_("Nbr entries: %-8u Size: %08x (%u)\n"),
- nbr_ent, size, size);
-}
-
-/* Handle an rs6000 xcoff file. */
-
-static void
-dump_xcoff32 (bfd *abfd, struct external_filehdr *fhdr)
-{
- struct xcoff_dump data;
-
- data.nscns = bfd_h_get_16 (abfd, fhdr->f_nscns);
- data.symptr = bfd_h_get_32 (abfd, fhdr->f_symptr);
- data.nsyms = bfd_h_get_32 (abfd, fhdr->f_nsyms);
- data.opthdr = bfd_h_get_16 (abfd, fhdr->f_opthdr);
- data.sects = NULL;
- data.syms = NULL;
- data.strings = NULL;
- data.strings_size = 0;
-
- if (options[OPT_FILE_HEADER].selected)
- dump_xcoff32_file_header (abfd, fhdr, &data);
-
- if (options[OPT_AOUT].selected)
- dump_xcoff32_aout_header (abfd, &data);
-
- if (options[OPT_SYMS].selected
- || options[OPT_RELOCS].selected
- || options[OPT_LINENO].selected
- || options[OPT_TRACEBACK].selected)
- xcoff32_read_sections (abfd, &data);
-
- if (options[OPT_SECTIONS].selected)
- dump_xcoff32_sections_header (abfd, &data);
-
- if (options[OPT_SYMS].selected
- || options[OPT_RELOCS].selected
- || options[OPT_LINENO].selected
- || options[OPT_EXCEPT].selected
- || options[OPT_TRACEBACK].selected
- || options[OPT_TOC].selected)
- xcoff32_read_symbols (abfd, &data);
-
- if (options[OPT_SYMS].selected)
- dump_xcoff32_symbols (abfd, &data);
-
- if (options[OPT_RELOCS].selected)
- dump_xcoff32_relocs (abfd, &data);
-
- if (options[OPT_LINENO].selected)
- dump_xcoff32_lineno (abfd, &data);
-
- if (options[OPT_LOADER].selected)
- dump_xcoff32_loader (abfd);
-
- if (options[OPT_EXCEPT].selected)
- dump_xcoff32_except (abfd, &data);
-
- if (options[OPT_TYPCHK].selected)
- dump_xcoff32_typchk (abfd);
-
- if (options[OPT_TRACEBACK].selected)
- dump_xcoff32_traceback (abfd, &data);
-
- if (options[OPT_TOC].selected)
- dump_xcoff32_toc (abfd, &data);
-
- free (data.sects);
- free (data.strings);
- free (data.syms);
-}
-
-/* Dump ABFD (according to the options[] array). */
-
-static void
-xcoff_dump_obj (bfd *abfd)
-{
- struct external_filehdr fhdr;
- unsigned short magic;
-
- /* Read file header. */
- if (bfd_seek (abfd, 0, SEEK_SET) != 0
- || bfd_bread (&fhdr, sizeof (fhdr), abfd) != sizeof (fhdr))
- {
- non_fatal (_("cannot read header"));
- return;
- }
-
- /* Decoding. We don't use the bfd/coff function to get all the fields. */
- magic = bfd_h_get_16 (abfd, fhdr.f_magic);
- if (options[OPT_FILE_HEADER].selected)
- {
- printf (_("File header:\n"));
- printf (_(" magic: 0x%04x (0%04o) "), magic, magic);
- switch (magic)
- {
- case U802WRMAGIC:
- printf (_("(WRMAGIC: writable text segments)"));
- break;
- case U802ROMAGIC:
- printf (_("(ROMAGIC: readonly sharablee text segments)"));
- break;
- case U802TOCMAGIC:
- printf (_("(TOCMAGIC: readonly text segments and TOC)"));
- break;
- default:
- printf (_("unknown magic"));
- break;
- }
- putchar ('\n');
- }
- if (magic == U802ROMAGIC || magic == U802WRMAGIC || magic == U802TOCMAGIC)
- dump_xcoff32 (abfd, &fhdr);
- else
- printf (_(" Unhandled magic\n"));
-}
-
-/* Handle an AIX dumpx core file. */
-
-static void
-dump_dumpx_core (bfd *abfd, struct external_core_dumpx *hdr)
-{
- if (options[OPT_FILE_HEADER].selected)
- {
- printf (" signal: %u\n", bfd_h_get_8 (abfd, hdr->c_signo));
- printf (" flags: 0x%02x\n", bfd_h_get_8 (abfd, hdr->c_flag));
- printf (" entries: %u\n",
- (unsigned) bfd_h_get_16 (abfd, hdr->c_entries));
-#ifdef BFD64
- printf (" fdsinfox: offset: 0x%08" BFD_VMA_FMT "x\n",
- bfd_h_get_64 (abfd, hdr->c_fdsinfox));
- printf (" loader: offset: 0x%08" BFD_VMA_FMT "x, "
- "size: 0x%" BFD_VMA_FMT"x\n",
- bfd_h_get_64 (abfd, hdr->c_loader),
- bfd_h_get_64 (abfd, hdr->c_lsize));
- printf (" thr: offset: 0x%08" BFD_VMA_FMT "x, nbr: %u\n",
- bfd_h_get_64 (abfd, hdr->c_thr),
- (unsigned) bfd_h_get_32 (abfd, hdr->c_n_thr));
- printf (" segregions: offset: 0x%08" BFD_VMA_FMT "x, "
- "nbr: %" BFD_VMA_FMT "u\n",
- bfd_h_get_64 (abfd, hdr->c_segregion),
- bfd_h_get_64 (abfd, hdr->c_segs));
- printf (" stack: offset: 0x%08" BFD_VMA_FMT "x, "
- "org: 0x%" BFD_VMA_FMT"x, "
- "size: 0x%" BFD_VMA_FMT"x\n",
- bfd_h_get_64 (abfd, hdr->c_stack),
- bfd_h_get_64 (abfd, hdr->c_stackorg),
- bfd_h_get_64 (abfd, hdr->c_size));
- printf (" data: offset: 0x%08" BFD_VMA_FMT "x, "
- "org: 0x%" BFD_VMA_FMT"x, "
- "size: 0x%" BFD_VMA_FMT"x\n",
- bfd_h_get_64 (abfd, hdr->c_data),
- bfd_h_get_64 (abfd, hdr->c_dataorg),
- bfd_h_get_64 (abfd, hdr->c_datasize));
- printf (" sdata: org: 0x%" BFD_VMA_FMT"x, "
- "size: 0x%" BFD_VMA_FMT"x\n",
- bfd_h_get_64 (abfd, hdr->c_sdorg),
- bfd_h_get_64 (abfd, hdr->c_sdsize));
- printf (" vmmregions: offset: 0x%" BFD_VMA_FMT"x, "
- "num: 0x%" BFD_VMA_FMT"x\n",
- bfd_h_get_64 (abfd, hdr->c_vmm),
- bfd_h_get_64 (abfd, hdr->c_vmmregions));
- printf (" impl: 0x%08x\n",
- (unsigned) bfd_h_get_32 (abfd, hdr->c_impl));
- printf (" cprs: 0x%" BFD_VMA_FMT "x\n",
- bfd_h_get_64 (abfd, hdr->c_cprs));
-#endif
- }
- if (options[OPT_LDINFO].selected)
- {
-#ifdef BFD64
- file_ptr off = (file_ptr) bfd_h_get_64 (abfd, hdr->c_loader);
- bfd_size_type len = (bfd_size_type) bfd_h_get_64 (abfd, hdr->c_lsize);
- char *ldr;
-
- ldr = xmalloc (len);
- if (bfd_seek (abfd, off, SEEK_SET) != 0
- || bfd_bread (ldr, len, abfd) != len)
- non_fatal (_("cannot read loader info table"));
- else
- {
- char *p;
-
- printf ("\n"
- "ld info:\n");
- printf (" next core off textorg textsize dataorg datasize\n");
- p = ldr;
- while (1)
- {
- struct external_ld_info32 *l = (struct external_ld_info32 *)p;
- unsigned int next;
- size_t n1;
-
- next = bfd_h_get_32 (abfd, l->ldinfo_next);
- printf (" %08x %08x %08x %08x %08x %08x\n",
- next,
- (unsigned) bfd_h_get_32 (abfd, l->core_offset),
- (unsigned) bfd_h_get_32 (abfd, l->ldinfo_textorg),
- (unsigned) bfd_h_get_32 (abfd, l->ldinfo_textsize),
- (unsigned) bfd_h_get_32 (abfd, l->ldinfo_dataorg),
- (unsigned) bfd_h_get_32 (abfd, l->ldinfo_datasize));
- n1 = strlen ((char *) l->ldinfo_filename);
- printf (" %s %s\n",
- l->ldinfo_filename, l->ldinfo_filename + n1 + 1);
- if (next == 0)
- break;
- p += next;
- }
- }
-#else
- printf (_("\n"
- "ldinfo dump not supported in 32 bits environments\n"));
-#endif
- }
-}
-
-/* Dump a core file. */
-
-static void
-xcoff_dump_core (bfd *abfd)
-{
- struct external_core_dumpx hdr;
- unsigned int version;
-
- /* Read file header. */
- if (bfd_seek (abfd, 0, SEEK_SET) != 0
- || bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
- {
- non_fatal (_("cannot core read header"));
- return;
- }
-
- version = bfd_h_get_32 (abfd, hdr.c_version);
- if (options[OPT_FILE_HEADER].selected)
- {
- printf (_("Core header:\n"));
- printf (_(" version: 0x%08x "), version);
- switch (version)
- {
- case CORE_DUMPX_VERSION:
- printf (_("(dumpx format - aix4.3 / 32 bits)"));
- break;
- case CORE_DUMPXX_VERSION:
- printf (_("(dumpxx format - aix5.0 / 64 bits)"));
- break;
- default:
- printf (_("unknown format"));
- break;
- }
- putchar ('\n');
- }
- if (version == CORE_DUMPX_VERSION)
- dump_dumpx_core (abfd, &hdr);
- else
- printf (_(" Unhandled magic\n"));
-}
-
-/* Dump an XCOFF file. */
-
-static void
-xcoff_dump (bfd *abfd)
-{
- /* We rely on BFD to decide if the file is a core file. Note that core
- files are only supported on native environment by BFD. */
- switch (bfd_get_format (abfd))
- {
- case bfd_core:
- xcoff_dump_core (abfd);
- break;
- default:
- xcoff_dump_obj (abfd);
- break;
- }
-}
-
-/* Vector for xcoff. */
-
-const struct objdump_private_desc objdump_private_desc_xcoff =
- {
- xcoff_help,
- xcoff_filter,
- xcoff_dump,
- options
- };