/* Plugin support for BFD.
   Copyright (C) 2009-2025 Free Software Foundation, Inc.

   This file is part of BFD, the Binary File Descriptor library.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   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., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#include "sysdep.h"
#include "bfd.h"

#if BFD_SUPPORTS_PLUGINS

#include <assert.h>
#ifdef HAVE_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 "plugin.h"
#include "libbfd.h"
#include "libiberty.h"
#include <dirent.h>

#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_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_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_nearest_line_with_alt	      _bfd_nosymbols_find_nearest_line_with_alt
#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_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_link_check_relocs	      _bfd_generic_link_check_relocs

static enum ld_plugin_status
message (int level ATTRIBUTE_UNUSED,
	 const char * format, ...)
{
  va_list args;
  va_start (args, format);
  printf ("bfd plugin: ");
  vprintf (format, args);
  putchar ('\n');
  va_end (args);
  return LDPS_OK;
}

struct plugin_list_entry
{
  /* These must be initialized for each IR object with LTO wrapper.  */
  ld_plugin_claim_file_handler claim_file;
  ld_plugin_claim_file_handler_v2 claim_file_v2;
  ld_plugin_all_symbols_read_handler all_symbols_read;
  ld_plugin_all_symbols_read_handler cleanup_handler;
  bool has_symbol_type;

  struct plugin_list_entry *next;

  /* These can be reused for all IR objects.  */
  const char *plugin_name;
};

struct plugin_data_struct
{
  int nsyms;
  const struct ld_plugin_symbol *syms;
  int object_only_nsyms;
  asymbol **object_only_syms;
};

static const char *plugin_program_name;

void
bfd_plugin_set_program_name (const char *program_name)
{
  plugin_program_name = program_name;
}

static struct plugin_list_entry *plugin_list = NULL;
static struct plugin_list_entry *current_plugin = NULL;

/* Register a claim-file handler. */

static enum ld_plugin_status
register_claim_file (ld_plugin_claim_file_handler handler)
{
  current_plugin->claim_file = handler;
  return LDPS_OK;
}

static asection bfd_plugin_fake_text_section
  = BFD_FAKE_SECTION (bfd_plugin_fake_text_section, NULL, "plug", 0,
		      SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS);
static asection bfd_plugin_fake_data_section
  = BFD_FAKE_SECTION (bfd_plugin_fake_data_section, NULL, "plug", 0,
		      SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS);
static asection bfd_plugin_fake_bss_section
  = BFD_FAKE_SECTION (bfd_plugin_fake_bss_section, NULL, "plug", 0,
		      SEC_ALLOC);
static asection bfd_plugin_fake_common_section
  = BFD_FAKE_SECTION (bfd_plugin_fake_common_section, NULL, NULL,
		      0, SEC_IS_COMMON);

/* Get symbols from object only section.  */

