* elfcode.h (map_program_segments): Restore check of file_size !=
[deliverable/binutils-gdb.git] / bfd / bfd-in.h
index fbbecd4f2fb3b9eff4262a57adf7883d4d4ca1b8..1b445031193f3d44e72b35597204790f3691e447 100644 (file)
@@ -1,7 +1,11 @@
-/* A -*- C -*- header file for the bfd library
-   Copyright 1990, 1991 Free Software Foundation, Inc.
+/* Main header file for the bfd library -- portable access to object files.
+   Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
    Contributed by Cygnus Support.
 
+** NOTE: bfd.h and bfd-in2.h are GENERATED files.  Don't change them;
+** instead, change bfd-in.h or the other BFD source files processed to
+** generate these files.
+
 This file is part of BFD, the Binary File Descriptor library.
 
 This program is free software; you can redistribute it and/or modify
@@ -20,8 +24,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 /* bfd.h -- The only header file required by users of the bfd library 
 
-This file is generated from various .c files, if you change it, your
-bits may be lost.
+The bfd.h file is generated from bfd-in.h and various .c files; if you
+change it, your changes will probably be lost.
 
 All the prototypes and definitions following the comment "THE FOLLOWING
 IS EXTRACTED FROM THE SOURCE" are extracted from the source files for
@@ -43,20 +47,34 @@ here.  */
 #include "ansidecl.h"
 #include "obstack.h"
 
-/* Make it easier to declare prototypes (puts conditional here) */
-#ifndef PROTO
-#      if __STDC__
-#              define PROTO(type, name, arglist) type name arglist
-#      else
-#              define PROTO(type, name, arglist) type name ()
-#      endif
+#define BFD_VERSION "2.2"
+
+#define BFD_ARCH_SIZE @WORDSIZE@
+
+#if BFD_ARCH_SIZE >= 64
+#define BFD64
+#endif
+
+#ifndef INLINE
+#if __GNUC__ >= 2
+#define INLINE __inline__
+#else
+#define INLINE
 #endif
+#endif
+
+/* 64-bit type definition (if any) from bfd's sysdep.h goes here */
 
-#define BFD_VERSION "0.18"
 
 /* forward declaration */
 typedef struct _bfd bfd;
 
+/* To squelch erroneous compiler warnings ("illegal pointer
+   combination") from the SVR3 compiler, we would like to typedef
+   boolean to int (it doesn't like functions which return boolean.
+   Making sure they are never implicitly declared to return int
+   doesn't seem to help).  But this file is not configured based on
+   the host.  */
 /* General rules: functions which are boolean return true on success
    and false on failure (unless they're a predicate).   -- bfd.doc */
 /* I'm sure this is going to break something and someone is going to
@@ -65,35 +83,70 @@ typedef struct _bfd bfd;
 /* Yup, SVR4 has a "typedef enum boolean" in <sys/types.h>  -fnf */
 typedef enum bfd_boolean {false, true} boolean;
 
-/* Try to avoid breaking stuff */
-typedef  long int file_ptr;
+/* A pointer to a position in a file.  */
+/* FIXME:  This should be using off_t from <sys/types.h>.
+   For now, try to avoid breaking stuff by not including <sys/types.h> here.
+   This will break on systems with 64-bit file offsets (e.g. 4.4BSD).
+   Probably the best long-term answer is to avoid using file_ptr AND off_t 
+   in this header file, and to handle this in the BFD implementation
+   rather than in its interface.  */
+/* typedef off_t       file_ptr; */
+typedef long int file_ptr;
+
+/* Support for different sizes of target format ints and addresses.  If the
+   host implements 64-bit values, it defines HOST_64_BIT to be the appropriate
+   type.  Otherwise, this code will fall back on gcc's "long long" type if gcc
+   is being used.  HOST_64_BIT must be defined in such a way as to be a valid
+   type name by itself or with "unsigned" prefixed.  It should be a signed
+   type by itself.
+
+   If neither is the case, then compilation will fail if 64-bit targets are
+   requested.  If you don't request any 64-bit targets, you should be safe. */
+
+#ifdef BFD64
+
+#if defined (__GNUC__) && !defined (HOST_64_BIT)
+#define HOST_64_BIT long long
+typedef HOST_64_BIT int64_type;
+typedef unsigned HOST_64_BIT uint64_type;
+#endif
 
