]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - include/coff/xcoff.h
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / include / coff / xcoff.h
index e790510fde9e7a0e2271a69797f3a766f8761f2e..50ac0df20d6b5f9fd24cd2defbd52d26b8155d07 100644 (file)
@@ -1,14 +1,13 @@
 /* Internal format of XCOFF object file data structures for BFD.
 
-   Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001
-   Free Software Foundation, Inc.
+   Copyright (C) 1995-2021 Free Software Foundation, Inc.
    Written by Ian Lance Taylor <ian@cygnus.com>, Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
 
    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 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
 #ifndef _INTERNAL_XCOFF_H
 #define _INTERNAL_XCOFF_H
 
-/*
- * LINKER
- */
+/* XCOFF specific f_flags.  */
 
-/*
- * names of "special" sections
- */
+/* File was profiled with fdpr.  */
+#define F_FDPR_PROF 0x0010
+
+/* File was reordered with fdpr.  */
+#define F_FDPR_OPTI 0x0020
+
+/* File use very large program support.  */
+#define F_DSA       0x0040
+
+/* One aux header specifying medium page sizes is non-zero.  */
+#define F_VARPG     0x0100
+
+/* Read/write sections are non-executable.  */
+#define F_NONEXEC   0x8000
+
+/* Linker */
+
+/* Names of "special" sections.  */
 #define _TEXT  ".text"
 #define _DATA  ".data"
 #define _BSS   ".bss"
 #define _PAD   ".pad"
 #define _LOADER        ".loader"
+#define _EXCEPT ".except"
+#define _TYPCHK ".typchk"
+
+/* XCOFF uses special .dwXXX sections with the type STYP_DWARF.  */
+#define STYP_DWARF  0x0010
+
+/* High-order 16-bits dwarf subtypes.  */
+#define SSUBTYP_DWINFO  0x10000
+#define SSUBTYP_DWLINE  0x20000
+#define SSUBTYP_DWPBNMS 0x30000
+#define SSUBTYP_DWPBTYP 0x40000
+#define SSUBTYP_DWARNGE 0x50000
+#define SSUBTYP_DWABREV 0x60000
+#define SSUBTYP_DWSTR   0x70000
+#define SSUBTYP_DWRNGES 0x80000
 
 /* XCOFF uses a special .loader section with type STYP_LOADER.  */
 #define STYP_LOADER 0x1000
 
+/* Specifies an exception section.  A section of this type provides 
+   information to identify the reason that a trap or ececptin occured within 
+   and executable object program */
+#define STYP_EXCEPT 0x0100
+
+/* Specifies an initialized thread-local data section.  */
+#define STYP_TDATA  0x0400
+
+/* Specifies an uninitialized thread-local data section.  */
+#define STYP_TBSS   0x0800
+
 /* XCOFF uses a special .debug section with type STYP_DEBUG.  */
-#define STYP_DEBUG 0x2000
+#define STYP_DEBUG  0x2000
+
+/* Specifies a type check section.  A section of this type contains parameter 
+   argument type check strings used by the AIX binder.  */
+#define STYP_TYPCHK 0x4000
 
 /* XCOFF handles line number or relocation overflow by creating
    another section header with STYP_OVRFLO set.  */
@@ -50,7 +93,6 @@
 #define        RS6K_AOUTHDR_NMAGIC 0x0108 /* new: text r/o, data r/w */
 #define        RS6K_AOUTHDR_ZMAGIC 0x010B /* paged: text r/o, both page-aligned */
 
-
 /* XCOFF relocation types.  
    The relocations are described in the function  
    xcoff[64]_ppc_relocate_section in coff64-rs6000.c and coff-rs6000.c  */
 #define R_RBAC  (0x19)
 #define R_RBR   (0x1a)
 #define R_RBRC  (0x1b)
+#define R_TLS   (0x20)
+#define R_TLS_IE (0x21)
+#define R_TLS_LD (0x22)
+#define R_TLS_LE (0x23)
+#define R_TLSM  (0x24)
+#define R_TLSML (0x25)
+#define R_TOCU  (0x30)
+#define R_TOCL  (0x31)
 
+/* Storage class #defines, from /usr/include/storclass.h that are not already 
+   defined in internal.h */
 
-/* 
- * Storage class #defines, from /usr/include/storclass.h 
- * That are not already defined in internal.h
- */
-#define        C_INFO          110     /* Comment string in .info section */
+/* Comment string in .info section */
+#define        C_INFO          110     
 