static void
bfd_plugin_get_symbols_in_object_only (bfd *abfd)
{
  struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data;
  const char *object_only_file;
  bfd *nbfd;
  long storage;
  long object_only_nsyms, added_nsyms, i;
  asymbol **object_only_syms, **added_syms;

  plugin_data->object_only_syms = NULL;
  plugin_data->object_only_nsyms = 0;

  if (abfd->sections == NULL && abfd->my_archive == NULL)
    {
      nbfd = bfd_openr (abfd->filename, NULL);
      if (nbfd == NULL)
	{
	  (*_bfd_error_handler)
	    (_("%s: failed to open to extract object only section: %s"),
	     abfd->filename, bfd_errmsg (bfd_get_error ()));
	  return;
	}
      /* Prevent this recursive call into bfd_check_format from
	 attempting to load the plugin again while it is running.  */
      nbfd->plugin_format = bfd_plugin_no;
      if (!bfd_check_format (nbfd, bfd_object))
	{
	  /* There is no object only section if it isn't a bfd_object
	     file.  */
	  bfd_close (nbfd);
	  return;
	}

      /* Copy LTO type derived from input sections.  */
      abfd->lto_type = nbfd->lto_type;
    }
  else
    {
      BFD_ASSERT (abfd->plugin_format == bfd_plugin_no);
      if (!bfd_check_format (abfd, bfd_object))
	{
	  (*_bfd_error_handler)
	    (_("%pB: invalid file to extract object only section: %s"),
	     abfd, bfd_errmsg (bfd_get_error ()));
	  return;
	}
      nbfd = abfd;
    }

  if (nbfd->lto_type == lto_mixed_object
      && (nbfd->flags & HAS_SYMS) != 0)
    {
      object_only_file = bfd_extract_object_only_section (nbfd);
      if (object_only_file == NULL)
	(*_bfd_error_handler)
	  (_("%pB: failed to extract object only section: %s"),
	   abfd, bfd_errmsg (bfd_get_error ()));
    }
  else
    object_only_file = NULL;

  /* Close the new bfd we just opened.  */
  if (nbfd != abfd)
    bfd_close (nbfd);

  /* Return if there is no object only section or there is no
     symbol in object only section.  */
  if (!object_only_file)
    return;

  /* Open the file containing object only section.  */
  nbfd = bfd_openr (object_only_file, NULL);
  /* Prevent this recursive call into bfd_check_format from
     attempting to load the plugin again while it is running.  */
  nbfd->plugin_format = bfd_plugin_no;
  if (!bfd_check_format (nbfd, bfd_object))
    {
      (*_bfd_error_handler)
	(_("%pB: failed to open object only section: %s"),
	 abfd, bfd_errmsg (bfd_get_error ()));
      goto quit;
    }

  storage = bfd_get_symtab_upper_bound (nbfd);
  if (storage <= 0)
    {
      if (storage < 0)
	(*_bfd_error_handler)
	  (_("%pB: failed to get symbol table in object only section: %s"),
	   abfd, bfd_errmsg (bfd_get_error ()));

      goto quit;
    }

  object_only_syms = (asymbol **) bfd_malloc (storage);
  object_only_nsyms = bfd_canonicalize_symtab (nbfd, object_only_syms);

  /* FIXME: We waste some spaces if not all symbols are copied.  */
  added_syms = (asymbol **) bfd_alloc (abfd, storage);
  added_nsyms = 0;

  /* Copy only global symbols from object only section.  */
  for (i = 0; i < object_only_nsyms; i++)
    {
      asection *sec = object_only_syms[i]->section;
      flagword flags = object_only_syms[i]->flags;
      asymbol *s;

      if (bfd_is_com_section (sec))
	sec = &bfd_plugin_fake_common_section;
      else if (bfd_is_und_section (sec))
	;
      else if ((flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0)
	{
	  if ((sec->flags & SEC_CODE) != 0)
	    sec = &bfd_plugin_fake_text_section;
	  else if ((sec->flags & SEC_LOAD) != 0)
	    sec = &bfd_plugin_fake_data_section;
	  else
	    sec = &bfd_plugin_fake_bss_section;
	}
      else
	continue;

      s = bfd_alloc (abfd, sizeof (asymbol));
      BFD_ASSERT (s);
      added_syms[added_nsyms++] = s;

      s->section = sec;
      s->the_bfd = abfd;
      s->name = xstrdup (object_only_syms[i]->name);
      s->value = 0;
      s->flags = flags;
      s->udata.p = NULL;
    }

  plugin_data->object_only_syms = added_syms;
  plugin_data->object_only_nsyms = added_nsyms;

  free (object_only_syms);

quit:
  /* Close and remove the object only section file.  */
  bfd_close (nbfd);
  unlink (object_only_file);
}

/* Register a claim-file handler, version 2. */

static enum ld_plugin_status
register_claim_file_v2 (ld_plugin_claim_file_handler_v2 handler)
{
  current_plugin->claim_file_v2 = handler;
  return LDPS_OK;
}

static enum ld_plugin_status
add_symbols (void * handle,
	     int nsyms,
	     const struct ld_plugin_symbol * syms)
{
  bfd *abfd = handle;
  struct plugin_data_struct *plugin_data = bfd_alloc (abfd,
						      sizeof (*plugin_data));
  if (!plugin_data)
    return LDPS_ERR;

  plugin_data->nsyms = nsyms;
  plugin_data->syms = syms;

  abfd->tdata.plugin_data = plugin_data;

  bfd_plugin_get_symbols_in_object_only (abfd);

  if ((nsyms + plugin_data->object_only_nsyms) != 0)
    abfd->flags |= HAS_SYMS;

  return LDPS_OK;
}

static enum ld_plugin_status
add_symbols_v2 (void *handle, int nsyms,
		const struct ld_plugin_symbol *syms)
{
  current_plugin->has_symbol_type = true;
  return add_symbols (handle, nsyms, syms);
}

int
bfd_plugin_open_input (bfd *ibfd, struct ld_plugin_input_file *file)
{
  bfd *iobfd;
  int fd;

  iobfd = ibfd;
  while (iobfd->my_archive
	 && !bfd_is_thin_archive (iobfd->my_archive))
    iobfd = iobfd->my_archive;
  file->name = bfd_get_filename (iobfd);

  if (!iobfd->iostream && !bfd_open_file (iobfd))
    return 0;

  /* Reuse the archive plugin file descriptor.  */
  if (iobfd != ibfd)
    fd = iobfd->archive_plugin_fd;
  else
    fd = -1;

  if (fd < 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.  */
      fd = open (file->name, O_RDONLY | O_BINARY);
      if (fd < 0)
	{
#ifndef EMFILE
	  return 0;
#else
	  if (errno != EMFILE)
	    return 0;

#ifdef HAVE_GETRLIMIT
	  struct rlimit lim;

	  /* Complicated links involving lots of files and/or large
	     archives can exhaust the number of file descriptors
	     available to us.  If possible, try to allocate more
	     descriptors.  */
	  if (getrlimit (RLIMIT_NOFILE, & lim) == 0
	      && lim.rlim_cur < lim.rlim_max)
	    {
	      lim.rlim_cur = lim.rlim_max;
	      if (setrlimit (RLIMIT_NOFILE, &lim) == 0)
		fd = open (file->name, O_RDONLY | O_BINARY);
	    }

	  if (fd < 0)
#endif
	    {
	      _bfd_error_handler (_("plugin framework: out of file descriptors. Try using fewer objects/archives\n"));
	      return 0;
	    }
#endif
	}
    }

  if (iobfd == ibfd)
    {
      struct stat stat_buf;

      if (fstat (fd, &stat_buf))
	{
	  close (fd);
	  return 0;
	}

      file->offset = 0;
      file->filesize = stat_buf.st_size;
    }
  else
    {
      /* Cache the archive plugin file descriptor.  */
      iobfd->archive_plugin_fd = fd;
      iobfd->archive_plugin_fd_open_count++;

      file->offset = ibfd->origin;
      file->filesize = arelt_size (ibfd);
    }

  file->fd = fd;
  return 1;
}

/* Close the plugin file descriptor FD.  If ABFD isn't NULL, it is an
   archive member.   */

void
bfd_plugin_close_file_descriptor (bfd *abfd, int fd)
{
  if (abfd == NULL)
    close (fd);
  else
    {
      while (abfd->my_archive
	     && !bfd_is_thin_archive (abfd->my_archive))
	abfd = abfd->my_archive;

      /* Close the file descriptor if there is no archive plugin file
	 descriptor.  */
      if (abfd->archive_plugin_fd == -1)
	{
	  close (fd);
	  return;
	}

      abfd->archive_plugin_fd_open_count--;
      /* Dup the archive plugin file descriptor for later use, which
	 will be closed by _bfd_archive_close_and_cleanup.  */
      if (abfd->archive_plugin_fd_open_count == 0)
	{
	  abfd->archive_plugin_fd = dup (fd);
	  close (fd);
	}
    }
}

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))
    {
      bool claim_file_called = false;
      if (current_plugin->claim_file_v2)
	{
	  current_plugin->claim_file_v2 (&file, &claimed, false);
	  claim_file_called = true;
	}
      else if (current_plugin->claim_file)
	{
	  current_plugin->claim_file (&file, &claimed);
	  claim_file_called = true;
	}
      if (claim_file_called)
	bfd_plugin_close_file_descriptor ((abfd->my_archive != NULL
					   ? abfd : NULL),
					  file.fd);
    }

  return claimed;
}

