]> Git Repo - binutils.git/blobdiff - bfd/bfd.c
* stabs.texinfo (Type Descriptors): Add 'Y' type descriptor.
[binutils.git] / bfd / bfd.c
index c28b1409e7253f2f856892a1a1ccdc353333b3c0..1a78c6ea27fb1ad1c8b578795f762fa3ab554d54 100644 (file)
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -1,5 +1,5 @@
 /* Generic BFD library interface and support routines.
 /* Generic BFD library interface and support routines.
-   Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+   Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc.
    Written by Cygnus Support.
 
 This file is part of BFD, the Binary File Descriptor library.
    Written by Cygnus Support.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -23,7 +23,7 @@ SECTION
        <<typedef bfd>>
 
        A BFD has type <<bfd>>; objects of this type are the
        <<typedef bfd>>
 
        A BFD has type <<bfd>>; objects of this type are the
-       cornerstone of any application using <<libbfd>>. Using BFD
+       cornerstone of any application using BFD. Using BFD
        consists of making references though the BFD and to data in the BFD.
 
        Here is the structure that defines the type <<bfd>>.  It
        consists of making references though the BFD and to data in the BFD.
 
        Here is the structure that defines the type <<bfd>>.  It
@@ -136,6 +136,13 @@ CODE_FRAGMENT
 .    struct _bfd *archive_head;   {* The first BFD in the archive.  *}
 .    boolean has_armap;           
 .
 .    struct _bfd *archive_head;   {* The first BFD in the archive.  *}
 .    boolean has_armap;           
 .
+.    {* A chain of BFD structures involved in a link.  *}
+.    struct _bfd *link_next;
+.
+.    {* A field used by _bfd_generic_link_add_archive_symbols.  This will
+.       be used only for archive elements.  *}
+.    int archive_pass;
+.
 .    {* Used by the back end to hold private data. *}
 .
 .    union 
 .    {* Used by the back end to hold private data. *}
 .
 .    union 
@@ -157,6 +164,7 @@ CODE_FRAGMENT
 .      struct trad_core_struct *trad_core_data;
 .      struct som_data_struct *som_data;
 .      struct hpux_core_struct *hpux_core_data;
 .      struct trad_core_struct *trad_core_data;
 .      struct som_data_struct *som_data;
 .      struct hpux_core_struct *hpux_core_data;
+.      struct hppabsd_core_struct *hppabsd_core_data;
 .      struct sgi_core_struct *sgi_core_data;
 .      struct lynx_core_struct *lynx_core_data;
 .      struct osf_core_struct *osf_core_data;
 .      struct sgi_core_struct *sgi_core_data;
 .      struct lynx_core_struct *lynx_core_data;
 .      struct osf_core_struct *osf_core_data;
@@ -168,15 +176,13 @@ CODE_FRAGMENT
 .
 .    {* Where all the allocated stuff under this BFD goes *}
 .    struct obstack memory;
 .
 .    {* Where all the allocated stuff under this BFD goes *}
 .    struct obstack memory;
-.
-.    {* Is this really needed in addition to usrdata?  *}
-.    asymbol **ld_symbols;
 .};
 .
 */
 
 #include "bfd.h"
 #include "sysdep.h"
 .};
 .
 */
 
 #include "bfd.h"
 #include "sysdep.h"
+#include "bfdlink.h"
 #include "libbfd.h"
 #include "coff/internal.h"
 #include "coff/sym.h"
 #include "libbfd.h"
 #include "coff/internal.h"
 #include "coff/sym.h"
@@ -185,31 +191,67 @@ CODE_FRAGMENT
 #undef obj_symbols
 #include "libelf.h"
 
 #undef obj_symbols
 #include "libelf.h"
 
