Fix compile time warnings about comparisons always being false.
[deliverable/binutils-gdb.git] / bfd / plugin.c
index 30a492369d74f9e3d3f0f396ead4ccbcacad9c39..537ab603110b88550032cf49d8a7c6a354c3f09a 100644 (file)
@@ -1,6 +1,5 @@
 /* Plugin support for BFD.
 /* Plugin support for BFD.
-   Copyright 2009
-   Free Software Foundation, Inc.
+   Copyright (C) 2009-2020 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
 
    This file is part of BFD, the Binary File Descriptor library.
 
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
    MA 02110-1301, USA.  */
 
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
    MA 02110-1301, USA.  */
 
-#include "config.h"
+#include "sysdep.h"
 #include "bfd.h"
 
 #if BFD_SUPPORTS_PLUGINS
 
 #include <assert.h>
 #include "bfd.h"
 
 #if BFD_SUPPORTS_PLUGINS
 
 #include <assert.h>
+#ifdef HAVE_DLFCN_H
 #include <dlfcn.h>
 #include <dlfcn.h>
+#elif defined (HAVE_WINDOWS_H)
+#include <windows.h>
+#else
+#error Unknown how to handle dynamic-load-libraries.
+#endif
 #include <stdarg.h>
 #include "plugin-api.h"
 #include <stdarg.h>
 #include "plugin-api.h"
-#include "sysdep.h"
 #include "plugin.h"
 #include "libbfd.h"
 #include "libiberty.h"
 #include <dirent.h>
 
 #include "plugin.h"
 #include "libbfd.h"
 #include "libiberty.h"
 #include <dirent.h>
 
-#define bfd_plugin_close_and_cleanup                  _bfd_generic_close_and_cleanup
-#define bfd_plugin_bfd_free_cached_info               _bfd_generic_bfd_free_cached_info
-#define bfd_plugin_new_section_hook                   _bfd_generic_new_section_hook
-#define bfd_plugin_get_section_contents               _bfd_generic_get_section_contents
+#if !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H)
+
+#define RTLD_NOW 0      /* Dummy value.  */
+
+static void *
+dlopen (const char *file, int mode ATTRIBUTE_UNUSED)
+{
+  return LoadLibrary (file);
+}
+
+static void *
+dlsym (void *handle, const char *name)
+{
+  return GetProcAddress (handle, name);
+}
+
+static int ATTRIBUTE_UNUSED
+dlclose (void *handle)
+{
+  FreeLibrary (handle);
+  return 0;
+}
+
+static const char *
+dlerror (void)
+{
+  return "Unable to load DLL.";
+}
+
+#endif /* !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H)  */
+
+#define bfd_plugin_close_and_cleanup                 _bfd_generic_close_and_cleanup
+#define bfd_plugin_bfd_free_cached_info                      _bfd_generic_bfd_free_cached_info
+#define bfd_plugin_new_section_hook                  _bfd_generic_new_section_hook
+#define bfd_plugin_get_section_contents                      _bfd_generic_get_section_contents
 #define bfd_plugin_get_section_contents_in_window     _bfd_generic_get_section_contents_in_window
 #define bfd_plugin_get_section_contents_in_window     _bfd_generic_get_section_contents_in_window
-#define bfd_plugin_bfd_copy_private_header_data       _bfd_generic_bfd_copy_private_header_data
-#define bfd_plugin_bfd_merge_private_bfd_data         _bfd_generic_bfd_merge_private_bfd_data
-#define bfd_plugin_bfd_copy_private_header_data       _bfd_generic_bfd_copy_private_header_data
-#define bfd_plugin_bfd_set_private_flags              _bfd_generic_bfd_set_private_flags
+#define bfd_plugin_bfd_copy_private_header_data              _bfd_generic_bfd_copy_private_header_data
+#define bfd_plugin_bfd_merge_private_bfd_data        _bfd_generic_bfd_merge_private_bfd_data
+#define bfd_plugin_bfd_copy_private_header_data              _bfd_generic_bfd_copy_private_header_data
+#define bfd_plugin_bfd_set_private_flags             _bfd_generic_bfd_set_private_flags
 #define bfd_plugin_core_file_matches_executable_p     generic_core_file_matches_executable_p
 #define bfd_plugin_core_file_matches_executable_p     generic_core_file_matches_executable_p