static bool
try_load_plugin (const char *pname,
		 struct plugin_list_entry *plugin_list_iter,
		 bfd *abfd,
		 bool build_list_p)
{
  void *plugin_handle;
  struct ld_plugin_tv tv[6];
  int i;
  ld_plugin_onload onload;
  enum ld_plugin_status status;
  bool result = false;

  /* NB: Each object is independent.  Reuse the previous plugin from
     the last run will lead to wrong result.  */
  if (current_plugin)
    memset (current_plugin, 0,
	    offsetof (struct plugin_list_entry, next));

  if (plugin_list_iter)
    pname = plugin_list_iter->plugin_name;

  plugin_handle = dlopen (pname, RTLD_NOW);
  if (!plugin_handle)
    {
      /* If we are building a list of viable plugins, then
	 we do not bother the user with the details of any
	 plugins that cannot be loaded.  */
      if (! build_list_p)
	_bfd_error_handler ("Failed to load plugin '%s', reason: %s\n",
			    pname, dlerror ());
      return false;
    }

  if (plugin_list_iter == NULL)
    {
      size_t length_plugin_name = strlen (pname) + 1;
      char *plugin_name = bfd_malloc (length_plugin_name);

      if (plugin_name == NULL)
	goto short_circuit;
      plugin_list_iter = bfd_malloc (sizeof *plugin_list_iter);
      if (plugin_list_iter == NULL)
	{
	  free (plugin_name);
	  goto short_circuit;
	}
      /* Make a copy of PNAME since PNAME from load_plugin () will be
	 freed.  */
      memcpy (plugin_name, pname, length_plugin_name);
      memset (plugin_list_iter, 0, sizeof (*plugin_list_iter));
      plugin_list_iter->plugin_name = plugin_name;
      plugin_list_iter->next = plugin_list;
      plugin_list = plugin_list_iter;
    }

  current_plugin = plugin_list_iter;
  if (build_list_p)
    goto short_circuit;

  onload = dlsym (plugin_handle, "onload");
  if (!onload)
    goto short_circuit;

  i = 0;
  tv[i].tv_tag = LDPT_MESSAGE;
  tv[i].tv_u.tv_message = message;

  ++i;
  tv[i].tv_tag = LDPT_REGISTER_CLAIM_FILE_HOOK;
  tv[i].tv_u.tv_register_claim_file = register_claim_file;

  ++i;
  tv[i].tv_tag = LDPT_REGISTER_CLAIM_FILE_HOOK_V2;
  tv[i].tv_u.tv_register_claim_file_v2 = register_claim_file_v2;

  ++i;
  tv[i].tv_tag = LDPT_ADD_SYMBOLS;
  tv[i].tv_u.tv_add_symbols = add_symbols;

  ++i;
  tv[i].tv_tag = LDPT_ADD_SYMBOLS_V2;
  tv[i].tv_u.tv_add_symbols = add_symbols_v2;

  ++i;
  tv[i].tv_tag = LDPT_NULL;
  tv[i].tv_u.tv_val = 0;

  /* LTO plugin will call handler hooks to set up plugin handlers.  */
  status = (*onload)(tv);

  if (status != LDPS_OK)
    goto short_circuit;

  /* Setting bfd_plugin_no here prevents recursive calls into
     bfd_check_format from within the plugin (unless the plugin opens
     another bfd.)  Attempting to load the plugin again while it is
     running is *not* a good idea.  */
  abfd->plugin_format = bfd_plugin_no;

  if (!current_plugin->claim_file)
    goto short_circuit;

  if (!try_claim (abfd))
    goto short_circuit;

  abfd->plugin_format = bfd_plugin_yes;
  result = true;

 short_circuit:
  dlclose (plugin_handle);
  return result;
}

