merge from gcc
[deliverable/binutils-gdb.git] / include / bfdlink.h
index 9a35afb5b1d06c75943e7261b8ea382f71be5c36..29eeb6617981500c9138851b9d9bbeed904c3f2f 100644 (file)
@@ -1,5 +1,6 @@
 /* bfdlink.h -- header file for BFD link routines
-   Copyright 1993 Free Software Foundation, Inc.
+   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+   Free Software Foundation, Inc.
    Written by Steve Chamberlain and Ian Lance Taylor, Cygnus Support.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -16,7 +17,7 @@ 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #ifndef BFDLINK_H
 #define BFDLINK_H
@@ -35,7 +36,7 @@ enum bfd_link_strip
 enum bfd_link_discard
 {
   discard_none,                /* Don't discard any locals.  */
-  discard_l,           /* Discard locals with a certain prefix.  */
+  discard_l,           /* Discard local temporary symbols.  */
   discard_all          /* Discard all locals.  */
 };
 \f
@@ -109,14 +110,19 @@ struct bfd_link_hash_entry
        {
          /* The linker needs to know three things about common
              symbols: the size, the alignment, and the section in
-             which the symbol should be placed.  On the assumption
-             that a single common symbol will not take up incredible
-             amounts of memory, we pack the size and the alignment
-             into the space of a single integer.  The alignment is
-             stored as a power of two.  */
-         unsigned int alignment_power : 6;     /* Alignment.  */
-         unsigned int size : 26;               /* Common symbol size.  */
-         asection *section;                    /* Symbol section.  */
+             which the symbol should be placed.  We store the size
+             here, and we allocate a small structure to hold the
+             section and the alignment.  The alignment is stored as a
+             power of two.  We don't store all the information
+             directly because we don't want to increase the size of
+             the union; this structure is a major space user in the
+             linker.  */
+         bfd_size_type size;   /* Common symbol size.  */
+         struct bfd_link_hash_common_entry
+           {
+             unsigned int alignment_power;     /* Alignment.  */
+             asection *section;                /* Symbol section.  */
+           } *p;
        } c;
     } u;
 };
@@ -147,6 +153,14 @@ extern struct bfd_link_hash_entry *bfd_link_hash_lookup
   PARAMS ((struct bfd_link_hash_table *, const char *, boolean create,
           boolean copy, boolean follow));
 