-#define bfd_plugin_bfd_is_local_label_name            _bfd_nosymbols_bfd_is_local_label_name
-#define bfd_plugin_bfd_is_target_special_symbol       ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
-#define bfd_plugin_get_lineno                         _bfd_nosymbols_get_lineno
-#define bfd_plugin_find_nearest_line                  _bfd_nosymbols_find_nearest_line
-#define bfd_plugin_find_inliner_info                  _bfd_nosymbols_find_inliner_info
-#define bfd_plugin_bfd_make_debug_symbol              _bfd_nosymbols_bfd_make_debug_symbol
-#define bfd_plugin_read_minisymbols                   _bfd_generic_read_minisymbols
-#define bfd_plugin_minisymbol_to_symbol               _bfd_generic_minisymbol_to_symbol
-#define bfd_plugin_set_arch_mach                      bfd_default_set_arch_mach
-#define bfd_plugin_set_section_contents               _bfd_generic_set_section_contents
+#define bfd_plugin_bfd_is_local_label_name           _bfd_nosymbols_bfd_is_local_label_name
+#define bfd_plugin_bfd_is_target_special_symbol              _bfd_bool_bfd_asymbol_false
+#define bfd_plugin_get_lineno                        _bfd_nosymbols_get_lineno
+#define bfd_plugin_find_nearest_line                 _bfd_nosymbols_find_nearest_line
+#define bfd_plugin_find_line                         _bfd_nosymbols_find_line
+#define bfd_plugin_find_inliner_info                 _bfd_nosymbols_find_inliner_info
+#define bfd_plugin_get_symbol_version_string         _bfd_nosymbols_get_symbol_version_string
+#define bfd_plugin_bfd_make_debug_symbol             _bfd_nosymbols_bfd_make_debug_symbol
+#define bfd_plugin_read_minisymbols                  _bfd_generic_read_minisymbols
+#define bfd_plugin_minisymbol_to_symbol                      _bfd_generic_minisymbol_to_symbol
+#define bfd_plugin_set_arch_mach                     bfd_default_set_arch_mach
+#define bfd_plugin_set_section_contents                      _bfd_generic_set_section_contents
 #define bfd_plugin_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
 #define bfd_plugin_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