+/* Dwarf symbol.  */
+#define C_DWARF                112
 
-/* 
- * AUXILLARY SYMBOL ENTRIES
- *
- * auxemt
- */
+/* Auxillary Symbol Entries  */
 
 /* x_smtyp values:  */
-
 #define        SMTYP_ALIGN(x)  ((x) >> 3)      /* log2 of alignment */
 #define        SMTYP_SMTYP(x)  ((x) & 0x7)     /* symbol type */
 /* Symbol type values:  */
 #define        XTY_US  5               /* "Reserved for internal use" */
 
 /* x_smclas values:  */
-
 #define        XMC_PR  0               /* Read-only program code */
 #define        XMC_RO  1               /* Read-only constant */
 #define        XMC_DB  2               /* Read-only debug dictionary table */
 #define XMC_TD 16              /* Read-write data in TOC */
 #define        XMC_SV64   17           /* Read-only 64 bit supervisor call */
 #define        XMC_SV3264 18           /* Read-only 32 or 64 bit supervisor call */
+/*                19   ??? */
+#define XMC_TL     20          /* Read-write initialized TLS data */
+#define XMC_TU     21          /* Read-write uninitialized TLS data */
+#define XMC_TE     22          /* Same as XMC_TC but mapped after it */
 
 /* The ldhdr structure.  This appears at the start of the .loader
    section.  */
 
 struct internal_ldhdr
 {
-  /* 
-   * The version number: 
-   * 1 : 32 bit
-   * 2 : 64 bit
-   */
+  /* The version number: 
+     1 : 32 bit
+     2 : 64 bit */
   unsigned long l_version;
+
   /* The number of symbol table entries.  */
   bfd_size_type l_nsyms;
+
   /* The number of relocation table entries.  */
   bfd_size_type l_nreloc;
+
   /* The length of the import file string table.  */
   bfd_size_type l_istlen;
+
   /* The number of import files.  */
   bfd_size_type l_nimpid;
+
   /* The offset from the start of the .loader section to the first
      entry in the import file table.  */
   bfd_size_type l_impoff;
+
   /* The length of the string table.  */
   bfd_size_type l_stlen;
+
   /* The offset from the start of the .loader section to the first
      entry in the string table.  */
   bfd_size_type l_stoff;
+
   /* The offset to start of the symbol table, only in XCOFF64 */
   bfd_vma l_symoff;
+
   /* The offset to the start of the relocation table, only in XCOFF64 */
   bfd_vma l_rldoff;
 };
@@ -165,28 +221,37 @@ struct internal_ldhdr
 struct internal_ldsym
 {
   union
+  {
+    /* The symbol name if <= SYMNMLEN characters.  */
+    char _l_name[SYMNMLEN];
+    struct
     {
-      /* The symbol name if <= SYMNMLEN characters.  */
-      char _l_name[SYMNMLEN];
-      struct
-       {
-         /* Zero if the symbol name is more than SYMNMLEN characters.  */
-         long _l_zeroes;
-         /* The offset in the string table if the symbol name is more
-             than SYMNMLEN characters.  */
-         long _l_offset;
-       } _l_l;
-    } _l;
+      /* Zero if the symbol name is more than SYMNMLEN characters.  */
+       long _l_zeroes;
+      
+      /* The offset in the string table if the symbol name is more
+        than SYMNMLEN characters.  */
+      long _l_offset;
+    } 
+    _l_l;
+  }
+  _l;
+
   /* The symbol value.  */
   bfd_vma l_value;
+
   /* The symbol section number.  */
   short l_scnum;
+
   /* The symbol type and flags.  */
   char l_smtype;
+
   /* The symbol storage class.  */
   char l_smclas;
+
   /* The import file ID.  */
   bfd_size_type l_ifile;
+
   /* Offset to the parameter type check string.  */
   bfd_size_type l_parm;
 };
@@ -200,6 +265,8 @@ struct internal_ldsym
 #define L_ENTRY (0x20)
 /* Exported symbol.  */
 #define L_EXPORT (0x10)
+/* Weak symbol.  */
+#define L_WEAK (0x08)
 
 /* The ldrel structure.  This is used to represent a reloc in the
    .loader section.  */
@@ -208,10 +275,13 @@ struct internal_ldrel
 {
   /* The reloc address.  */
   bfd_vma l_vaddr;
+
   /* The symbol table index in the .loader section symbol table.  */
   bfd_size_type l_symndx;
+
   /* The relocation type and size.  */
   short l_rtype;
+
   /* The section number this relocation applies to.  */
   short l_rsecnm;
 };
