Touches most files in bfd/, so likely will be blamed for everything..
[deliverable/binutils-gdb.git] / bfd / bfd.c
index 1f92762d2c3824c52d04b118f2389c5bd7915f21..067c021a5d57f322dd22c90f85b46bd96e9914f4 100644 (file)
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -37,7 +37,7 @@ CODE_FRAGMENT
 .struct _bfd
 .{
 .    {* The filename the application opened the BFD with.  *}
-.    CONST char *filename;
+.    const char *filename;
 .
 .    {* A pointer to the target jump table.             *}
 .    const struct bfd_target *xvec;
@@ -70,7 +70,7 @@ CODE_FRAGMENT
 .    {* When a file is closed by the caching routines, BFD retains
 .       state information on the file here: *}
 .
-.    file_ptr where;
+.    ufile_ptr where;
 .
 .    {* and here: (``once'' means at least once) *}
 .
@@ -108,7 +108,7 @@ CODE_FRAGMENT
 .       anything. I believe that this can become always an add of
 .       origin, with origin set to 0 for non archive files.   *}
 .
-.    file_ptr origin;
+.    ufile_ptr origin;
 .
 .    {* Remember when output has begun, to stop strange things
 .       from happening. *}
@@ -248,6 +248,7 @@ CODE_FRAGMENT
 .  bfd_error_system_call,
 .  bfd_error_invalid_target,
 .  bfd_error_wrong_format,
+.  bfd_error_wrong_object_format,
 .  bfd_error_invalid_operation,
 .  bfd_error_no_memory,
 .  bfd_error_no_symbols,
@@ -269,27 +270,29 @@ CODE_FRAGMENT
 
 static bfd_error_type bfd_error = bfd_error_no_error;
 