-#define bfd_plugin_bfd_relax_section                  bfd_generic_relax_section
-#define bfd_plugin_bfd_link_hash_table_create         _bfd_generic_link_hash_table_create
-#define bfd_plugin_bfd_link_hash_table_free           _bfd_generic_link_hash_table_free
-#define bfd_plugin_bfd_link_add_symbols               _bfd_generic_link_add_symbols
-#define bfd_plugin_bfd_link_just_syms                 _bfd_generic_link_just_syms
-#define bfd_plugin_bfd_final_link                     _bfd_generic_final_link
-#define bfd_plugin_bfd_link_split_section             _bfd_generic_link_split_section
-#define bfd_plugin_bfd_gc_sections                    bfd_generic_gc_sections
-#define bfd_plugin_bfd_merge_sections                 bfd_generic_merge_sections
-#define bfd_plugin_bfd_is_group_section               bfd_generic_is_group_section
-#define bfd_plugin_bfd_discard_group                  bfd_generic_discard_group
-#define bfd_plugin_section_already_linked             _bfd_generic_section_already_linked
-#define bfd_plugin_bfd_define_common_symbol           bfd_generic_define_common_symbol
+#define bfd_plugin_bfd_relax_section                 bfd_generic_relax_section
+#define bfd_plugin_bfd_link_hash_table_create        _bfd_generic_link_hash_table_create
+#define bfd_plugin_bfd_link_add_symbols                      _bfd_generic_link_add_symbols
+#define bfd_plugin_bfd_link_just_syms                _bfd_generic_link_just_syms
+#define bfd_plugin_bfd_final_link                    _bfd_generic_final_link
+#define bfd_plugin_bfd_link_split_section            _bfd_generic_link_split_section
+#define bfd_plugin_bfd_gc_sections                   bfd_generic_gc_sections
+#define bfd_plugin_bfd_lookup_section_flags          bfd_generic_lookup_section_flags
+#define bfd_plugin_bfd_merge_sections                bfd_generic_merge_sections
+#define bfd_plugin_bfd_is_group_section                      bfd_generic_is_group_section
+#define bfd_plugin_bfd_group_name                    bfd_generic_group_name
+#define bfd_plugin_bfd_discard_group                 bfd_generic_discard_group
+#define bfd_plugin_section_already_linked            _bfd_generic_section_already_linked
+#define bfd_plugin_bfd_define_common_symbol          bfd_generic_define_common_symbol
+#define bfd_plugin_bfd_link_hide_symbol                      _bfd_generic_link_hide_symbol
+#define bfd_plugin_bfd_define_start_stop             bfd_generic_define_start_stop
 #define bfd_plugin_bfd_copy_link_hash_symbol_type     _bfd_generic_copy_link_hash_symbol_type
 #define bfd_plugin_bfd_copy_link_hash_symbol_type     _bfd_generic_copy_link_hash_symbol_type
