* remote.c (remote_open_1): If an error occurs starting the remote, pop the
[deliverable/binutils-gdb.git] / include / bfdlink.h
index ad71ca4ec19c07174b7489cfc0cfdb6e342607e5..8cf3ac0d96fc792d2cd9ed00f07326b8fc551b01 100644 (file)
@@ -16,7 +16,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
@@ -46,8 +46,9 @@ enum bfd_link_hash_type
 {
   bfd_link_hash_new,           /* Symbol is new.  */
   bfd_link_hash_undefined,     /* Symbol seen before, but undefined.  */
-  bfd_link_hash_weak,          /* Symbol is weak and undefined.  */
+  bfd_link_hash_undefweak,     /* Symbol is weak and undefined.  */
   bfd_link_hash_defined,       /* Symbol is defined.  */
+  bfd_link_hash_defweak,       /* Symbol is weak and defined.  */
   bfd_link_hash_common,                /* Symbol is common.  */
   bfd_link_hash_indirect,      /* Symbol is an indirect link.  */
   bfd_link_hash_warning                /* Like indirect, but warn if referenced.  */
@@ -62,9 +63,8 @@ struct bfd_link_hash_entry
   struct bfd_hash_entry root;
   /* Type of this entry.  */
   enum bfd_link_hash_type type;
-  /* Whether this symbol has been written out.  */
-  boolean written;
-  /* Undefined and common entries are kept in a linked list through
+
+  /* Undefined and common symbols are kept in a linked list through
      this field.  This field is not in the union because that would
      force us to remove entries from the list when we changed their
      type, which would force the list to be doubly linked, which would
@@ -72,19 +72,27 @@ struct bfd_link_hash_entry
      created, it should be added to this list, the head of which is in
      the link hash table itself.  As symbols are defined, they need
      not be removed from the list; anything which reads the list must
-     doublecheck the symbol type.  Weak symbols are not kept on this
-     list.  */
+     doublecheck the symbol type.
+
+     Weak symbols are not kept on this list.
+
+     Defined and defweak symbols use this field as a reference marker.
+     If the field is not NULL, or this structure is the tail of the
+     undefined symbol list, the symbol has been referenced.  If the
+     symbol is undefined and becomes defined, this field will
+     automatically be non-NULL since the symbol will have been on the
+     undefined symbol list.  */
   struct bfd_link_hash_entry *next;
   /* A union of information depending upon the type.  */
   union
     {
       /* Nothing is kept for bfd_hash_new.  */
-      /* bfd_link_hash_undefined, bfd_link_hash_weak.  */
+      /* bfd_link_hash_undefined, bfd_link_hash_undefweak.  */
       struct
        {
          bfd *abfd;            /* BFD symbol was found in.  */
        } undef;
-      /* bfd_link_hash_defined.  */
+      /* bfd_link_hash_defined, bfd_link_hash_defweak.  */
       struct
        {
          bfd_vma value;        /* Symbol value.  */
@@ -99,8 +107,21 @@ struct bfd_link_hash_entry
       /* bfd_link_hash_common.  */
       struct
        {
-         bfd_vma size;         /* Common symbol size.  */
-         asection *section;    /* Symbol section.  */
+         /* The linker needs to know three things about common
+             symbols: the size, the alignment, and the section in
+             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;
 };
@@ -116,7 +137,7 @@ struct bfd_link_hash_table
      type of the entries in the hash table, which is sometimes
      important information when linking object files of different
      types together.  */
-  bfd_target *creator;
+  const bfd_target *creator;
   /* A linked list of undefined and common symbols, linked through the
      next field in the bfd_link_hash_entry structure.  */
   struct bfd_link_hash_entry *undefs;
@@ -150,6 +171,12 @@ 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 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;
   /* Which symbols to strip.  */
   enum bfd_link_strip strip;
   /* Which local symbols to discard.  */
@@ -177,6 +204,9 @@ struct bfd_link_info
   /* Hash table of symbols to report back via notice_callback.  If
      this is NULL no symbols are reported back.  */
   struct bfd_hash_table *notice_hash;
+
+  /* If a base output file is wanted, then this points to it */
+  PTR base_file;
 };
 
 /* This structures holds a set of callback functions.  These are
@@ -211,13 +241,15 @@ struct bfd_link_callbacks
                                          bfd_vma nval));
   /* A function which is called when a common symbol is defined
      multiple times.  NAME is the symbol appearing multiple times.
-     OBFD is the BFD of the existing symbol.  OTYPE is the type of the
-     existing symbol, either bfd_link_hash_defined or
-     bfd_link_hash_common.  If OTYPE is bfd_link_hash_common, OSIZE is
-     the size of the existing symbol.  NBFD is the BFD of the new
-     symbol.  NTYPE is the type of the new symbol, either
-     bfd_link_hash_defined or bfd_link_hash_common.  If NTYPE is
-     bfd_link_hash_common, NSIZE is the size of the new symbol.  */
+     OBFD is the BFD of the existing symbol; it may be NULL if this is
+     not known.  OTYPE is the type of the existing symbol, which may
+     be bfd_link_hash_defined, bfd_link_hash_defweak,
+     bfd_link_hash_common, or bfd_link_hash_indirect.  If OTYPE is
+     bfd_link_hash_common, OSIZE is the size of the existing symbol.
+     NBFD is the BFD of the new symbol.  NTYPE is the type of the new
+     symbol, one of bfd_link_hash_defined, bfd_link_hash_common, or
+     bfd_link_hash_indirect.  If NTYPE is bfd_link_hash_common, NSIZE
+     is the size of the new symbol.  */
   boolean (*multiple_common) PARAMS ((struct bfd_link_info *,
                                      const char *name,
                                      bfd *obfd,
@@ -246,14 +278,21 @@ 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.  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));
@@ -308,6 +347,7 @@ enum bfd_link_order_type
   bfd_undefined_link_order,    /* Undefined.  */
   bfd_indirect_link_order,     /* Built from a section.  */
   bfd_fill_link_order,         /* Fill with a 16 bit constant.  */
+  bfd_data_link_order,         /* Set to explicit data.  */
   bfd_section_reloc_link_order,        /* Relocate against a section.  */
   bfd_symbol_reloc_link_order  /* Relocate against a symbol.  */
 };
@@ -343,6 +383,12 @@ struct bfd_link_order
          /* Value to fill with.  */
          unsigned int value;
        } fill;
+      struct
+       {
+         /* Data to put into file.  The size field gives the number
+            of bytes which this field points to.  */
+         bfd_byte *contents;
+       } data;
       struct
        {
          /* Description of reloc to generate.  Used for
This page took 0.030573 seconds and 4 git commands to generate.