-/* Support for different sizes of target format ints and addresses */
+#if !defined (uint64_type) && defined (__GNUC__)
+#define uint64_type unsigned long long
+#define int64_type long long
+#define uint64_typeLOW(x) (unsigned long)(((x) & 0xffffffff))
+#define uint64_typeHIGH(x) (unsigned long)(((x) >> 32) & 0xffffffff)
+#endif
 
-#ifdef HOST_64_BIT
-typedef HOST_64_BIT rawdata_offset;
-typedef HOST_64_BIT bfd_vma;
-typedef HOST_64_BIT bfd_word;
-typedef HOST_64_BIT bfd_offset;
-typedef HOST_64_BIT bfd_size_type;
-typedef HOST_64_BIT symvalue;
-typedef HOST_64_BIT bfd_64_type;
+typedef unsigned HOST_64_BIT bfd_vma;
+typedef HOST_64_BIT bfd_signed_vma;
+typedef unsigned HOST_64_BIT bfd_size_type;
+typedef unsigned HOST_64_BIT symvalue;
 #define fprintf_vma(s,x) \
                fprintf(s,"%08x%08x", uint64_typeHIGH(x), uint64_typeLOW(x))
-#define printf_vma(x) \
-               printf(   "%08x%08x", uint64_typeHIGH(x), uint64_typeLOW(x))
-#else
-typedef struct {int a,b;} bfd_64_type;
-typedef unsigned long rawdata_offset;
+#define sprintf_vma(s,x) \
+               sprintf(s,"%08x%08x", uint64_typeHIGH(x), uint64_typeLOW(x))
+#else /* not BFD64  */
+
+/* Represent a target address.  Also used as a generic unsigned type
+   which is guaranteed to be big enough to hold any arithmetic types
+   we need to deal with.  */
 typedef unsigned long bfd_vma;
-typedef unsigned long bfd_offset;
-typedef unsigned long bfd_word;
-typedef unsigned long bfd_size;
+
+/* A generic signed type which is guaranteed to be big enough to hold any
+   arithmetic types we need to deal with.  Can be assumed to be compatible
+   with bfd_vma in the same way that signed and unsigned ints are compatible
+   (as parameters, in assignment, etc).  */
+typedef long bfd_signed_vma;
+
 typedef unsigned long symvalue;
 typedef unsigned long bfd_size_type;
-#define printf_vma(x)   printf(    "%08lx", x)
+
+/* Print a bfd_vma x on stream s.  */
 #define fprintf_vma(s,x) fprintf(s, "%08lx", x)
-#endif
+#define sprintf_vma(s,x) sprintf(s, "%08lx", x)
+#endif /* not BFD64  */
+#define printf_vma(x) fprintf_vma(stdout,x)
 
 typedef unsigned int flagword; /* 32 bits of flags */
 \f
@@ -107,18 +160,51 @@ typedef enum bfd_format {
              bfd_type_end}     /* marks the end; don't use it! */
          bfd_format;
 
-/* Object file flag values */
-#define NO_FLAGS    0
-#define HAS_RELOC   001
-#define EXEC_P      002
-#define HAS_LINENO  004
-#define HAS_DEBUG   010
-#define HAS_SYMS    020
-#define HAS_LOCALS  040
-#define DYNAMIC     0100
-#define WP_TEXT     0200
-#define D_PAGED     0400
+/* Values that may appear in the flags field of a BFD.  These also
+   appear in the object_flags field of the bfd_target structure, where
+   they indicate the set of flags used by that backend (not all flags
+   are meaningful for all object file formats) (FIXME: at the moment,
+   the object_flags values have mostly just been copied from backend
+   to another, and are not necessarily correct).  */
 