-CONST char *CONST bfd_errmsgs[] = {
-                        N_("No error"),
-                        N_("System call error"),
-                        N_("Invalid bfd target"),
-                        N_("File in wrong format"),
-                        N_("Invalid operation"),
-                        N_("Memory exhausted"),
-                        N_("No symbols"),
-                       N_("Archive has no index; run ranlib to add one"),
-                        N_("No more archived files"),
-                        N_("Malformed archive"),
-                        N_("File format not recognized"),
-                        N_("File format is ambiguous"),
-                        N_("Section has no contents"),
-                        N_("Nonrepresentable section on output"),
-                       N_("Symbol needs debug section which does not exist"),
-                       N_("Bad value"),
-                       N_("File truncated"),
-                       N_("File too big"),
-                        N_("#<Invalid error code>")
-                       };
+const char *const bfd_errmsgs[] =
+{
+  N_("No error"),
+  N_("System call error"),
+  N_("Invalid bfd target"),
+  N_("File in wrong format"),
+  N_("Archive object file in wrong format"),
+  N_("Invalid operation"),
+  N_("Memory exhausted"),
+  N_("No symbols"),
+  N_("Archive has no index; run ranlib to add one"),
+  N_("No more archived files"),
+  N_("Malformed archive"),
+  N_("File format not recognized"),
+  N_("File format is ambiguous"),
+  N_("Section has no contents"),
+  N_("Nonrepresentable section on output"),
+  N_("Symbol needs debug section which does not exist"),
+  N_("Bad value"),
+  N_("File truncated"),
+  N_("File too big"),
+  N_("#<Invalid error code>")
+};
 
 /*
 FUNCTION
@@ -331,14 +334,14 @@ FUNCTION
        bfd_errmsg
 
 SYNOPSIS
-       CONST char *bfd_errmsg (bfd_error_type error_tag);
+       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 *
+const char *
 bfd_errmsg (error_tag)
      bfd_error_type error_tag;
 {
@@ -348,8 +351,8 @@ bfd_errmsg (error_tag)
   if (error_tag == bfd_error_system_call)
     return xstrerror (errno);
 
-  if ((((int)error_tag <(int) bfd_error_no_error) ||
-       ((int)error_tag > (int)bfd_error_invalid_error_code)))
+  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]);
@@ -360,7 +363,7 @@ FUNCTION
        bfd_perror
 
 SYNOPSIS
-       void bfd_perror (CONST char *message);
+       void bfd_perror (const char *message);
 
 DESCRIPTION
        Print to the standard error stream a string describing the
@@ -372,16 +375,18 @@ DESCRIPTION
 
 void
 bfd_perror (message)
-     CONST char *message;
+     const char *message;
 {
   if (bfd_get_error () == bfd_error_system_call)
-    perror((char *)message);            /* must be system error then...  */
-  else {
-    if (message == NULL || *message == '\0')
-      fprintf (stderr, "%s\n", bfd_errmsg (bfd_get_error ()));
-    else
-      fprintf (stderr, "%s: %s\n", message, bfd_errmsg (bfd_get_error ()));
-  }
+    /* Must be a system error then.  */
+    perror ((char *)message);
+  else
+    {
+      if (message == NULL || *message == '\0')
+       fprintf (stderr, "%s\n", bfd_errmsg (bfd_get_error ()));
+      else
+       fprintf (stderr, "%s: %s\n", message, bfd_errmsg (bfd_get_error ()));
+    }
 }
 
 /*
@@ -550,10 +555,11 @@ 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 -1;
-  }
+  if (abfd->format != bfd_object)
+    {
+      bfd_set_error (bfd_error_invalid_operation);
+      return -1;
+    }
 
   return BFD_SEND (abfd, _get_reloc_upper_bound, (abfd, asect));
 }
@@ -589,10 +595,12 @@ bfd_canonicalize_reloc (abfd, asect, location, symbols)
      arelent **location;
      asymbol **symbols;
 {
-  if (abfd->format != bfd_object) {
-    bfd_set_error (bfd_error_invalid_operation);
-    return -1;
-  }
+  if (abfd->format != bfd_object)
+    {
+      bfd_set_error (bfd_error_invalid_operation);
+      return -1;
+    }
+
   return BFD_SEND (abfd, _bfd_canonicalize_reloc,
                   (abfd, asect, location, symbols));
 }
@@ -648,23 +656,26 @@ bfd_set_file_flags (abfd, flags)
      bfd *abfd;
      flagword flags;
 {
-  if (abfd->format != bfd_object) {
-    bfd_set_error (bfd_error_wrong_format);
-    return false;
-  }
+  if (abfd->format != bfd_object)
+    {
+      bfd_set_error (bfd_error_wrong_format);
+      return false;
+    }
 
-  if (bfd_read_p (abfd)) {
-    bfd_set_error (bfd_error_invalid_operation);
-    return false;
-  }
+  if (bfd_read_p (abfd))
+    {
+      bfd_set_error (bfd_error_invalid_operation);
+      return false;
+    }
 
   bfd_get_file_flags (abfd) = flags;
-  if ((flags & bfd_applicable_file_flags (abfd)) != flags) {
-    bfd_set_error (bfd_error_invalid_operation);
-    return false;
-  }
+  if ((flags & bfd_applicable_file_flags (abfd)) != flags)
+    {
+      bfd_set_error (bfd_error_invalid_operation);
+      return false;
+    }
 
-return true;
+  return true;
 }
 
 void
@@ -752,9 +763,21 @@ int
 bfd_get_sign_extend_vma (abfd)
      bfd *abfd;
 {
+  char *name;
+
   if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
     return (get_elf_backend_data (abfd)->sign_extend_vma);
 
+  name = bfd_get_target (abfd);
+
+  /* Return a proper value for DJGPP COFF (an x86 COFF variant).
+     This function is required for DWARF2 support, but there is
+     no place to store this information in the COFF back end.
+     Should enough other COFF targets add support for DWARF2,
+     a place will have to be found.  Until then, this hack will do.  */
+  if (strncmp (name, "coff-go32", sizeof ("coff-go32") - 1) == 0)
+    return 1;
+
   bfd_set_error (bfd_error_wrong_format);
   return -1;
 }
@@ -774,9 +797,9 @@ RETURNS
 */
 
 boolean