/* There may be plugin libraries in lib/bfd-plugins.  */
static int has_plugin_list = -1;

static bfd_cleanup (*ld_plugin_object_p) (bfd *, bool);

static const char *plugin_name;

void
bfd_plugin_set_plugin (const char *p)
{
  plugin_name = p;
}

/* Return TRUE if ABFD can be claimed by linker LTO plugin.  */

bool
bfd_link_plugin_object_p (bfd *abfd)
{
  if (ld_plugin_object_p)
    return ld_plugin_object_p (abfd, false) != NULL;
  return false;
}

extern const bfd_target plugin_vec;

/* Return TRUE if TARGET is a pointer to plugin_vec.  */

bool
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 (bfd_cleanup (*object_p) (bfd *, bool))
{
  ld_plugin_object_p = object_p;
}

static void
build_plugin_list (bfd *abfd)
{
  /* 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;
  unsigned int i;

  if (has_plugin_list >= 0)
    return;

  /* 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 *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))
		    (void) try_load_plugin (full_name, NULL, abfd, true);
		  free (full_name);
		}
	      closedir (d);
	    }
	  free (plugin_dir);
	}
    }

  has_plugin_list = plugin_list != NULL;
}

static bool
load_plugin (bfd *abfd)
{
  struct plugin_list_entry *plugin_list_iter;

  if (plugin_name)
    return try_load_plugin (plugin_name, plugin_list, abfd, false);

  if (plugin_program_name == NULL)
    return false;

  build_plugin_list (abfd);

  for (plugin_list_iter = plugin_list;
       plugin_list_iter;
       plugin_list_iter = plugin_list_iter->next)
    if (try_load_plugin (NULL, plugin_list_iter, abfd, false))
      return true;

  return false;
}


static bfd_cleanup
bfd_plugin_object_p (bfd *abfd)
{
  /* Since ld_plugin_object_p is called only for linker command-line input
     objects, pass true to ld_plugin_object_p so that the same input IR
     file won't be included twice if the LDPT_REGISTER_CLAIM_FILE_HOOK_V2
     isn't used.  */
  if (ld_plugin_object_p)
    return ld_plugin_object_p (abfd, true);

  if (abfd->plugin_format == bfd_plugin_unknown && !load_plugin (abfd))
    return NULL;

  return abfd->plugin_format == bfd_plugin_yes ? _bfd_no_cleanup : NULL;
}