-#undef strerror
-extern char *strerror();
+\f
+/*
+SECTION
+       Error reporting
+
+       Most BFD functions return nonzero on success (check their
+       individual documentation for precise semantics).  On an error,
+       they call <<bfd_set_error>> to set an error condition that callers
+       can check by calling <<bfd_get_error>>.
+        If that returns <<bfd_error_system_call>>, then check
+       <<errno>>.
 
 
-/** Error handling
-    o - Most functions return nonzero on success (check doc for
-        precise semantics); 0 or NULL on error.
-    o - Internal errors are documented by the value of bfd_error.
-        If that is system_call_error then check errno.
-    o - The easiest way to report this to the user is to use bfd_perror.
+       The easiest way to report a BFD error to the user is to
+       use <<bfd_perror>>.
+
+SUBSECTION
+       Type <<bfd_error_type>>
+
+       The values returned by <<bfd_get_error>> are defined by the
+       enumerated type <<bfd_error_type>>.
+
+CODE_FRAGMENT
+.
+.typedef enum bfd_error
+.{
+.  bfd_error_no_error = 0,
+.  bfd_error_system_call,
+.  bfd_error_invalid_target,
+.  bfd_error_wrong_format,
+.  bfd_error_invalid_operation,
+.  bfd_error_no_memory,
+.  bfd_error_no_symbols,
+.  bfd_error_no_more_archived_files,
+.  bfd_error_malformed_archive,
+.  bfd_error_file_not_recognized,
+.  bfd_error_file_ambiguously_recognized,
+.  bfd_error_no_contents,
+.  bfd_error_nonrepresentable_section,
+.  bfd_error_no_debug_section,
+.  bfd_error_bad_value,
+.  bfd_error_file_truncated,
+.  bfd_error_invalid_error_code
+.} bfd_error_type;
+.
 */
 
 */
 