+/* No flags.  */
+#define NO_FLAGS       0x00
+
+/* BFD contains relocation entries.  */
+#define HAS_RELOC      0x01
+
+/* BFD is directly executable.  */
+#define EXEC_P         0x02
+
+/* BFD has line number information (basically used for F_LNNO in a
+   COFF header).  */
+#define HAS_LINENO     0x04
+
+/* BFD has debugging information.  */
+#define HAS_DEBUG      0x08
+
+/* BFD has symbols.  */
+#define HAS_SYMS       0x10
+
+/* BFD has local symbols (basically used for F_LSYMS in a COFF
+   header).  */
+#define HAS_LOCALS     0x20
+
+/* BFD is a dynamic object.  */
+#define DYNAMIC        0x40
+
+/* Text section is write protected (if D_PAGED is not set, this is
+   like an a.out NMAGIC file) (the linker sets this by default, but
+   clears it for -r or -N).  */
+#define WP_TEXT        0x80
+
+/* BFD is dynamically paged (this is like an a.out ZMAGIC file) (the
+   linker sets this by default, but clears it for -r or -n or -N).  */
+#define D_PAGED        0x100
+
+/* BFD is relaxable (this means that bfd_relax_section may be able to
+   do something).  */
+#define BFD_IS_RELAXABLE 0x200
 \f
 /* symbols and relocation */
 
@@ -135,9 +221,6 @@ typedef enum bfd_symclass {
            } symclass;
 
 
-typedef int symtype;           /* Who knows, yet? */
-
-
 /* general purpose part of a symbol;
    target specific parts will be found in libcoff.h, liba.out.h etc */
 
@@ -145,9 +228,12 @@ typedef int symtype;               /* Who knows, yet? */
 #define bfd_get_section(x) ((x)->section)
 #define bfd_get_output_section(x) ((x)->section->output_section)
 #define bfd_set_section(x,y) ((x)->section) = (y)
-#define bfd_asymbol_base(x) ((x)->section?((x)->section->vma):0)
-#define bfd_asymbol_value(x) (bfd_asymbol_base(x) + x->value)
+#define bfd_asymbol_base(x) ((x)->section->vma)
+#define bfd_asymbol_value(x) (bfd_asymbol_base(x) + (x)->value)
 #define bfd_asymbol_name(x) ((x)->name)