+/* Look up an entry in the main linker hash table if the symbol might
+   be wrapped.  This should only be used for references to an
+   undefined symbol, not for definitions of a symbol.  */
+
+extern struct bfd_link_hash_entry *bfd_wrapped_link_hash_lookup
+  PARAMS ((bfd *, struct bfd_link_info *, const char *, boolean, boolean,
+          boolean));
+
 /* Traverse a link hash table.  */
 extern void bfd_link_hash_traverse
   PARAMS ((struct bfd_link_hash_table *,
@@ -166,15 +180,45 @@ struct bfd_link_info
   const struct bfd_link_callbacks *callbacks;
   /* true if BFD should generate a relocateable object file.  */
   boolean relocateable;
+  /* true if BFD should generate relocation information in the final executable.  */
+  boolean emitrelocations;
+  /* true if BFD should generate a "task linked" object file,
+     similar to relocatable but also with globals converted to statics. */
+  boolean task_link;
   /* true if BFD should generate a shared object.  */
   boolean shared;
+  /* true if BFD should pre-bind symbols in a shared object.  */
+  boolean symbolic;
+  /* true if shared objects should be linked directly, not shared.  */
+  boolean static_link;
+  /* true if the output file should be in a traditional format.  This
+     is equivalent to the setting of the BFD_TRADITIONAL_FORMAT flag
+     on the output file, but may be checked when reading the input
+     files.  */
+  boolean traditional_format;
+  /* true if we want to produced optimized output files.  This might
+     need much more time and therefore must be explicitly selected.  */
+  boolean optimize;
+  /* true if BFD should generate errors for undefined symbols
+     even if generating a shared object.  */
+  boolean no_undefined;
+  /* true if BFD should allow undefined symbols in shared objects even
+     when no_undefined is set to disallow undefined symbols.  The net
+     result will be that undefined symbols in regular objects will
+     still trigger an error, but undefined symbols in shared objects
+     will be ignored.  The implementation of no_undefined makes the
+     assumption that the runtime linker will choke on undefined
+     symbols.  However there is at least one system (BeOS) where
+     undefined symbols in shared libraries is normal since the kernel
+     patches them at load time to select which function is most
+     appropriate for the current architecture.  I.E. dynamically
+     select an appropriate memset function.  Apparently it is also
+     normal for HPPA shared libraries to have undefined symbols.  */
+  boolean allow_shlib_undefined;
   /* Which symbols to strip.  */
   enum bfd_link_strip strip;
   /* Which local symbols to discard.  */
   enum bfd_link_discard discard;
-  /* The local symbol prefix to discard if using discard_l.  */
-  unsigned int lprefix_len;
-  const char *lprefix;
   /* true if symbols should be retained in memory, false if they
      should be freed and reread.  */
   boolean keep_memory;
@@ -192,9 +236,39 @@ struct bfd_link_info
   /* Hash table of symbols to keep.  This is NULL unless strip is
      strip_some.  */
   struct bfd_hash_table *keep_hash;
-  /* Hash table of symbols to report back via notice_callback.  If
-     this is NULL no symbols are reported back.  */
+  /* true if every symbol should be reported back via the notice
+     callback.  */
+  boolean notice_all;
+  /* Hash table of symbols to report back via the notice callback.  If
+     this is NULL, and notice_all is false, then no symbols are
+     reported back.  */
   struct bfd_hash_table *notice_hash;
+  /* Hash table of symbols which are being wrapped (the --wrap linker
+     option).  If this is NULL, no symbols are being wrapped.  */
+  struct bfd_hash_table *wrap_hash;
+  /* If a base output file is wanted, then this points to it */
+  PTR base_file;
+
+  /* If non-zero, specifies that branches which are problematic for the
+  MPC860 C0 (or earlier) should be checked for and modified.  It gives the
+  number of bytes that should be checked at the end of each text page. */
+  int mpc860c0;
+
+  /* The function to call when the executable or shared object is
+     loaded.  */
+  const char *init_function;
+  /* The function to call when the executable or shared object is
+     unloaded.  */
+  const char *fini_function;
+
+  /* true if the new ELF dynamic tags are enabled. */ 
+  boolean new_dtags;
+
+  /* May be used to set DT_FLAGS for ELF. */
+  bfd_vma flags;
+
+  /* May be used to set DT_FLAGS_1 for ELF. */
+  bfd_vma flags_1;
 };
 
 /* This structures holds a set of callback functions.  These are
@@ -266,17 +340,27 @@ struct bfd_link_callbacks
                                  boolean constructor,
                                  const char *name, bfd *abfd, asection *sec,
                                  bfd_vma value));
-  /* A function which is called when there is a reference to a warning
-     symbol.  WARNING is the warning to be issued.  */
+  /* A function which is called to issue a linker warning.  For
+     example, this is called when there is a reference to a warning
+     symbol.  WARNING is the warning to be issued.  SYMBOL is the name
+     of the symbol which triggered the warning; it may be NULL if
+     there is none.  ABFD, SECTION and ADDRESS identify the location
+     which trigerred the warning; either ABFD or SECTION or both may
+     be NULL if the location is not known.  */
   boolean (*warning) PARAMS ((struct bfd_link_info *,
-                             const char *warning));
+                             const char *warning, const char *symbol,
+                             bfd *abfd, asection *section,
+                             bfd_vma address));
   /* A function which is called when a relocation is attempted against
      an undefined symbol.  NAME is the symbol which is undefined.
      ABFD, SECTION and ADDRESS identify the location from which the
-     reference is made.  */
+     reference is made. FATAL indicates whether an undefined symbol is
+     a fatal error or not. In some cases SECTION may be NULL.  */
   boolean (*undefined_symbol) PARAMS ((struct bfd_link_info *,
                                       const char *name, bfd *abfd,
-                                      asection *section, bfd_vma address));
+                                      asection *section,
+                                      bfd_vma address,
+                                      boolean fatal));
   /* A function which is called when a reloc overflow occurs.  NAME is
      the name of the symbol or section the reloc is against,
      RELOC_NAME is the name of the relocation, and ADDEND is any
@@ -419,4 +503,53 @@ struct bfd_link_order_reloc
 /* Allocate a new link_order for a section.  */
 extern struct bfd_link_order *bfd_new_link_order PARAMS ((bfd *, asection *));
 
+/* These structures are used to describe version information for the
+   ELF linker.  These structures could be manipulated entirely inside
+   BFD, but it would be a pain.  Instead, the regular linker sets up
+   these structures, and then passes them into BFD.  */
+
+/* Regular expressions for a version.  */
+
+struct bfd_elf_version_expr
+{
+  /* Next regular expression for this version.  */
+  struct bfd_elf_version_expr *next;
+  /* Regular expression.  */
+  const char *pattern;
+  /* Matching function.  */
+  int (*match) PARAMS((struct bfd_elf_version_expr *, const char *));
+};
+
+/* Version dependencies.  */
+
+struct bfd_elf_version_deps
+{
+  /* Next dependency for this version.  */
+  struct bfd_elf_version_deps *next;
+  /* The version which this version depends upon.  */
+  struct bfd_elf_version_tree *version_needed;
+};
+
+/* A node in the version tree.  */
+
+struct bfd_elf_version_tree
+{
+  /* Next version.  */
+  struct bfd_elf_version_tree *next;
+  /* Name of this version.  */
+  const char *name;
+  /* Version number.  */
+  unsigned int vernum;
+  /* Regular expressions for global symbols in this version.  */
+  struct bfd_elf_version_expr *globals;
+  /* Regular expressions for local symbols in this version.  */
+  struct bfd_elf_version_expr *locals;
+  /* List of versions which this version depends upon.  */
+  struct bfd_elf_version_deps *deps;
+  /* Index of the version name.  This is used within BFD.  */
+  unsigned int name_indx;
+  /* Whether this version tree was used.  This is used within BFD.  */
+  int used;
+};
+
 #endif
This page took 0.025865 seconds and 4 git commands to generate.