@@ -230,14 +300,16 @@ struct xcoff_link_hash_entry
   asection *toc_section;
 
   union
-    {
-      /* If we have created a TOC entry (the XCOFF_SET_TOC flag is
-        set), this is the offset in toc_section.  */
-      bfd_vma toc_offset;
-      /* If the TOC entry comes from an input file, this is set to the
-         symbol index of the C_HIDEXT XMC_TC or XMC_TD symbol.  */
-      long toc_indx;
-    } u;
+  {
+    /* If we have created a TOC entry (the XCOFF_SET_TOC flag is
+       set), this is the offset in toc_section.  */
+    bfd_vma toc_offset;
+    
+    /* If the TOC entry comes from an input file, this is set to the
+       symbol index of the C_HIDEXT XMC_TC or XMC_TD symbol.  */
+    long toc_indx;
+  } 
+  u;
 
   /* If this symbol is a function entry point which is called, this
      field holds a pointer to the function descriptor.  If this symbol
@@ -260,78 +332,47 @@ struct xcoff_link_hash_entry
   unsigned char smclas;
 };
 
-/*
- * #define for xcoff_link_hash_entry.flags
- *
- * XCOFF_REF_REGULAR
- * Symbol is referenced by a regular object. 
- *
- * XCOFF_DEF_REGULAR
- * Symbol is defined by a regular object. 
- *
- * XCOFF_DEF_DYNAMIC
- * Symbol is defined by a dynamic object. 
- *
- * XCOFF_LDREL
- * Symbol is used in a reloc being copied into the .loader section.
- *
- * XCOFF_ENTRY
- * Symbol is the entry point.
- *
- * XCOFF_CALLED
- * Symbol is called; this is, it appears in a R_BR reloc. 
- *
- * XCOFF_SET_TOC
- * Symbol needs the TOC entry filled in.
- *
- * XCOFF_IMPORT
- * Symbol is explicitly imported.
- *
- * XCOFF_EXPORT
- * Symbol is explicitly exported.
- *
- * XCOFF_BUILT_LDSYM
- * Symbol has been processed by xcoff_build_ldsyms.
- *
- * XCOFF_MARK
- * Symbol is mentioned by a section which was not garbage collected. 
- *
- * XCOFF_HAS_SIZE
- * Symbol size is recorded in size_list list from hash table. 
- *
- * XCOFF_DESCRIPTOR
- * Symbol is a function descriptor. 
- *
- * XCOFF_MULTIPLY_DEFINED
- * Multiple definitions have been for the symbol. 
- *
- * XCOFF_RTINIT 
- * Symbol is the __rtinit symbol 
- *
- * XCOFF_SYSCALL32 
- * Symbol is an imported 32 bit syscall
- * 
- * XCOFF_SYSCALL64 
- * Symbol is an imported 64 bit syscall
- */
+/*  Flags for xcoff_link_hash_entry.  */
 
+/* Symbol is referenced by a regular object. */
 #define XCOFF_REF_REGULAR      0x00000001
+/* Symbol is defined by a regular object. */
 #define XCOFF_DEF_REGULAR      0x00000002
+/* Symbol is defined by a dynamic object. */
 #define XCOFF_DEF_DYNAMIC      0x00000004
+/* Symbol is used in a reloc being copied into the .loader section.  */
 #define XCOFF_LDREL            0x00000008
+/* Symbol is the entry point.  */
 #define XCOFF_ENTRY            0x00000010
+/* Symbol is for a function and is the target of a relocation.
+   The relocation may or may not be a branch-type relocation.  */
 #define XCOFF_CALLED           0x00000020
+/* Symbol needs the TOC entry filled in.  */
 #define XCOFF_SET_TOC          0x00000040
+/* Symbol is implicitly or explicitly imported.  */
 #define XCOFF_IMPORT           0x00000080
+/* Symbol is explicitly exported.  */
 #define XCOFF_EXPORT           0x00000100
+/* Symbol has been processed by xcoff_build_ldsyms.  */
 #define XCOFF_BUILT_LDSYM      0x00000200
+/* Symbol is mentioned by a section which was not garbage collected. */
 #define XCOFF_MARK             0x00000400
+/* Symbol size is recorded in size_list list from hash table.  */
 #define XCOFF_HAS_SIZE         0x00000800