-bfd_ec bfd_error = no_error;
+#undef strerror
+extern char *strerror();
+
+static bfd_error_type bfd_error = bfd_error_no_error;
 
 CONST char *CONST bfd_errmsgs[] = {
                         "No error",
                         "System call error",
 
 CONST char *CONST bfd_errmsgs[] = {
                         "No error",
                         "System call error",
-                        "Invalid target",
+                        "Invalid bfd target",
                         "File in wrong format",
                         "Invalid operation",
                         "Memory exhausted",
                         "No symbols",
                         "File in wrong format",
                         "Invalid operation",
                         "Memory exhausted",
                         "No symbols",
-                        "No relocation info",
                         "No more archived files",
                         "Malformed archive",
                         "No more archived files",
                         "Malformed archive",
-                        "Symbol not found",
                         "File format not recognized",
                         "File format is ambiguous",
                         "Section has no contents",
                         "File format not recognized",
                         "File format is ambiguous",
                         "Section has no contents",
@@ -220,103 +262,197 @@ CONST char *CONST bfd_errmsgs[] = {
                         "#<Invalid error code>"
                        };
 
                         "#<Invalid error code>"
                        };
 
-static 
-void 
-DEFUN(bfd_nonrepresentable_section,(abfd, name),
-         CONST  bfd * CONST abfd AND
-         CONST  char * CONST name)
-{
-  fprintf(stderr,
-         "bfd error writing file %s, format %s can't represent section %s\n",
-         abfd->filename, 
-         abfd->xvec->name,
-         name);
-  exit(1);
-}
+/*
+FUNCTION
+       bfd_get_error
 
 
-/*ARGSUSED*/
-static 
-void 
-DEFUN(bfd_undefined_symbol,(relent, seclet),
-      CONST  arelent *relent AND
-      CONST  struct bfd_seclet *seclet)
-{
-  asymbol *symbol = *(relent->sym_ptr_ptr);
-  fprintf(stderr, "bfd error relocating, symbol %s is undefined\n",
-         symbol->name);
-  exit(1);
-}
-/*ARGSUSED*/
-static 
-void 
-DEFUN(bfd_reloc_value_truncated,(relent, seclet),
-         CONST  arelent *relent AND
-      struct bfd_seclet *seclet)
+SYNOPSIS
+       bfd_error_type bfd_get_error (void);
+
+DESCRIPTION
+       Return the current BFD error condition.
+*/
+
+bfd_error_type
+bfd_get_error ()
 {
 {
-  fprintf(stderr, "bfd error relocating, value truncated\n");
-  exit(1);
+  return bfd_error;
 }
 }
-/*ARGSUSED*/
-static 
-void 
-DEFUN(bfd_reloc_is_dangerous,(relent, seclet),
-      CONST  arelent *relent AND
-     CONST  struct bfd_seclet *seclet)
+
+/*
+FUNCTION
+       bfd_set_error
+
+SYNOPSIS
+       void bfd_set_error (bfd_error_type error_tag);
+
+DESCRIPTION
+       Set the BFD error condition to be @var{error_tag}.
+*/
+
+void
+bfd_set_error (error_tag)
+     bfd_error_type error_tag;
 {
 {
-  fprintf(stderr, "bfd error relocating, dangerous\n");
-  exit(1);
+  bfd_error = error_tag;
 }
 
 }
 
-bfd_error_vector_type bfd_error_vector = 
-  {
-  bfd_nonrepresentable_section ,
-  bfd_undefined_symbol,
-  bfd_reloc_value_truncated,
-  bfd_reloc_is_dangerous,
-  };
+/*
+FUNCTION
+       bfd_errmsg
+
+SYNOPSIS
+       CONST char *bfd_errmsg (bfd_error_type error_tag);
 
 
+DESCRIPTION
+       Return a string describing the error @var{error_tag}, or
+       the system error if @var{error_tag} is <<bfd_error_system_call>>.
+*/
 
 CONST char *
 bfd_errmsg (error_tag)
 
 CONST char *
 bfd_errmsg (error_tag)
-     bfd_ec error_tag;
+     bfd_error_type error_tag;
 {
 #ifndef errno
   extern int errno;
 #endif
 {
 #ifndef errno
   extern int errno;
 #endif
-  if (error_tag == system_call_error)
+  if (error_tag == bfd_error_system_call)
     return strerror (errno);
 
     return strerror (errno);
 
-  if ((((int)error_tag <(int) no_error) ||
-       ((int)error_tag > (int)invalid_error_code)))
-    error_tag = invalid_error_code;/* sanity check */
+  if ((((int)error_tag <(int) bfd_error_no_error) ||
+       ((int)error_tag > (int)bfd_error_invalid_error_code)))
+    error_tag = bfd_error_invalid_error_code;/* sanity check */
 
   return bfd_errmsgs [(int)error_tag];
 }
 
 
   return bfd_errmsgs [(int)error_tag];
 }
 
-void
-DEFUN (bfd_default_error_trap, (error_tag),
-       bfd_ec error_tag)
-{
-  fprintf(stderr, "bfd assert fail (%s)\n", bfd_errmsg(error_tag));
-}
+/*
+FUNCTION
+       bfd_perror
 
 
-void (*bfd_error_trap) PARAMS ((bfd_ec)) = bfd_default_error_trap;
-void (*bfd_error_nonrepresentabltrap) PARAMS ((bfd_ec)) = bfd_default_error_trap;
+SYNOPSIS
+       void bfd_perror (CONST char *message);
+
+DESCRIPTION
+       Print to the standard error stream a string describing the
+       last BFD error that occurred, or the last system error if
+       the last BFD error was a system call failure.  If @var{message}
+       is non-NULL and non-empty, the error string printed is preceded
+       by @var{message}, a colon, and a space.  It is followed by a newline.
+*/
 
 void
 
 void
-DEFUN(bfd_perror,(message),
-      CONST char *message)
+bfd_perror (message)
+     CONST char *message;
 {
 {
-  if (bfd_error == system_call_error)
+  if (bfd_get_error () == bfd_error_system_call)
     perror((char *)message);            /* must be system error then... */
   else {
     if (message == NULL || *message == '\0')
     perror((char *)message);            /* must be system error then... */
   else {
     if (message == NULL || *message == '\0')
-      fprintf (stderr, "%s\n", bfd_errmsg (bfd_error));
+      fprintf (stderr, "%s\n", bfd_errmsg (bfd_get_error ()));
     else
     else
-      fprintf (stderr, "%s: %s\n", message, bfd_errmsg (bfd_error));
+      fprintf (stderr, "%s: %s\n", message, bfd_errmsg (bfd_get_error ()));
   }
 }
 
   }
 }
 
+\f
+/*
+SECTION
+       Symbols
+*/
+
+/*
+FUNCTION
+       bfd_get_reloc_upper_bound
+
+SYNOPSIS
+       unsigned int bfd_get_reloc_upper_bound(bfd *abfd, asection *sect);
+
+DESCRIPTION
+       Return the number of bytes required to store the
+       relocation information associated with section @var{sect}
+       attached to bfd @var{abfd}.
+
+*/
+
+
+unsigned int
+bfd_get_reloc_upper_bound (abfd, asect)
+     bfd *abfd;
+     sec_ptr asect;
+{
+  if (abfd->format != bfd_object) {
+    bfd_set_error (bfd_error_invalid_operation);
+    return 0;
+  }
+
+  return BFD_SEND (abfd, _get_reloc_upper_bound, (abfd, asect));
+}
+
+/*
+FUNCTION
+       bfd_canonicalize_reloc
+
+SYNOPSIS
+       unsigned int bfd_canonicalize_reloc
+               (bfd *abfd,
+               asection *sec,
+               arelent **loc,
+               asymbol **syms);
+
+DESCRIPTION
+       Call the back end associated with the open BFD
+       @var{abfd} and translate the external form of the relocation
+       information attached to @var{sec} into the internal canonical
+       form.  Place the table into memory at @var{loc}, which has
+       been preallocated, usually by a call to
+       <<bfd_get_reloc_upper_bound>>.
+
+       The @var{syms} table is also needed for horrible internal magic
+       reasons.
+
+
+*/
+unsigned int
+bfd_canonicalize_reloc (abfd, asect, location, symbols)
+     bfd *abfd;
+     sec_ptr asect;
+     arelent **location;
+     asymbol **symbols;
+{
+  if (abfd->format != bfd_object) {
+    bfd_set_error (bfd_error_invalid_operation);
+    return 0;
+  }
+  return BFD_SEND (abfd, _bfd_canonicalize_reloc,
+                  (abfd, asect, location, symbols));
+}
+
+/*
+FUNCTION
+       bfd_set_reloc
+
+SYNOPSIS
+       void bfd_set_reloc
+         (bfd *abfd, asection *sec, arelent **rel, unsigned int count)
+
+DESCRIPTION
+       Set the relocation pointer and count within
+       section @var{sec} to the values @var{rel} and @var{count}.
+       The argument @var{abfd} is ignored.
+
+*/
+/*ARGSUSED*/
+void
+bfd_set_reloc (ignore_abfd, asect, location, count)
+     bfd *ignore_abfd;
+     sec_ptr asect;
+     arelent **location;
+     unsigned int count;
+{
+  asect->orelocation  = location;
+  asect->reloc_count = count;
+}
 
 /*
 FUNCTION
 
 /*
 FUNCTION
@@ -329,12 +465,12 @@ DESCRIPTION
        Set the flag word in the BFD @var{abfd} to the value @var{flags}.
 
        Possible errors are:
        Set the flag word in the BFD @var{abfd} to the value @var{flags}.
 
        Possible errors are:
-       o wrong_format - The target bfd was not of object format.
-       o invalid_operation - The target bfd was open for reading.
-       o invalid_operation -
+       o <<bfd_error_wrong_format>> - The target bfd was not of object format.
+       o <<bfd_error_invalid_operation>> - The target bfd was open for reading.
+       o <<bfd_error_invalid_operation>> -
        The flag word contained a bit which was not applicable to the
        The flag word contained a bit which was not applicable to the
-       type of file.  E.g., an attempt was made to set the D_PAGED bit
-       on a bfd format which does not support demand paging.
+       type of file.  E.g., an attempt was made to set the <<D_PAGED>> bit
+       on a BFD format which does not support demand paging.
 
 */
 
 
 */
 
@@ -344,18 +480,18 @@ bfd_set_file_flags (abfd, flags)
      flagword flags;
 {
   if (abfd->format != bfd_object) {
      flagword flags;
 {
   if (abfd->format != bfd_object) {
-    bfd_error = wrong_format;
+    bfd_set_error (bfd_error_wrong_format);
     return false;
   }
 
   if (bfd_read_p (abfd)) {
     return false;
   }
 
   if (bfd_read_p (abfd)) {
-    bfd_error = invalid_operation;
+    bfd_set_error (bfd_error_invalid_operation);
     return false;
   }
 
   bfd_get_file_flags (abfd) = flags;
   if ((flags & bfd_applicable_file_flags (abfd)) != flags) {
     return false;
   }
 
   bfd_get_file_flags (abfd) = flags;
   if ((flags & bfd_applicable_file_flags (abfd)) != flags) {
-    bfd_error = invalid_operation;
+    bfd_set_error (bfd_error_invalid_operation);
     return false;
   }
 
     return false;
   }
 
@@ -482,7 +618,7 @@ SYNOPSIS
 
 DESCRIPTION
        Return the maximum size of objects to be optimized using the GP
 
 DESCRIPTION
        Return the maximum size of objects to be optimized using the GP
-       register under MIPS ECOFF.  This is typically set by the -G
+       register under MIPS ECOFF.  This is typically set by the <<-G>>
        argument to the compiler, assembler or linker.
 */
 
        argument to the compiler, assembler or linker.
 */
 
@@ -490,8 +626,13 @@ int
 bfd_get_gp_size (abfd)
      bfd *abfd;
 {
 bfd_get_gp_size (abfd)
      bfd *abfd;
 {
-  if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
-    return ecoff_data (abfd)->gp_size;
+  if (abfd->format == bfd_object)
+    {
+      if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
+       return ecoff_data (abfd)->gp_size;
+      else if (abfd->xvec->flavour == bfd_target_elf_flavour)
+       return elf_gp_size (abfd);
+    }
   return 0;
 }
 
   return 0;
 }
 
@@ -505,7 +646,7 @@ SYNOPSIS
 DESCRIPTION
        Set the maximum size of objects to be optimized using the GP
        register under ECOFF or MIPS ELF.  This is typically set by
 DESCRIPTION
        Set the maximum size of objects to be optimized using the GP
        register under ECOFF or MIPS ELF.  This is typically set by
-       the -G argument to the compiler, assembler or linker.
+       the <<-G>> argument to the compiler, assembler or linker.
 */
 
 void
 */
 
 void
@@ -513,6 +654,9 @@ bfd_set_gp_size (abfd, i)
      bfd *abfd;
      int i;
 {
      bfd *abfd;
      int i;
 {
+  /* Don't try to set GP size on an archive or core file! */
+  if (abfd->format != bfd_object)
+    return;
   if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
     ecoff_data (abfd)->gp_size = i;
   else if (abfd->xvec->flavour == bfd_target_elf_flavour)
   if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
     ecoff_data (abfd)->gp_size = i;
   else if (abfd->xvec->flavour == bfd_target_elf_flavour)
@@ -528,9 +672,9 @@ SYNOPSIS
 
 DESCRIPTION
        Convert, like <<strtoul>>, a numerical expression
 
 DESCRIPTION
        Convert, like <<strtoul>>, a numerical expression
-       @var{string} into a bfd_vma integer, and returns that integer.
+       @var{string} into a <<bfd_vma>> integer, and return that integer.
        (Though without as many bells and whistles as <<strtoul>>.)
        (Though without as many bells and whistles as <<strtoul>>.)
-       The expression is assumed to be unsigned (i.e. positive).
+       The expression is assumed to be unsigned (i.e., positive).
        If given a @var{base}, it is used as the base for conversion.
        A base of 0 causes the function to interpret the string
        in hex if a leading "0x" or "0X" is found, otherwise
        If given a @var{base}, it is used as the base for conversion.
        A base of 0 causes the function to interpret the string
        in hex if a leading "0x" or "0X" is found, otherwise
@@ -540,10 +684,10 @@ DESCRIPTION
 */
 
 bfd_vma
 */
 
 bfd_vma
-DEFUN(bfd_scan_vma,(string, end, base),
-      CONST char *string AND
-      CONST char **end AND
-      int base)
+bfd_scan_vma (string, end, base)
+     CONST char *string;
+     CONST char **end;
+     int base;
 {
   bfd_vma value;
   int digit;
 {
   bfd_vma value;
   int digit;
@@ -623,13 +767,22 @@ DESCRIPTION
 .#define bfd_set_arch_mach(abfd, arch, mach)\
 .        BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach))
 .
 .#define bfd_set_arch_mach(abfd, arch, mach)\
 .        BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach))
 .
-.#define bfd_get_relocated_section_contents(abfd, seclet, data, relocateable) \
-.      BFD_SEND (abfd, _bfd_get_relocated_section_contents, (abfd, seclet, data, relocateable))
+.#define bfd_get_relocated_section_contents(abfd, link_info, link_order, data, relocateable, symbols) \
+.      BFD_SEND (abfd, _bfd_get_relocated_section_contents, \
+.                 (abfd, link_info, link_order, data, relocateable, symbols))
 . 
 . 
-.#define bfd_relax_section(abfd, section, symbols) \
-.       BFD_SEND (abfd, _bfd_relax_section, (abfd, section, symbols))
+.#define bfd_relax_section(abfd, section, link_info, symbols) \
+.       BFD_SEND (abfd, _bfd_relax_section, \
+.                 (abfd, section, link_info, symbols))
+.
+.#define bfd_link_hash_table_create(abfd) \
+.      BFD_SEND (abfd, _bfd_link_hash_table_create, (abfd))
+.
+.#define bfd_link_add_symbols(abfd, info) \
+.      BFD_SEND (abfd, _bfd_link_add_symbols, (abfd, info))
+.
+.#define bfd_final_link(abfd, info) \
+.      BFD_SEND (abfd, _bfd_final_link, (abfd, info))
 .
 .
-.#define bfd_seclet_link(abfd, data, relocateable) \
-.       BFD_SEND (abfd, _bfd_seclet_link, (abfd, data, relocateable))
 
 */
 
 */
This page took 0.036092 seconds and 4 git commands to generate.