/* Copy any private info we understand from the input bfd
   to the output bfd.  */

static bool
bfd_plugin_bfd_copy_private_bfd_data (bfd *ibfd ATTRIBUTE_UNUSED,
				      bfd *obfd ATTRIBUTE_UNUSED)
{
  BFD_ASSERT (0);
  return true;
}

/* Copy any private info we understand from the input section
   to the output section.  */

static bool
bfd_plugin_bfd_copy_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
					  asection *isection ATTRIBUTE_UNUSED,
					  bfd *obfd ATTRIBUTE_UNUSED,
					  asection *osection ATTRIBUTE_UNUSED,
					  struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
{
  BFD_ASSERT (0);
  return true;
}

/* Copy any private info we understand from the input symbol
   to the output symbol.  */

static bool
bfd_plugin_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
					 asymbol *isymbol ATTRIBUTE_UNUSED,
					 bfd *obfd ATTRIBUTE_UNUSED,
					 asymbol *osymbol ATTRIBUTE_UNUSED)
{
  BFD_ASSERT (0);
  return true;
}

static bool
bfd_plugin_bfd_print_private_bfd_data (bfd *abfd ATTRIBUTE_UNUSED, void *ptr ATTRIBUTE_UNUSED)
{
  BFD_ASSERT (0);
  return true;
}

static char *
bfd_plugin_core_file_failing_command (bfd *abfd ATTRIBUTE_UNUSED)
{
  BFD_ASSERT (0);
  return NULL;
}

static int
bfd_plugin_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED)
{
  BFD_ASSERT (0);
  return 0;
}

static int
bfd_plugin_core_file_pid (bfd *abfd ATTRIBUTE_UNUSED)
{
  BFD_ASSERT (0);
  return 0;
}

static long
bfd_plugin_get_symtab_upper_bound (bfd *abfd)
{
  struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data;
  /* Add symbols from object only section.  */
  long nsyms = plugin_data->nsyms + plugin_data->object_only_nsyms;

  BFD_ASSERT (nsyms >= 0);

  return ((nsyms + 1) * sizeof (asymbol *));
}

static flagword
convert_flags (const struct ld_plugin_symbol *sym)
{
 switch (sym->def)
   {
   case LDPK_DEF:
   case LDPK_COMMON:
   case LDPK_UNDEF:
     return BSF_GLOBAL;

   case LDPK_WEAKUNDEF:
   case LDPK_WEAKDEF:
     return BSF_GLOBAL | BSF_WEAK;

   default:
     BFD_ASSERT (0);
     return 0;
   }
}