+/* Symbol is a function descriptor.  */
 #define XCOFF_DESCRIPTOR       0x00001000
+/* Multiple definitions have been for the symbol. */
 #define XCOFF_MULTIPLY_DEFINED 0x00002000
+/* Symbol is the __rtinit symbol.  */
 #define XCOFF_RTINIT           0x00004000
+/* Symbol is an imported 32 bit syscall.  */
 #define XCOFF_SYSCALL32        0x00008000
+/* Symbol is an imported 64 bit syscall.  */
 #define XCOFF_SYSCALL64        0x00010000 
+/* Symbol was not explicitly defined by the time it was marked.  */
+#define XCOFF_WAS_UNDEFINED    0x00020000
+/* We have assigned an output XCOFF entry to this symbol.  */
+#define XCOFF_ALLOCATED               0x00040000
 
 /* The XCOFF linker hash table.  */
 
@@ -343,63 +384,9 @@ struct xcoff_link_hash_entry
 #define XCOFF_SPECIAL_SECTION_END        4
 #define XCOFF_SPECIAL_SECTION_END2       5
 
-struct xcoff_link_hash_table
-{
-  struct bfd_link_hash_table root;
-
-  /* The .debug string hash table.  We need to compute this while
-     reading the input files, so that we know how large the .debug
-     section will be before we assign section positions.  */
-  struct bfd_strtab_hash *debug_strtab;
-
-  /* The .debug section we will use for the final output.  */
-  asection *debug_section;
-
-  /* The .loader section we will use for the final output.  */
-  asection *loader_section;
-
-  /* A count of non TOC relative relocs which will need to be
-     allocated in the .loader section.  */
-  size_t ldrel_count;
-
-  /* The .loader section header.  */
-  struct internal_ldhdr ldhdr;
-
-  /* The .gl section we use to hold global linkage code.  */
-  asection *linkage_section;
-
-  /* The .tc section we use to hold toc entries we build for global
-     linkage code.  */
-  asection *toc_section;
-
-  /* The .ds section we use to hold function descriptors which we
-     create for exported symbols.  */
-  asection *descriptor_section;
-
-  /* The list of import files.  */
-  struct xcoff_import_file *imports;
-
-  /* Required alignment of sections within the output file.  */
-  unsigned long file_align;
-
-  /* Whether the .text section must be read-only.  */
-  boolean textro;
-
-  /* Whether garbage collection was done.  */
-  boolean gc;
-
-  /* A linked list of symbols for which we have size information.  */
-  struct xcoff_link_size_list
-    {
-      struct xcoff_link_size_list *next;
-      struct xcoff_link_hash_entry *h;
-      bfd_size_type size;
-    } *size_list;
-
-  /* Magic sections: _text, _etext, _data, _edata, _end, end. */
-  asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS];
-};
-
+/* These flags indicate which of -bexpall and -bexpfull are in effect.  */
+#define XCOFF_EXPALL 1
+#define XCOFF_EXPFULL 2
 
 /* This structure is used to pass information through
    xcoff_link_hash_traverse.  */
@@ -407,19 +394,26 @@ struct xcoff_link_hash_table
 struct xcoff_loader_info
 {
   /* Set if a problem occurred.  */
-  boolean failed;
+  bfd_boolean failed;
+
   /* Output BFD.  */
   bfd *output_bfd;
+
   /* Link information structure.  */
   struct bfd_link_info *info;
-  /* Whether all defined symbols should be exported.  */
-  boolean export_defineds;
+
+  /* A mask of XCOFF_EXPALL and XCOFF_EXPFULL flags.  */
+  unsigned int auto_export_flags;
+
   /* Number of ldsym structures.  */
   size_t ldsym_count;
+
   /* Size of string table.  */
   size_t string_size;
+
   /* String table.  */
-  bfd_byte *strings;
+  char *strings;
+
   /* Allocated size of string table.  */
   size_t string_alc;
 };
@@ -428,42 +422,50 @@ struct xcoff_loader_info
    from smaller values.  Start with zero, widen, *then* decrement.  */
 #define MINUS_ONE       (((bfd_vma) 0) - 1)
 