-bfd_set_start_address(abfd, vma)
-bfd *abfd;
-bfd_vma vma;
+bfd_set_start_address (abfd, vma)
+     bfd *abfd;
+     bfd_vma vma;
 {
   abfd->start_address = vma;
   return true;
@@ -857,7 +880,7 @@ bfd_get_size (abfd)
     return ((struct bfd_in_memory *) abfd->iostream)->size;
 
   fp = bfd_cache_lookup (abfd);
-  if (0 != fstat (fileno (fp), &buf))
+  if (0 != fstat (fileno (fp), & buf))
     return 0;
 
   return buf.st_size;
@@ -868,7 +891,7 @@ FUNCTION
        bfd_get_gp_size
 
 SYNOPSIS
-       int bfd_get_gp_size(bfd *abfd);
+       unsigned int bfd_get_gp_size(bfd *abfd);
 
 DESCRIPTION
        Return the maximum size of objects to be optimized using the GP
@@ -876,7 +899,7 @@ DESCRIPTION
        argument to the compiler, assembler or linker.
 */
 
-int
+unsigned int
 bfd_get_gp_size (abfd)
      bfd *abfd;
 {
@@ -895,7 +918,7 @@ FUNCTION
        bfd_set_gp_size
 
 SYNOPSIS
-       void bfd_set_gp_size(bfd *abfd, int i);
+       void bfd_set_gp_size(bfd *abfd, unsigned int i);
 
 DESCRIPTION
        Set the maximum size of objects to be optimized using the GP
@@ -906,11 +929,12 @@ DESCRIPTION
 void
 bfd_set_gp_size (abfd, i)
      bfd *abfd;
-     int i;
+     unsigned int i;
 {
-  /* Don't try to set GP size on an archive or core file! */
+  /* 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)
@@ -925,13 +949,14 @@ bfd_vma
 _bfd_get_gp_value (abfd)
      bfd *abfd;
 {
-  if (abfd->format == bfd_object)
-    {
-      if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
-       return ecoff_data (abfd)->gp;
-      else if (abfd->xvec->flavour == bfd_target_elf_flavour)
-       return elf_gp (abfd);
-    }
+  if (abfd->format != bfd_object)
+    return 0;
+
+  if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
+    return ecoff_data (abfd)->gp;
+  else if (abfd->xvec->flavour == bfd_target_elf_flavour)
+    return elf_gp (abfd);
+
   return 0;
 }
 
@@ -944,6 +969,7 @@ _bfd_set_gp_value (abfd, v)
 {
   if (abfd->format != bfd_object)
     return;
+
   if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
     ecoff_data (abfd)->gp = v;
   else if (abfd->xvec->flavour == bfd_target_elf_flavour)
@@ -955,7 +981,7 @@ FUNCTION
        bfd_scan_vma
 
 SYNOPSIS
-       bfd_vma bfd_scan_vma(CONST char *string, CONST char **end, int base);
+       bfd_vma bfd_scan_vma(const char *string, const char **end, int base);
 
 DESCRIPTION
        Convert, like <<strtoul>>, a numerical expression
@@ -972,8 +998,8 @@ DESCRIPTION
 
 bfd_vma
 bfd_scan_vma (string, end, base)
-     CONST char *string;
-     CONST char **end;
+     const char *string;
+     const char **end;
      int base;
 {
   bfd_vma value;
@@ -993,17 +1019,18 @@ bfd_scan_vma (string, end, base)
        {
          if ((string[1] == 'x') || (string[1] == 'X'))
            base = 16;
-         /* XXX should we also allow "0b" or "0B" to set base to 2? */
+         /* XXX should we also allow "0b" or "0B" to set base to 2?  */
          else
            base = 8;
        }
       else
        base = 10;
     }
+
   if ((base == 16) &&
       (string[0] == '0') && ((string[1] == 'x') || (string[1] == 'X')))
     string += 2;
-  /* XXX should we also skip over "0b" or "0B" if base is 2? */
+  /* XXX should we also skip over "0b" or "0B" if base is 2?  */
 
 /* Speed could be improved with a table like hex_value[] in gas.  */
 #define HEX_VALUE(c) \
@@ -1013,13 +1040,11 @@ bfd_scan_vma (string, end, base)
       : (10 + c - (islower ((unsigned char) c) ? 'a' : 'A')))  \
    : 42)
 