static long
bfd_plugin_canonicalize_symtab (bfd *abfd,
				asymbol **alocation)
{
  struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data;
  long nsyms = plugin_data->nsyms;
  const struct ld_plugin_symbol *syms = plugin_data->syms;
  int i, j;

  for (i = 0; i < nsyms; i++)
    {
      asymbol *s = bfd_alloc (abfd, sizeof (asymbol));

      BFD_ASSERT (s);
      alocation[i] = s;

      s->the_bfd = abfd;
      s->name = syms[i].name;
      s->value = 0;
      s->flags = convert_flags (&syms[i]);
      s->udata.p = NULL;
      switch (syms[i].def)
	{
	case LDPK_COMMON:
	  s->section = &bfd_plugin_fake_common_section;
	  break;
	case LDPK_UNDEF:
	case LDPK_WEAKUNDEF:
	  s->section = bfd_und_section_ptr;
	  break;
	case LDPK_DEF:
	case LDPK_WEAKDEF:
	  if (current_plugin->has_symbol_type)
	    switch (syms[i].symbol_type)
	      {
	      default:
		/* FIXME: Should we issue an error here ?  */
	      case LDST_UNKNOWN:
		/* What is the best fake section for LDST_UNKNOWN?  */
	      case LDST_FUNCTION:
		s->section = &bfd_plugin_fake_text_section;
		break;
	      case LDST_VARIABLE:
		if (syms[i].section_kind == LDSSK_BSS)
		  s->section = &bfd_plugin_fake_bss_section;
		else
		  s->section = &bfd_plugin_fake_data_section;
		break;
	      }
	  else
	    s->section = &bfd_plugin_fake_text_section;
	  break;
	default:
	  BFD_ASSERT (0);
	}
    }

  /* Copy symbols from object only section.  */
  nsyms += plugin_data->object_only_nsyms;
  for (j = 0; j < plugin_data->object_only_nsyms; j++, i++)
    alocation[i] = plugin_data->object_only_syms[j];

  return nsyms;
}

static void
bfd_plugin_print_symbol (bfd *abfd ATTRIBUTE_UNUSED,
			 void *afile ATTRIBUTE_UNUSED,
			 asymbol *symbol ATTRIBUTE_UNUSED,
			 bfd_print_symbol_type how ATTRIBUTE_UNUSED)
{
  BFD_ASSERT (0);
}

static void
bfd_plugin_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
			    asymbol *symbol,
			    symbol_info *ret)
{
  bfd_symbol_info (symbol, ret);
}

/* Make an empty symbol. */

static asymbol *
bfd_plugin_make_empty_symbol (bfd *abfd)
{
  asymbol *new_symbol = bfd_zalloc (abfd, sizeof (asymbol));
  if (new_symbol == NULL)
    return new_symbol;
  new_symbol->the_bfd = abfd;
  return new_symbol;
}

static int
bfd_plugin_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
			   struct bfd_link_info *info ATTRIBUTE_UNUSED)
{
  BFD_ASSERT (0);
  return 0;
}

const bfd_target plugin_vec =
{
  "plugin",			/* Name.  */
  bfd_target_unknown_flavour,
  BFD_ENDIAN_LITTLE,		/* Target byte order.  */
  BFD_ENDIAN_LITTLE,		/* Target headers byte order.  */
  (HAS_RELOC | EXEC_P |		/* Object flags.  */
   HAS_LINENO | HAS_DEBUG |
   HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
  (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
   | SEC_ALLOC | SEC_LOAD | SEC_RELOC),	/* Section flags.  */
  0,				/* symbol_leading_char.  */
  '/',				/* ar_pad_char.  */
  15,				/* ar_max_namelen.  */
  255,				/* match priority.  */
  TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */

  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
  bfd_getl32, bfd_getl_signed_32, bfd_putl32,
  bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* data */
  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
  bfd_getl32, bfd_getl_signed_32, bfd_putl32,
  bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* hdrs */

  {				/* bfd_check_format.  */
    _bfd_dummy_target,
    bfd_plugin_object_p,
    _bfd_dummy_target,
    _bfd_dummy_target
  },
  {				/* bfd_set_format.  */
    _bfd_bool_bfd_false_error,
    _bfd_bool_bfd_false_error,
    _bfd_bool_bfd_false_error,
    _bfd_bool_bfd_false_error,
  },
  {				/* bfd_write_contents.  */
    _bfd_bool_bfd_false_error,
    _bfd_bool_bfd_false_error,
    _bfd_bool_bfd_false_error,
    _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_ARCHIVE (_bfd_noarchive),
  BFD_JUMP_TABLE_SYMBOLS (bfd_plugin),
  BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
  BFD_JUMP_TABLE_WRITE (bfd_plugin),
  BFD_JUMP_TABLE_LINK (bfd_plugin),
  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),

  NULL,

  NULL				/* backend_data.  */
};
#endif /* BFD_SUPPORTS_PLUGINS */