+/* __rtinit, from /usr/include/rtinit.h.  */
+struct __rtinit 
+{
+  /* Pointer to runtime linker.     
+     XXX: Is the parameter really void?  */
+  int  (*rtl) (void);  
+
+  /* Offset to array of init functions, 0 if none. */
+  int  init_offset;
+
+  /* Offset to array of fini functions, 0 if none. */             
+  int  fini_offset;            
 
-/* 
- * __rtinit 
- * from /usr/include/rtinit.h
- */
-struct __rtinit {
-  int          (*rtl) PARAMS ((void)); /* Pointer to runtime linker.
-                                          XXX: Is the parameter really void?  */
-  int          init_offset;            /* Offset to array of init functions
-                                          (0 if none). */
-  int          fini_offset;            /* Offset to array of fini functions
-                                          (0 if none). */
-  int          __rtinit_descriptor_size; /* Size of __RTINIT_DESCRIPTOR.
-                                            This value should be used instead
-                                            of sizeof(__RTINIT_DESCRIPTOR). */
+  /* Size of __RTINIT_DESCRIPTOR. This value should be used instead of 
+     sizeof(__RTINIT_DESCRIPTOR). */
+  int  __rtinit_descriptor_size; 
 };
 
 #define RTINIT_DESCRIPTOR_SIZE (12)
 
-struct __rtinit_descriptor {
-  int  f;              /* Init/fini function. */
-  int                  name_offset;    /* Offset (within __rtinit symbol)
-                                          to name of function. */
-  unsigned char        flags;          /* Flags */
-};
+struct __rtinit_descriptor 
+{
+  /* Init/fini function. */
+  int  f;
 
+  /* Offset, relative to the start of the __rtinit symbol, to name of the 
+     function. */
 
+  int  name_offset;    
+
+  /* Flags */                     
+  unsigned char        flags;  
+};
 
-/* 
- * ARCHIVE
- */
+/* Archive */
 
 #define XCOFFARMAG    "<aiaff>\012"
 #define XCOFFARMAGBIG "<bigaf>\012"
 #define SXCOFFARMAG   8
 
+/* The size of the ascii archive elements */
+#define XCOFFARMAG_ELEMENT_SIZE 12
+#define XCOFFARMAGBIG_ELEMENT_SIZE 20
+
 /* This terminates an XCOFF archive member name.  */
 
 #define XCOFFARFMAG "`\012"
@@ -477,23 +479,23 @@ struct xcoff_ar_file_hdr
   char magic[SXCOFFARMAG];
 
   /* Offset of the member table (decimal ASCII string).  */
-  char memoff[12];
+  char memoff[XCOFFARMAG_ELEMENT_SIZE];
 
   /* Offset of the global symbol table (decimal ASCII string).  */
-  char symoff[12];
+  char symoff[XCOFFARMAG_ELEMENT_SIZE];
 
   /* Offset of the first member in the archive (decimal ASCII string).  */
-  char firstmemoff[12];
+  char firstmemoff[XCOFFARMAG_ELEMENT_SIZE];
 
   /* Offset of the last member in the archive (decimal ASCII string).  */
-  char lastmemoff[12];
+  char lastmemoff[XCOFFARMAG_ELEMENT_SIZE];
 
   /* Offset of the first member on the free list (decimal ASCII
      string).  */
-  char freeoff[12];
+  char freeoff[XCOFFARMAG_ELEMENT_SIZE];
 };
 
-#define SIZEOF_AR_FILE_HDR (5 * 12 + SXCOFFARMAG)
+#define SIZEOF_AR_FILE_HDR (SXCOFFARMAG + 5 * XCOFFARMAG_ELEMENT_SIZE)
 
 /* This is the equivalent data structure for the big archive format.  */
 
@@ -503,42 +505,41 @@ struct xcoff_ar_file_hdr_big
   char magic[SXCOFFARMAG];
 
   /* Offset of the member table (decimal ASCII string).  */
-  char memoff[20];
+  char memoff[XCOFFARMAGBIG_ELEMENT_SIZE];
 
   /* Offset of the global symbol table for 32-bit objects (decimal ASCII
      string).  */
-  char symoff[20];
+  char symoff[XCOFFARMAGBIG_ELEMENT_SIZE];
 
   /* Offset of the global symbol table for 64-bit objects (decimal ASCII
      string).  */
-  char symoff64[20];
+  char symoff64[XCOFFARMAGBIG_ELEMENT_SIZE];
 
   /* Offset of the first member in the archive (decimal ASCII string).  */
-  char firstmemoff[20];
+  char firstmemoff[XCOFFARMAGBIG_ELEMENT_SIZE];
 
   /* Offset of the last member in the archive (decimal ASCII string).  */
