* alpha-tdep.c (alpha_register_type): Change from _virtual_type.
[binutils-gdb.git] / bfd / libaout.h
index c6eb5c2a9075896677c40704c4a7a8dc55bbdef8..7dc44a26720439b1ca638f9ee4d10862006bdebe 100644 (file)
@@ -1,24 +1,24 @@
 /* BFD back-end data structures for a.out (and similar) files.
    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001
+   2000, 2001, 2002
    Free Software Foundation, Inc.
    Written by Cygnus Support.
 
-This file is part of BFD, the Binary File Descriptor library.
+   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
-(at your option) any later version.
+   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
+   (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.
+   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, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   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.  */
 
 #ifndef LIBAOUT_H
 #define LIBAOUT_H
@@ -78,6 +78,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /* Parameterize the a.out code based on whether it is being built
    for a 32-bit architecture or a 64-bit architecture.  */
+/* Do not "beautify" the CONCAT* macro args.  Traditional C will not
+   remove whitespace added here, and thus will fail to concatenate
+   the tokens.  */
 #if ARCH_SIZE==64
 #define GET_WORD H_GET_64
 #define GET_SWORD H_GET_S64
@@ -85,9 +88,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #define PUT_WORD H_PUT_64
 #define PUT_MAGIC H_PUT_32
 #ifndef NAME
-#define NAME(x,y) CAT3(x,_64_,y)
+#define NAME(x,y) CONCAT3 (x,_64_,y)
 #endif
-#define JNAME(x) CAT(x,_64)
+#define JNAME(x) CONCAT2 (x,_64)
 #define BYTES_IN_WORD 8
 #else
 #if ARCH_SIZE==16
@@ -97,9 +100,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #define PUT_WORD H_PUT_16
 #define PUT_MAGIC H_PUT_16
 #ifndef NAME
-#define NAME(x,y) CAT3(x,_16_,y)
+#define NAME(x,y) CONCAT3 (x,_16_,y)
 #endif
-#define JNAME(x) CAT(x,_16)
+#define JNAME(x) CONCAT2 (x,_16)
 #define BYTES_IN_WORD 2
 #else /* ARCH_SIZE == 32 */
 #define GET_WORD H_GET_32
@@ -108,9 +111,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #define PUT_WORD H_PUT_32
 #define PUT_MAGIC H_PUT_32
 #ifndef NAME
-#define NAME(x,y) CAT3(x,_32_,y)
+#define NAME(x,y) CONCAT3 (x,_32_,y)
 #endif
-#define JNAME(x) CAT(x,_32)
+#define JNAME(x) CONCAT2 (x,_32)
 #define BYTES_IN_WORD 4
 #endif /* ARCH_SIZE==32 */
 #endif /* ARCH_SIZE==64 */
@@ -128,7 +131,7 @@ struct aout_link_hash_entry
 {
   struct bfd_link_hash_entry root;
   /* Whether this symbol has been written out.  */
-  boolean written;
+  bfd_boolean written;
   /* Symbol index in output file.  */
   int indx;
 };