-  for (value = 0; (digit = HEX_VALUE(*string)) < base; string++)
-    {
-      value = value * base + digit;
-    }
+  for (value = 0; (digit = HEX_VALUE (* string)) < base; string ++)
+    value = value * base + digit;
 
   if (end)
-    *end = string;
+    * end = string;
 
   return value;
 }
@@ -1182,11 +1207,12 @@ bfd_get_relocated_section_contents (abfd, link_info, link_order, data,
   if (link_order->type == bfd_indirect_link_order)
     {
       abfd2 = link_order->u.indirect.section->owner;
-      if (abfd2 == 0)
+      if (abfd2 == NULL)
        abfd2 = abfd;
     }
   else
     abfd2 = abfd;
+
   fn = abfd2->xvec->_bfd_get_relocated_section_contents;
 
   return (*fn) (abfd, link_info, link_order, data, relocateable, symbols);
@@ -1209,14 +1235,14 @@ bfd_record_phdr (abfd, type, flags_valid, flags, at_valid, at,
      asection **secs;
 {
   struct elf_segment_map *m, **pm;
+  bfd_size_type amt;
 
   if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
     return true;
 
-  m = ((struct elf_segment_map *)
-       bfd_alloc (abfd,
-                 (sizeof (struct elf_segment_map)
-                  + ((size_t) count - 1) * sizeof (asection *))));
+  amt = sizeof (struct elf_segment_map);
+  amt += ((bfd_size_type) count - 1) * sizeof (asection *);
+  m = (struct elf_segment_map *) bfd_alloc (abfd, amt);
   if (m == NULL)
     return false;
 
@@ -1238,3 +1264,82 @@ bfd_record_phdr (abfd, type, flags_valid, flags, at_valid, at,
 
   return true;
 }
+
+void
+bfd_sprintf_vma (abfd, buf, value)
+     bfd *abfd;
+     char *buf;
+     bfd_vma value;
+{
+  if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
+    get_elf_backend_data (abfd)->elf_backend_sprintf_vma (abfd, buf, value);
+  else
+    sprintf_vma (buf, value);
+}
+
+void
+bfd_fprintf_vma (abfd, stream, value)
+     bfd *abfd;
+     PTR stream;
+     bfd_vma value;
+{
+  if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
+    get_elf_backend_data (abfd)->elf_backend_fprintf_vma (abfd, stream, value);
+  else
+    fprintf_vma ((FILE *) stream, value);
+}
+
+/*
+FUNCTION
+       bfd_alt_mach_code
+
+SYNOPSIS
+       boolean bfd_alt_mach_code(bfd *abfd, int index);
+
+DESCRIPTION
+
+       When more than one machine code number is available for the
+       same machine type, this function can be used to switch between
+       the preferred one (index == 0) and any others.  Currently,
+       only ELF supports this feature, with up to two alternate
+       machine codes.
+*/
+
+boolean
+bfd_alt_mach_code (abfd, index)
+     bfd *abfd;
+     int index;
+{
+  if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
+    {
+      int code;
+
+      switch (index)
+       {
+       case 0:
+         code = get_elf_backend_data (abfd)->elf_machine_code;
+         break;
+
+       case 1:
+         code = get_elf_backend_data (abfd)->elf_machine_alt1;
+         if (code == 0)
+           return false;
+         break;
+
+       case 2:
+         code = get_elf_backend_data (abfd)->elf_machine_alt2;
+         if (code == 0)
+           return false;
+         break;
+
+       default:
+         return false;
+       }
+
+      elf_elfheader (abfd)->e_machine = code;
+
+      return true;
+    }
+
+  return false;
+}
This page took 0.029142 seconds and 4 git commands to generate.