+#define bfd_plugin_bfd_link_check_relocs             _bfd_generic_link_check_relocs
 
 static enum ld_plugin_status
 message (int level ATTRIBUTE_UNUSED,
 
 static enum ld_plugin_status
 message (int level ATTRIBUTE_UNUSED,
@@ -84,7 +125,7 @@ message (int level ATTRIBUTE_UNUSED,
 }
 
 /* Register a claim-file handler. */
 }
 
 /* Register a claim-file handler. */
-static ld_plugin_claim_file_handler claim_file;
+static ld_plugin_claim_file_handler claim_file = NULL;
 
 static enum ld_plugin_status
 register_claim_file (ld_plugin_claim_file_handler handler)
 
 static enum ld_plugin_status
 register_claim_file (ld_plugin_claim_file_handler handler)
@@ -100,7 +141,7 @@ add_symbols (void * handle,
 {
   bfd *abfd = handle;
   struct plugin_data_struct *plugin_data =
 {
   bfd *abfd = handle;
   struct plugin_data_struct *plugin_data =
-    bfd_alloc (abfd, sizeof (plugin_data_struct));;
+    bfd_alloc (abfd, sizeof (plugin_data_struct));
 
   plugin_data->nsyms = nsyms;
   plugin_data->syms = syms;
 
   plugin_data->nsyms = nsyms;
   plugin_data->syms = syms;
@@ -120,26 +161,119 @@ bfd_plugin_set_program_name (const char *program_name)
   plugin_program_name = program_name;
 }
 
   plugin_program_name = program_name;
 }
 
+int
+bfd_plugin_open_input (bfd *ibfd, struct ld_plugin_input_file *file)
+{
+  bfd *iobfd;
+
+  iobfd = ibfd;
+  while (iobfd->my_archive
+        && !bfd_is_thin_archive (iobfd->my_archive))
+    iobfd = iobfd->my_archive;
+  file->name = iobfd->filename;
+
+  if (!iobfd->iostream && !bfd_open_file (iobfd))
+    return 0;
+
+  /* The plugin API expects that the file descriptor won't be closed
+     and reused as done by the bfd file cache.  So open it again.
+     dup isn't good enough.  plugin IO uses lseek/read while BFD uses
+     fseek/fread.  It isn't wise to mix the unistd and stdio calls on
+     the same underlying file descriptor.  */
+  file->fd = open (file->name, O_RDONLY | O_BINARY);
+  if (file->fd < 0)
+    return 0;
+
+  if (iobfd == ibfd)
+    {
+      struct stat stat_buf;
+
+      if (fstat (file->fd, &stat_buf))
+       {
+         close(file->fd);
+         return 0;
+       }
+
+      file->offset = 0;
+      file->filesize = stat_buf.st_size;
+    }
+  else
+    {
+      file->offset = ibfd->origin;
+      file->filesize = arelt_size (ibfd);
+    }
+  return 1;
+}
+
+static int
+try_claim (bfd *abfd)
+{
+  int claimed = 0;
+  struct ld_plugin_input_file file;
+
+  file.handle = abfd;
+  if (!bfd_plugin_open_input (abfd, &file))
+    return 0;
+  if (claim_file)
+    claim_file (&file, &claimed);
+  close (file.fd);
+  return claimed;
+}
+
+struct plugin_list_entry
+{
+  void *                        handle;
+  ld_plugin_claim_file_handler  claim_file;
+  struct plugin_list_entry *    next;
+};
+
+static struct plugin_list_entry * plugin_list = NULL;
+
 static int
 static int
-try_load_plugin (const char *pname)
+try_load_plugin (const char *pname, bfd *abfd, int *has_plugin_p)
 {
 {
-  static void *plugin_handle;
-  int tv_size = 4;
-  struct ld_plugin_tv tv[tv_size];
+  void *plugin_handle = NULL;
+  struct ld_plugin_tv tv[4];
   int i;
   ld_plugin_onload onload;
   enum ld_plugin_status status;
   int i;
   ld_plugin_onload onload;
   enum ld_plugin_status status;
+  struct plugin_list_entry *plugin_list_iter;
+
+  *has_plugin_p = 0;
 
   plugin_handle = dlopen (pname, RTLD_NOW);
   if (!plugin_handle)
     {
 
   plugin_handle = dlopen (pname, RTLD_NOW);
   if (!plugin_handle)
     {
-      (*_bfd_error_handler)("%s\n", dlerror ());
+      _bfd_error_handler ("%s\n", dlerror ());
       return 0;
     }
 
       return 0;
     }
 
+  for (plugin_list_iter = plugin_list;
+       plugin_list_iter;
+       plugin_list_iter = plugin_list_iter->next)
+    {
+      if (plugin_handle == plugin_list_iter->handle)
+       {
+         dlclose (plugin_handle);
+         if (!plugin_list_iter->claim_file)
+           return 0;
+
+         register_claim_file (plugin_list_iter->claim_file);
+         goto have_claim_file;
+       }
+    }
+
+  plugin_list_iter = bfd_malloc (sizeof *plugin_list_iter);
+  if (plugin_list_iter == NULL)
+    return 0;
+  plugin_list_iter->handle = plugin_handle;
+  plugin_list_iter->claim_file = NULL;
+  plugin_list_iter->next = plugin_list;
+  plugin_list = plugin_list_iter;
+
   onload = dlsym (plugin_handle, "onload");
   if (!onload)
   onload = dlsym (plugin_handle, "onload");
   if (!onload)
-    goto err;
+    return 0;
 
   i = 0;
   tv[i].tv_tag = LDPT_MESSAGE;
 
   i = 0;
   tv[i].tv_tag = LDPT_MESSAGE;
@@ -160,70 +294,150 @@ try_load_plugin (const char *pname)
   status = (*onload)(tv);
 
   if (status != LDPS_OK)
   status = (*onload)(tv);
 
   if (status != LDPS_OK)
-    goto err;
+    return 0;
+
+  plugin_list_iter->claim_file = claim_file;
+
+have_claim_file:
+  *has_plugin_p = 1;
+
+  abfd->plugin_format = bfd_plugin_no;
 
   if (!claim_file)
 
   if (!claim_file)
-    goto err;
+    return 0;
 
 
-  return 1;
+  if (!try_claim (abfd))
+    return 0;
 
 
- err:
-  plugin_handle = NULL;
-  return 0;
+  abfd->plugin_format = bfd_plugin_yes;
+  return 1;
 }
 
 }
 
+/* There may be plugin libraries in lib/bfd-plugins.  */
+
+static int has_plugin = -1;
+
+static const bfd_target *(*ld_plugin_object_p) (bfd *);
+
 static const char *plugin_name;
 
 void
 bfd_plugin_set_plugin (const char *p)
 {
   plugin_name = p;
 static const char *plugin_name;
 
 void
 bfd_plugin_set_plugin (const char *p)
 {
   plugin_name = p;
+  has_plugin = p != NULL;
+}
+
+/* Return TRUE if a plugin library is used.  */
+
+bfd_boolean
+bfd_plugin_specified_p (void)
+{
+  return has_plugin > 0;
+}
+
+/* Return TRUE if ABFD can be claimed by linker LTO plugin.  */
+
+bfd_boolean
+bfd_link_plugin_object_p (bfd *abfd)
+{
+  if (ld_plugin_object_p)
+    return ld_plugin_object_p (abfd) != NULL;
+  return FALSE;
+}
+
+extern const bfd_target plugin_vec;
+
+/* Return TRUE if TARGET is a pointer to plugin_vec.  */
+
+bfd_boolean
+bfd_plugin_target_p (const bfd_target *target)
+{
+  return target == &plugin_vec;
+}
+
+/* Register OBJECT_P to be used by bfd_plugin_object_p.  */
+
+void
+register_ld_plugin_object_p (const bfd_target *(*object_p) (bfd *))
+{
+  ld_plugin_object_p = object_p;
 }
 
 static int
 }
 
 static int
-load_plugin (void)
+load_plugin (bfd *abfd)
 {
 {
-  char *plugin_dir;
-  char *p;
-  DIR *d;
-  struct dirent *ent;
+  /* The intent was to search ${libdir}/bfd-plugins for plugins, but
+     unfortunately the original implementation wasn't precisely that
+     when configuring binutils using --libdir.  Search in the proper
+     path first, then the old one for backwards compatibility.  */
+  static const char *path[]
+    = { LIBDIR "/bfd-plugins", BINDIR "/../lib/bfd-plugins" };
+  struct stat last_st;
   int found = 0;
   int found = 0;
+  unsigned int i;
+
+  if (!has_plugin)
+    return found;
 
   if (plugin_name)
 
   if (plugin_name)
-    return try_load_plugin (plugin_name);
+    return try_load_plugin (plugin_name, abfd, &has_plugin);
 
   if (plugin_program_name == NULL)
 
   if (plugin_program_name == NULL)
-    return 0;
-
-  plugin_dir = concat (BINDIR, "/../lib/bfd-plugins", NULL);
-  p = make_relative_prefix (plugin_program_name,
-                           BINDIR,
-                           plugin_dir);
-  free (plugin_dir);
-  plugin_dir = NULL;
-
-  d = opendir (p);
-  if (!d)
-    goto out;
-
-  while ((ent = readdir (d)))
+    return found;
+
+  /* Try not to search the same dir twice, by looking at st_dev and
+     st_ino for the dir.  If we are on a file system that always sets
+     st_ino to zero or the actual st_ino is zero we might waste some
+     time, but that doesn't matter too much.  */
+  last_st.st_dev = 0;
+  last_st.st_ino = 0;
+  for (i = 0; i < sizeof (path) / sizeof (path[0]); i++)
     {
     {
-      char *full_name;
-      struct stat s;
-
-      full_name = concat (p, "/", ent->d_name, NULL);
-      if (stat(full_name, &s) == 0 && S_ISREG (s.st_mode))
-       found = try_load_plugin (full_name);
-      free (full_name);
+      char *plugin_dir = make_relative_prefix (plugin_program_name,
+                                              BINDIR,
+                                              path[i]);
+      if (plugin_dir)
+       {
+         struct stat st;
+         DIR *d;
+
+         if (stat (plugin_dir, &st) == 0
+             && S_ISDIR (st.st_mode)
+             && !(last_st.st_dev == st.st_dev
+                  && last_st.st_ino == st.st_ino
+                  && st.st_ino != 0)
+             && (d = opendir (plugin_dir)) != NULL)
+           {
+             struct dirent *ent;
+
+             last_st.st_dev = st.st_dev;
+             last_st.st_ino = st.st_ino;
+             while ((ent = readdir (d)) != NULL)
+               {
+                 char *full_name;
+
+                 full_name = concat (plugin_dir, "/", ent->d_name, NULL);
+                 if (stat (full_name, &st) == 0 && S_ISREG (st.st_mode))
+                   {
+                     int valid_plugin;
+
+                     found = try_load_plugin (full_name, abfd, &valid_plugin);
+                     if (has_plugin <= 0)
+                       has_plugin = valid_plugin;
+                   }
+                 free (full_name);
+                 if (found)
+                   break;
+               }
+             closedir (d);
+           }
+         free (plugin_dir);
+       }
       if (found)
        break;
     }
 
       if (found)
        break;
     }
 
- out:
-  free (p);
-  if (d)
-    closedir (d);
-
   return found;
 }
 
   return found;
 }
 
@@ -231,40 +445,13 @@ load_plugin (void)
 static const bfd_target *
 bfd_plugin_object_p (bfd *abfd)
 {
 static const bfd_target *
 bfd_plugin_object_p (bfd *abfd)
 {
-  int claimed = 0;
-  int t = load_plugin ();
-  struct ld_plugin_input_file file;
-  bfd *iobfd;
+  if (ld_plugin_object_p)
+    return ld_plugin_object_p (abfd);
 
 
-  if (!t)
+  if (abfd->plugin_format == bfd_plugin_unknown && !load_plugin (abfd))
     return NULL;
 
     return NULL;
 
-  file.name = abfd->filename;
-
-  if (abfd->my_archive)
-    {
-      iobfd = abfd->my_archive;
-      file.offset = abfd->origin;
-      file.filesize = arelt_size (abfd);
-    }
-  else
-    {
-      iobfd = abfd;
-      file.offset = 0;
-      file.filesize = 0; /*FIXME*/
-    }
-
-  if (!iobfd->iostream && !bfd_open_file (iobfd))
-    return NULL;
-
-  file.fd = fileno ((FILE *) iobfd->iostream);
-
-  file.handle = abfd;
-  claim_file (&file, &claimed);
-  if (!claimed)
-    return NULL;
-
-  return abfd->xvec;
+  return abfd->plugin_format == bfd_plugin_yes ? abfd->xvec : NULL;
 }
 
 /* Copy any private info we understand from the input bfd
 }
 
 /* Copy any private info we understand from the input bfd
@@ -347,7 +534,7 @@ static flagword
 convert_flags (const struct ld_plugin_symbol *sym)
 {
  switch (sym->def)
 convert_flags (const struct ld_plugin_symbol *sym)
 {
  switch (sym->def)
-   { 
+   {
    case LDPK_DEF:
    case LDPK_COMMON:
    case LDPK_UNDEF:
    case LDPK_DEF:
    case LDPK_COMMON:
    case LDPK_UNDEF:
@@ -370,16 +557,16 @@ bfd_plugin_canonicalize_symtab (bfd *abfd,
   struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data;
   long nsyms = plugin_data->nsyms;
   const struct ld_plugin_symbol *syms = plugin_data->syms;
   struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data;
   long nsyms = plugin_data->nsyms;
   const struct ld_plugin_symbol *syms = plugin_data->syms;
-  static asection fake_section;
-  static asection fake_common_section;
+  static asection fake_section
+    = BFD_FAKE_SECTION (fake_section, NULL, "plug", 0,
+                       SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS);
+  static asection fake_common_section
+    = BFD_FAKE_SECTION (fake_common_section, NULL, "plug", 0, SEC_IS_COMMON);
   int i;
 
   int i;
 
-  fake_section.name = ".text";
-  fake_common_section.flags = SEC_IS_COMMON;
-
   for (i = 0; i < nsyms; i++)
     {
   for (i = 0; i < nsyms; i++)
     {
-      asymbol *s = bfd_alloc (abfd, sizeof (asymbol)); 
+      asymbol *s = bfd_alloc (abfd, sizeof (asymbol));
 
       BFD_ASSERT (s);
       alocation[i] = s;
 
       BFD_ASSERT (s);
       alocation[i] = s;
@@ -462,6 +649,7 @@ const bfd_target plugin_vec =
   0,                           /* symbol_leading_char.  */
   '/',                         /* ar_pad_char.  */
   15,                          /* ar_max_namelen.  */
   0,                           /* symbol_leading_char.  */
   '/',                         /* ar_pad_char.  */
   15,                          /* ar_max_namelen.  */
+  255,                         /* match priority.  */
 
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
   bfd_getl32, bfd_getl_signed_32, bfd_putl32,
 
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
   bfd_getl32, bfd_getl_signed_32, bfd_putl32,
@@ -477,22 +665,26 @@ const bfd_target plugin_vec =
     _bfd_dummy_target
   },
   {                            /* bfd_set_format.  */
     _bfd_dummy_target
   },
   {                            /* bfd_set_format.  */
-    bfd_false,
-    bfd_false,
+    _bfd_bool_bfd_false_error,
+    _bfd_bool_bfd_false_error,
     _bfd_generic_mkarchive,
     _bfd_generic_mkarchive,
-    bfd_false,
+    _bfd_bool_bfd_false_error,
   },
   {                            /* bfd_write_contents.  */
   },
   {                            /* bfd_write_contents.  */
-    bfd_false,
-    bfd_false,
+    _bfd_bool_bfd_false_error,
+    _bfd_bool_bfd_false_error,
     _bfd_write_archive_contents,
     _bfd_write_archive_contents,
-    bfd_false,
+    _bfd_bool_bfd_false_error,
   },
 
   BFD_JUMP_TABLE_GENERIC (bfd_plugin),
   BFD_JUMP_TABLE_COPY (bfd_plugin),
   BFD_JUMP_TABLE_CORE (bfd_plugin),
   },
 
   BFD_JUMP_TABLE_GENERIC (bfd_plugin),
   BFD_JUMP_TABLE_COPY (bfd_plugin),
   BFD_JUMP_TABLE_CORE (bfd_plugin),
+#ifdef USE_64_BIT_ARCHIVE
+  BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_64_bit),
+#else
   BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
   BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
+#endif
   BFD_JUMP_TABLE_SYMBOLS (bfd_plugin),
   BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
   BFD_JUMP_TABLE_WRITE (bfd_plugin),
   BFD_JUMP_TABLE_SYMBOLS (bfd_plugin),
   BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
   BFD_JUMP_TABLE_WRITE (bfd_plugin),
@@ -501,6 +693,6 @@ const bfd_target plugin_vec =
 
   NULL,
 
 
   NULL,
 
-  NULL                         /* backend_data.  */
+  NULL                         /* backend_data.  */
 };
 #endif /* BFD_SUPPORTS_PLUGIN */
 };
 #endif /* BFD_SUPPORTS_PLUGIN */
This page took 0.030859 seconds and 4 git commands to generate.