-  char lastmemoff[20];
+  char lastmemoff[XCOFFARMAGBIG_ELEMENT_SIZE];
 
   /* Offset of the first member on the free list (decimal ASCII
      string).  */
-  char freeoff[20];
+  char freeoff[XCOFFARMAGBIG_ELEMENT_SIZE];
 };
 
-#define SIZEOF_AR_FILE_HDR_BIG (6 * 20 + SXCOFFARMAG)
-
+#define SIZEOF_AR_FILE_HDR_BIG (SXCOFFARMAG + 6 * XCOFFARMAGBIG_ELEMENT_SIZE)
 
 /* Each XCOFF archive member starts with this (printable) structure.  */
 
 struct xcoff_ar_hdr
 {
   /* File size not including the header (decimal ASCII string).  */
-  char size[12];
+  char size[XCOFFARMAG_ELEMENT_SIZE];
 
   /* File offset of next archive member (decimal ASCII string).  */
-  char nextoff[12];
+  char nextoff[XCOFFARMAG_ELEMENT_SIZE];
 
   /* File offset of previous archive member (decimal ASCII string).  */
-  char prevoff[12];
+  char prevoff[XCOFFARMAG_ELEMENT_SIZE];
 
   /* File mtime (decimal ASCII string).  */
   char date[12];
@@ -563,20 +564,20 @@ struct xcoff_ar_hdr
      bytes is given in the size field.  */
 };
 
-#define SIZEOF_AR_HDR (7 * 12 + 4)
+#define SIZEOF_AR_HDR (3 * XCOFFARMAG_ELEMENT_SIZE + 4 * 12 + 4)
 
 /* The equivalent for the big archive format.  */
 
 struct xcoff_ar_hdr_big
 {
   /* File size not including the header (decimal ASCII string).  */
-  char size[20];
+  char size[XCOFFARMAGBIG_ELEMENT_SIZE];
 
   /* File offset of next archive member (decimal ASCII string).  */
-  char nextoff[20];
+  char nextoff[XCOFFARMAGBIG_ELEMENT_SIZE];
 
   /* File offset of previous archive member (decimal ASCII string).  */
-  char prevoff[20];
+  char prevoff[XCOFFARMAGBIG_ELEMENT_SIZE];
 
   /* File mtime (decimal ASCII string).  */
   char date[12];
@@ -601,13 +602,27 @@ struct xcoff_ar_hdr_big
      bytes is given in the size field.  */
 };
 
-#define SIZEOF_AR_HDR_BIG (3 * 20 + 4 * 12 + 4)
+#define SIZEOF_AR_HDR_BIG (3 * XCOFFARMAGBIG_ELEMENT_SIZE + 4 * 12 + 4)
 
 /* We often have to distinguish between the old and big file format.
    Make it a bit cleaner.  We can use `xcoff_ardata' here because the
-   `hdr' member has the same size and position in both formats.  */
+   `hdr' member has the same size and position in both formats.  
+   <bigaf> is the default format, return TRUE even when xcoff_ardata is 
+   NULL. */
+#ifndef SMALL_ARCHIVE
+/* Creates big archives by default */
 #define xcoff_big_format_p(abfd) \
-  (xcoff_ardata (abfd)->magic[1] == 'b')
+  ((NULL != bfd_ardata (abfd) && NULL == xcoff_ardata (abfd)) || \
+   ((NULL != bfd_ardata (abfd)) && \
+    (NULL != xcoff_ardata (abfd)) && \
+    (xcoff_ardata (abfd)->magic[1] == 'b')))
+#else
+/* Creates small archives by default. */
+#define xcoff_big_format_p(abfd) \
+  (((NULL != bfd_ardata (abfd)) && \
+    (NULL != xcoff_ardata (abfd)) && \
+    (xcoff_ardata (abfd)->magic[1] == 'b')))
+#endif
 
 /* We store a copy of the xcoff_ar_file_hdr in the tdata field of the
    artdata structure.  Similar for the big archive.  */
@@ -624,4 +639,8 @@ struct xcoff_ar_hdr_big
 #define arch_xhdr_big(bfd) \
   ((struct xcoff_ar_hdr_big *) arch_eltdata (bfd)->arch_header)
 
+/* True if symbols of class CLASS are external.  */
+#define EXTERN_SYM_P(CLASS) \
+  ((CLASS) == C_EXT || (CLASS) == C_AIX_WEAKEXT)
+
 #endif /* _INTERNAL_XCOFF_H */