@@ -151,7 +154,7 @@ struct aout_link_hash_table
 #define aout_link_hash_traverse(table, func, info)                     \
   (bfd_link_hash_traverse                                              \
    (&(table)->root,                                                    \
-    (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \
+    (bfd_boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \
     (info)))
 
 /* Get the a.out link hash table from the info structure.  This is
@@ -190,7 +193,7 @@ struct aout_backend_data
 
   /* Callback for setting the page and segment sizes, if they can't be
      trivially determined from the architecture.  */
-  boolean (*set_sizes)
+  bfd_boolean (*set_sizes)
     PARAMS ((bfd *));
 
   /* zmagic files only. For go32, the length of the exec header contributes
@@ -200,39 +203,39 @@ struct aout_backend_data
 
   /* Callback from the add symbols phase of the linker code to handle
      a dynamic object.  */
-  boolean (*add_dynamic_symbols)
+  bfd_boolean (*add_dynamic_symbols)
     PARAMS ((bfd *, struct bfd_link_info *, struct external_nlist **,
             bfd_size_type *, char **));
 
   /* Callback from the add symbols phase of the linker code to handle
      adding a single symbol to the global linker hash table.  */
-  boolean (*add_one_symbol)
+  bfd_boolean (*add_one_symbol)
     PARAMS ((struct bfd_link_info *, bfd *, const char *, flagword,
-            asection *, bfd_vma, const char *, boolean, boolean,
+            asection *, bfd_vma, const char *, bfd_boolean, bfd_boolean,
             struct bfd_link_hash_entry **));
 
   /* Called to handle linking a dynamic object.  */
-  boolean (*link_dynamic_object)
+  bfd_boolean (*link_dynamic_object)
     PARAMS ((struct bfd_link_info *, bfd *));
 
   /* Called for each global symbol being written out by the linker.
      This should write out the dynamic symbol information.  */
-  boolean (*write_dynamic_symbol)
+  bfd_boolean (*write_dynamic_symbol)
     PARAMS ((bfd *, struct bfd_link_info *, struct aout_link_hash_entry *));
 
   /* If this callback is not NULL, the linker calls it for each reloc.
      RELOC is a pointer to the unswapped reloc.  If *SKIP is set to
-     true, the reloc will be skipped.  *RELOCATION may be changed to
+     TRUE, the reloc will be skipped.  *RELOCATION may be changed to
      change the effects of the relocation.  */
-  boolean (*check_dynamic_reloc)
+  bfd_boolean (*check_dynamic_reloc)
     PARAMS ((struct bfd_link_info *info, bfd *input_bfd,
             asection *input_section, struct aout_link_hash_entry *h,
-            PTR reloc, bfd_byte *contents, boolean *skip,
+            PTR reloc, bfd_byte *contents, bfd_boolean *skip,
             bfd_vma *relocation));
 
   /* Called at the end of a link to finish up any dynamic linking
      information.  */
-  boolean (*finish_dynamic_link)
+  bfd_boolean (*finish_dynamic_link)
     PARAMS ((bfd *, struct bfd_link_info *));
 };
 #define aout_backend_info(abfd) \
@@ -279,10 +282,10 @@ enum machine_type {
   M_68010 = 1,
   M_68020 = 2,
   M_SPARC = 3,
-  /* skip a bunch so we don't run into any of suns numbers */
-  /* make these up for the ns32k*/
-  M_NS32032 = (64),            /* ns32032 running ? */
-  M_NS32532 = (64 + 5),                /* ns32532 running mach */
+  /* Skip a bunch so we don't run into any of SUN's numbers.  */
+  /* Make these up for the ns32k.  */
+  M_NS32032 = (64),    /* ns32032 running ? */
+  M_NS32532 = (64 + 5),        /* ns32532 running mach */
 
   M_386 = 100,
   M_29K = 101,          /* AMD 29000 */
@@ -299,6 +302,7 @@ enum machine_type {
   M_ALPHA_NETBSD = 141,        /* NetBSD/alpha binary */
   M_ARM6_NETBSD = 143, /* NetBSD/arm32 binary */
   M_SPARCLET_1 = 147,  /* 0x93, reserved */
+  M_VAX4K_NETBSD = 150,        /* NetBSD/vax 4K pages binary */
   M_MIPS1 = 151,        /* MIPS R2000/R3000 binary */
   M_MIPS2 = 152,        /* MIPS R4000/R6000 binary */
   M_SPARCLET_2 = 163,  /* 0xa3, reserved */
@@ -373,7 +377,7 @@ struct aoutdata {
   struct internal_exec *hdr;           /* exec file header */
   aout_symbol_type *symbols;           /* symtab for input bfd */
 
-  /* For ease, we do this */
+  /* For ease, we do this */
   asection *textsec;
   asection *datasec;
   asection *bsssec;
@@ -383,16 +387,16 @@ struct aoutdata {
   file_ptr sym_filepos;
   file_ptr str_filepos;
 
-  /* Size of a relocation entry in external form */
+  /* Size of a relocation entry in external form */
   unsigned reloc_entry_size;
 
-  /* Size of a symbol table entry in external form */
+  /* Size of a symbol table entry in external form */
   unsigned symbol_entry_size;
 
-  /* Page size - needed for alignment of demand paged files. */
+  /* Page size - needed for alignment of demand paged files.  */
   unsigned long page_size;
 
-  /* Segment size - needed for alignment of demand paged files. */
+  /* Segment size - needed for alignment of demand paged files.  */
   unsigned long segment_size;
 
   /* Zmagic disk block size - need to align the start of the text
@@ -402,7 +406,7 @@ struct aoutdata {
   unsigned exec_bytes_size;
   unsigned vma_adjusted : 1;
 
-  /* used when a bfd supports several highly similar formats */
+  /* Used when a bfd supports several highly similar formats.  */
   enum
     {
       default_format = 0,
@@ -467,7 +471,7 @@ struct  aout_data_struct {
 #define obj_aout_dynamic_info(bfd) (adata(bfd).dynamic_info)
 
 /* We take the address of the first element of an asymbol to ensure that the
-   macro is only ever applied to an asymbol */
+   macro is only ever applied to an asymbol */
 #define aout_symbol(asymbol) ((aout_symbol_type *)(&(asymbol)->the_bfd))
 
 /* Information we keep for each a.out section.  This is currently only
@@ -485,43 +489,43 @@ struct aout_section_data_struct
 #define set_aout_section_data(s,v) \
   ((s)->used_by_bfd = (PTR)&(v)->relocs)
 
-/* Prototype declarations for functions defined in aoutx.h  */
+/* Prototype declarations for functions defined in aoutx.h.  */
 
-extern boolean NAME(aout,squirt_out_relocs)
+extern bfd_boolean NAME(aout,squirt_out_relocs)
   PARAMS ((bfd *, asection *));
 
-extern boolean NAME(aout,make_sections)
+extern bfd_boolean NAME(aout,make_sections)
   PARAMS ((bfd *));
 
 extern const bfd_target * NAME(aout,some_aout_object_p)
   PARAMS ((bfd *, struct internal_exec *, const bfd_target *(*) (bfd *)));
 
-extern boolean NAME(aout,mkobject)
+extern bfd_boolean NAME(aout,mkobject)
   PARAMS ((bfd *));
 
 extern enum machine_type NAME(aout,machine_type)
-  PARAMS ((enum bfd_architecture, unsigned long, boolean *));
+  PARAMS ((enum bfd_architecture, unsigned long, bfd_boolean *));
 
-extern boolean NAME(aout,set_arch_mach)
+extern bfd_boolean NAME(aout,set_arch_mach)
   PARAMS ((bfd *, enum bfd_architecture, unsigned long));
 
-extern boolean NAME(aout,new_section_hook)
+extern bfd_boolean NAME(aout,new_section_hook)
   PARAMS ((bfd *, asection *));
 
-extern boolean NAME(aout,set_section_contents)
+extern bfd_boolean NAME(aout,set_section_contents)
   PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type));
 
 extern asymbol * NAME(aout,make_empty_symbol)
   PARAMS ((bfd *));
 
-extern boolean NAME(aout,translate_symbol_table)
+extern bfd_boolean NAME(aout,translate_symbol_table)
   PARAMS ((bfd *, aout_symbol_type *, struct external_nlist *, bfd_size_type,
-          char *, bfd_size_type, boolean));
+          char *, bfd_size_type, bfd_boolean));
 
-extern boolean NAME(aout,slurp_symbol_table)
+extern bfd_boolean NAME(aout,slurp_symbol_table)
   PARAMS ((bfd *));
 
-extern boolean NAME(aout,write_syms)
+extern bfd_boolean NAME(aout,write_syms)
   PARAMS ((bfd *));
 
 extern void NAME(aout,reclaim_symbol_table)
@@ -543,7 +547,7 @@ extern void NAME(aout,swap_std_reloc_in)
 extern reloc_howto_type * NAME(aout,reloc_type_lookup)
   PARAMS ((bfd *, bfd_reloc_code_real_type));
 
-extern boolean NAME(aout,slurp_reloc_table)
+extern bfd_boolean NAME(aout,slurp_reloc_table)
   PARAMS ((bfd *, sec_ptr, asymbol **));
 
 extern long NAME(aout,canonicalize_reloc)
@@ -564,20 +568,20 @@ extern void NAME(aout,print_symbol)
 extern void NAME(aout,get_symbol_info)
   PARAMS ((bfd *, asymbol *, symbol_info *));
 
-extern boolean NAME(aout,find_nearest_line)
+extern bfd_boolean NAME(aout,find_nearest_line)
   PARAMS ((bfd *, asection *, asymbol **, bfd_vma, const char **,
           const char **, unsigned int *));
 
 extern long NAME(aout,read_minisymbols)
-  PARAMS ((bfd *, boolean, PTR *, unsigned int *));
+  PARAMS ((bfd *, bfd_boolean, PTR *, unsigned int *));
 
 extern asymbol * NAME(aout,minisymbol_to_symbol)
-  PARAMS ((bfd *, boolean, const PTR, asymbol *));
+  PARAMS ((bfd *, bfd_boolean, const PTR, asymbol *));
 
 extern int NAME(aout,sizeof_headers)
-  PARAMS ((bfd *, boolean));
+  PARAMS ((bfd *, bfd_boolean));
 
-extern boolean NAME(aout,adjust_sizes_and_vmas)
+extern bfd_boolean NAME(aout,adjust_sizes_and_vmas)
   PARAMS ((bfd *, bfd_size_type *, file_ptr *));
 
 extern void NAME(aout,swap_exec_header_in)
@@ -589,7 +593,7 @@ extern void NAME(aout,swap_exec_header_out)
 extern struct bfd_hash_entry * NAME(aout,link_hash_newfunc)
   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
 
-extern boolean NAME(aout,link_hash_table_init)
+extern bfd_boolean NAME(aout,link_hash_table_init)
   PARAMS ((struct aout_link_hash_table *, bfd *,
           struct bfd_hash_entry *(*) (struct bfd_hash_entry *,
                                       struct bfd_hash_table *,
@@ -598,17 +602,17 @@ extern boolean NAME(aout,link_hash_table_init)
 extern struct bfd_link_hash_table * NAME(aout,link_hash_table_create)
   PARAMS ((bfd *));
 
-extern boolean NAME(aout,link_add_symbols)
+extern bfd_boolean NAME(aout,link_add_symbols)
   PARAMS ((bfd *, struct bfd_link_info *));
 
-extern boolean NAME(aout,final_link)
+extern bfd_boolean NAME(aout,final_link)
   PARAMS ((bfd *, struct bfd_link_info *,
           void (*) (bfd *, file_ptr *, file_ptr *, file_ptr *)));
 
-extern boolean NAME(aout,bfd_free_cached_info)
+extern bfd_boolean NAME(aout,bfd_free_cached_info)
   PARAMS ((bfd *));
 
-/* A.out uses the generic versions of these routines... */
+/* A.out uses the generic versions of these routines...  */
 
 #define        aout_16_get_section_contents    _bfd_generic_get_section_contents
 
@@ -643,29 +647,48 @@ extern boolean NAME(aout,bfd_free_cached_info)
        if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0                      \
            || bfd_bwrite ((PTR) &exec_bytes, (bfd_size_type) EXEC_BYTES_SIZE, \
                          abfd) != EXEC_BYTES_SIZE)                           \
-         return false;                                                       \
-       /* Now write out reloc info, followed by syms and strings */          \
+         return FALSE;                                                       \
+       /* Now write out reloc info, followed by syms and strings.  */        \
                                                                              \
        if (bfd_get_outsymbols (abfd) != (asymbol **) NULL                    \
            && bfd_get_symcount (abfd) != 0)                                  \
          {                                                                   \
            if (bfd_seek (abfd, (file_ptr) (N_SYMOFF(*execp)), SEEK_SET) != 0)\
-             return false;                                                   \
+             return FALSE;                                                   \
                                                                              \
            if (! NAME(aout,write_syms) (abfd))                               \
-             return false;                                                   \
+             return FALSE;                                                   \
          }                                                                   \
                                                                              \
        if (bfd_seek (abfd, (file_ptr) (N_TRELOFF(*execp)), SEEK_SET) != 0)   \
-         return false;                                                       \
+         return FALSE;                                                       \
        if (!NAME(aout,squirt_out_relocs) (abfd, obj_textsec (abfd)))         \
-         return false;                                                       \
+         return FALSE;                                                       \
                                                                              \
        if (bfd_seek (abfd, (file_ptr) (N_DRELOFF(*execp)), SEEK_SET) != 0)   \
-         return false;                                                       \
+         return FALSE;                                                       \
        if (!NAME(aout,squirt_out_relocs) (abfd, obj_datasec (abfd)))         \
-         return false;                                                       \
+         return FALSE;                                                       \
       }
 #endif
 
+/* Test if a read-only section can be merged with .text.  This is
+   possible if:
+
+   1. Section has file contents and is read-only.
+   2. The VMA of the section is after the end of .text and before
+      the start of .data.
+   3. The image is demand-pageable (otherwise, a_text in the header
+      will not reflect the gap between .text and .data).  */
+
+#define aout_section_merge_with_text_p(abfd, sec)                      \
+  (((sec)->flags & (SEC_HAS_CONTENTS | SEC_READONLY)) ==               \
+      (SEC_HAS_CONTENTS | SEC_READONLY)                                        \
+   && obj_textsec (abfd) != NULL                                       \
+   && obj_datasec (abfd) != NULL                                       \
+   && (sec)->vma >= (obj_textsec (abfd)->vma +                         \
+                    obj_textsec (abfd)->_cooked_size)                  \
+   && ((sec)->vma + (sec)->_cooked_size) <= obj_datasec (abfd)->vma    \
+   && ((abfd)->flags & D_PAGED) != 0)
+
 #endif /* ! defined (LIBAOUT_H) */