+/*Perhaps future: #define bfd_asymbol_bfd(x) ((x)->section->owner)*/
+#define bfd_asymbol_bfd(x) ((x)->the_bfd)
+#define bfd_asymbol_flavour(x) (bfd_asymbol_bfd(x)->xvec->flavour)
 
 /* This is a type pun with struct ranlib on purpose! */
 typedef struct carsym {
@@ -182,14 +268,19 @@ typedef struct lineno_cache_entry {
 
 typedef struct sec *sec_ptr;
 
+#define bfd_get_section_name(bfd, ptr) ((ptr)->name + 0)
+#define bfd_get_section_vma(bfd, ptr) ((ptr)->vma + 0)
+#define bfd_get_section_alignment(bfd, ptr) ((ptr)->alignment_power + 0)
 #define bfd_section_name(bfd, ptr) ((ptr)->name)
-#define bfd_section_size(bfd, ptr) ((ptr)->size)
+#define bfd_section_size(bfd, ptr) (bfd_get_section_size_before_reloc(ptr))
 #define bfd_section_vma(bfd, ptr) ((ptr)->vma)
 #define bfd_section_alignment(bfd, ptr) ((ptr)->alignment_power)
-#define bfd_get_section_flags(bfd, ptr) ((ptr)->flags)
+#define bfd_get_section_flags(bfd, ptr) ((ptr)->flags + 0)
 #define bfd_get_section_userdata(bfd, ptr) ((ptr)->userdata)
 
-#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (val)), true)
+#define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0)
+
+#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma= (val)), ((ptr)->user_set_vma = true), true)
 #define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),true)
 #define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),true)
 
@@ -204,40 +295,84 @@ typedef enum bfd_error {
              no_more_archived_files, malformed_archive,
              symbol_not_found, file_not_recognized,
              file_ambiguously_recognized, no_contents,
-               bfd_error_nonrepresentable_section,
+             bfd_error_nonrepresentable_section,
+             no_debug_section, bad_value,
+
+             /* An input file is shorter than expected.  */
+             file_truncated,
+             
              invalid_error_code} bfd_ec;
 
 extern bfd_ec bfd_error;
+struct reloc_cache_entry;
+struct bfd_seclet;
+
 
 typedef struct bfd_error_vector {
-  PROTO(void,(* nonrepresentable_section ),(CONST bfd  *CONST abfd,
-                                           CONST char *CONST name));
+  void (* nonrepresentable_section ) PARAMS ((CONST bfd  *CONST abfd,
+                                             CONST char *CONST name));
+  void (* undefined_symbol) PARAMS ((CONST struct reloc_cache_entry *rel,
+                                    CONST struct bfd_seclet *sec));
+  void (* reloc_value_truncated) PARAMS ((CONST struct
+                                         reloc_cache_entry *rel,
+                                         struct bfd_seclet *sec));
+
+  void (* reloc_dangerous) PARAMS ((CONST struct reloc_cache_entry *rel,
+                                   CONST struct bfd_seclet *sec));
+  
 } bfd_error_vector_type;
 
-PROTO (char *, bfd_errmsg, ());
-PROTO (void, bfd_perror, (CONST char *message));
+CONST char *bfd_errmsg PARAMS ((bfd_ec error_tag));
+void bfd_perror PARAMS ((CONST char *message));
 \f
 
 typedef enum bfd_print_symbol
 { 
-  bfd_print_symbol_name_enum,
-  bfd_print_symbol_type_enum,
-  bfd_print_symbol_all_enum
-} bfd_print_symbol_enum_type;
+  bfd_print_symbol_name,
+  bfd_print_symbol_more,
+  bfd_print_symbol_all
+} bfd_print_symbol_type;
     
 \f
+/* Information about a symbol that nm needs.  */
+
+typedef struct _symbol_info
+{
+  symvalue value;
+  char type;                   /*  */
+  CONST char *name;            /* Symbol name.  */
+  char stab_other;             /* Unused. */
+  short stab_desc;             /* Info for N_TYPE.  */
+  CONST char *stab_name;
+} symbol_info;
 \f
 /* The code that implements targets can initialize a jump table with this
    macro.  It must name all its routines the same way (a prefix plus
    the standard routine suffix), or it must #define the routines that
    are not so named, before calling JUMP_TABLE in the initializer.  */
 
-/* Semi-portable string concatenation in cpp */
+/* Semi-portable string concatenation in cpp.
+   The CAT4 hack is to avoid a problem with some strict ANSI C preprocessors.
+   The problem is, "32_" is not a valid preprocessing token, and we don't
+   want extra underscores (e.g., "nlm_32_").  The XCAT2 macro will cause the
+   inner CAT macros to be evaluated first, producing still-valid pp-tokens.
+   Then the final concatenation can be done.  (Sigh.)  */
 #ifndef CAT
+#ifdef SABER
+#define CAT(a,b)       a##b
+#define CAT3(a,b,c)    a##b##c
+#define CAT4(a,b,c,d)  a##b##c##d
+#else
 #ifdef __STDC__
 #define CAT(a,b) a##b
+#define CAT3(a,b,c) a##b##c
+#define XCAT2(a,b)     CAT(a,b)
+#define CAT4(a,b,c,d)  XCAT2(CAT(a,b),CAT(c,d))
 #else
 #define CAT(a,b) a/**/b
+#define CAT3(a,b,c) a/**/b/**/c
+#define CAT4(a,b,c,d)  a/**/b/**/c/**/d
+#endif
 #endif
 #endif
 
@@ -249,7 +384,7 @@ CAT(NAME,_slurp_armap),\
 CAT(NAME,_slurp_extended_name_table),\
 CAT(NAME,_truncate_arname),\
 CAT(NAME,_write_armap),\
-CAT(NAME,_close_and_cleanup),  \
+CAT(NAME,_close_and_cleanup),\
 CAT(NAME,_set_section_contents),\
 CAT(NAME,_get_section_contents),\
 CAT(NAME,_new_section_hook),\
@@ -259,6 +394,7 @@ CAT(NAME,_get_reloc_upper_bound),\
 CAT(NAME,_canonicalize_reloc),\
 CAT(NAME,_make_empty_symbol),\
 CAT(NAME,_print_symbol),\
+CAT(NAME,_get_symbol_info),\
 CAT(NAME,_get_lineno),\
 CAT(NAME,_set_arch_mach),\
 CAT(NAME,_openr_next_archived_file),\
@@ -267,30 +403,30 @@ CAT(NAME,_generic_stat_arch_elt),\
 CAT(NAME,_sizeof_headers),\
 CAT(NAME,_bfd_debug_info_start),\
 CAT(NAME,_bfd_debug_info_end),\
-CAT(NAME,_bfd_debug_info_accumulate)
+CAT(NAME,_bfd_debug_info_accumulate),\
+CAT(NAME,_bfd_get_relocated_section_contents),\
+CAT(NAME,_bfd_relax_section),\
+CAT(NAME,_bfd_seclet_link),\
+CAT(NAME,_bfd_reloc_type_lookup),\
+CAT(NAME,_bfd_make_debug_symbol)
+
+#define COFF_SWAP_TABLE (PTR) &bfd_coff_std_swap_table
 
-#define COFF_SWAP_TABLE coff_swap_aux_in, coff_swap_sym_in, coff_swap_lineno_in,
 \f
 /* User program access to BFD facilities */
 
-extern CONST short _bfd_host_big_endian;
-#define HOST_BYTE_ORDER_BIG_P  (*(char *)&_bfd_host_big_endian)
-
-/* The bfd itself */
-
 /* Cast from const char * to char * so that caller can assign to
    a char * without a warning.  */
 #define bfd_get_filename(abfd) ((char *) (abfd)->filename)
+#define bfd_get_cacheable(abfd) ((abfd)->cacheable)
 #define bfd_get_format(abfd) ((abfd)->format)
 #define bfd_get_target(abfd) ((abfd)->xvec->name)
+#define bfd_get_flavour(abfd) ((abfd)->xvec->flavour)
 #define bfd_get_file_flags(abfd) ((abfd)->flags)
 #define bfd_applicable_file_flags(abfd) ((abfd)->xvec->object_flags)
 #define bfd_applicable_section_flags(abfd) ((abfd)->xvec->section_flags)
-#define bfd_my_archive(abfd) ((abfd)->my_archive);
+#define bfd_my_archive(abfd) ((abfd)->my_archive)
 #define bfd_has_map(abfd) ((abfd)->has_armap)
-#define bfd_header_twiddle_required(abfd) \
-        ((((abfd)->xvec->header_byteorder_big_p)               \
-         != (boolean)HOST_BYTE_ORDER_BIG_P) ? true:false)
 
 #define bfd_valid_reloc_types(abfd) ((abfd)->xvec->valid_reloc_types)
 #define bfd_usrdata(abfd) ((abfd)->usrdata)
@@ -299,49 +435,61 @@ extern CONST short _bfd_host_big_endian;
 #define bfd_get_symcount(abfd) ((abfd)->symcount)
 #define bfd_get_outsymbols(abfd) ((abfd)->outsymbols)
 #define bfd_count_sections(abfd) ((abfd)->section_count)
-#define bfd_get_architecture(abfd) ((abfd)->obj_arch)
-#define bfd_get_machine(abfd) ((abfd)->obj_machine)
-
-
-
-#define BYTE_SIZE 1
-#define SHORT_SIZE 2
-#define LONG_SIZE 4
-
-
-
-/*THE FOLLOWING IS EXTRACTED FROM THE SOURCE */
-
-
-/*:init.c*/
-
-/*:opncls.c*/
-
-
-/*:libbfd.c*/
-
-/*:section.c*/
-
-
-/*:archures.c*/
-
-/*:reloc.c*/
-
-/*:syms.c*/
-
-/*:bfd.c*/
-
-/*:archive.c*/
-
-/*:core.c*/
-
-/*:targets.c*/
-
-/*:format.c*/
 
+#define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
+
+#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = (bool)), true)
+
+/* Byte swapping routines.  */
+
+bfd_vma                bfd_getb64         PARAMS ((unsigned char *));
+bfd_vma        bfd_getl64         PARAMS ((unsigned char *));
+bfd_signed_vma bfd_getb_signed_64 PARAMS ((unsigned char *));
+bfd_signed_vma bfd_getl_signed_64 PARAMS ((unsigned char *));
+bfd_vma                bfd_getb32         PARAMS ((unsigned char *));
+bfd_vma                bfd_getl32         PARAMS ((unsigned char *));
+bfd_signed_vma bfd_getb_signed_32 PARAMS ((unsigned char *));
+bfd_signed_vma bfd_getl_signed_32 PARAMS ((unsigned char *));
+bfd_vma                bfd_getb16         PARAMS ((unsigned char *));
+bfd_vma                bfd_getl16         PARAMS ((unsigned char *));
+bfd_signed_vma bfd_getb_signed_16 PARAMS ((unsigned char *));
+bfd_signed_vma bfd_getl_signed_16 PARAMS ((unsigned char *));
+void           bfd_putb64         PARAMS ((bfd_vma, unsigned char *));
+void           bfd_putl64         PARAMS ((bfd_vma, unsigned char *));
+void           bfd_putb32         PARAMS ((bfd_vma, unsigned char *));
+void           bfd_putl32         PARAMS ((bfd_vma, unsigned char *));
+void           bfd_putb16         PARAMS ((bfd_vma, unsigned char *));
+void           bfd_putl16         PARAMS ((bfd_vma, unsigned char *));
+
+/* ECOFF linking routines.  */
+#ifdef __STDC__
+struct ecoff_debug_info;
+struct ecoff_debug_swap;
+struct ecoff_extr;
+struct symbol_cache_entry;
 #endif
-
-
-
-
-
+extern boolean bfd_ecoff_debug_accumulate
+  PARAMS ((bfd *output_bfd, struct ecoff_debug_info *output_debug,
+          const struct ecoff_debug_swap *output_swap,
+          bfd *input_bfd, struct ecoff_debug_info *input_debug,
+          const struct ecoff_debug_swap *input_swap,
+          boolean relocateable));
+extern boolean bfd_ecoff_debug_link_other
+  PARAMS ((bfd *output_bfd, struct ecoff_debug_info *output_debug,
+          const struct ecoff_debug_swap *output_swap, bfd *input_bfd));
+extern boolean bfd_ecoff_debug_externals
+  PARAMS ((bfd *abfd, struct ecoff_debug_info *debug,
+          const struct ecoff_debug_swap *swap,
+          boolean relocateable,
+          boolean (*get_extr) (struct symbol_cache_entry *,
+                               struct ecoff_extr *),
+          void (*set_index) (struct symbol_cache_entry *,
+                             bfd_size_type)));
+extern bfd_size_type bfd_ecoff_debug_size
+  PARAMS ((bfd *abfd, struct ecoff_debug_info *debug,
+          const struct ecoff_debug_swap *swap));
+extern boolean bfd_ecoff_write_debug
+  PARAMS ((bfd *abfd, struct ecoff_debug_info *debug,
+          const struct ecoff_debug_swap *swap, file_ptr where));
+
+/* And more from the source.  */
This page took 0.034255 seconds and 4 git commands to generate.