Don't include libbfd.h outside of bfd, part 6
authorAlan Modra <amodra@gmail.com>
Sat, 16 Jul 2016 04:02:16 +0000 (13:32 +0930)
committerAlan Modra <amodra@gmail.com>
Sat, 16 Jul 2016 09:39:00 +0000 (19:09 +0930)
Some messing with plugin code in order to not need arelt_size in
ld code.  File descriptor handling in ld/plugin.c is tidied too,
simply duping the open fd rather than opening the file again.

bfd/
* elflink.c: Include plugin-api.h.
* plugin.c (bfd_plugin_open_input): New function, extracted from..
(try_claim): ..here.
* plugin.h: Don't include bfd.h.
(bfd_plugin_open_input): Declare.
binutils/
* ar.c: Include plugin-api.h.
* nm.c: Likewise.
ld/
* plugin.c: Don't include libbfd.h.  Include plugin-api.h
before bfd/plugin.h.
(plugin_object_p): Use bfd_plugin_open_input.

bfd/ChangeLog
bfd/elflink.c
bfd/plugin.c
bfd/plugin.h
binutils/ChangeLog
binutils/ar.c
binutils/nm.c
ld/ChangeLog
ld/plugin.c

index bf796188fc7f1a363db4fcc7e0f82222083b947d..9be7d8926fd375c1a1d8635fd77df53a7902d5e0 100644 (file)
@@ -1,3 +1,11 @@
+2016-07-16  Alan Modra  <amodra@gmail.com>
+
+       * elflink.c: Include plugin-api.h.
+       * plugin.c (bfd_plugin_open_input): New function, extracted from..
+       (try_claim): ..here.
+       * plugin.h: Don't include bfd.h.
+       (bfd_plugin_open_input): Declare.
+
 2016-07-16  Alan Modra  <amodra@gmail.com>
 
        * targets.c (bfd_seach_for_target): Rename to..
index b2a814fda4297d9d2019b0b6de648815f652b606..a994b839f9c152b276912ee0b596eda822bd2acc 100644 (file)
@@ -29,6 +29,7 @@
 #include "libiberty.h"
 #include "objalloc.h"
 #if BFD_SUPPORTS_PLUGINS
+#include "plugin-api.h"
 #include "plugin.h"
 #endif
 
index c66d95eaffc049f68a2e38650e5baa25f4318b66..3931d2750b1ec93a84ebadd0f70e4d11a6ba882b 100644 (file)
@@ -158,49 +158,50 @@ bfd_plugin_set_program_name (const char *program_name)
   plugin_program_name = program_name;
 }
 
-static int
-try_claim (bfd *abfd)
+int
+bfd_plugin_open_input (bfd *ibfd, struct ld_plugin_input_file *file)
 {
-  int claimed = 0;
-  struct ld_plugin_input_file file;
   bfd *iobfd;
 
-  file.name = abfd->filename;
-
-  if (abfd->my_archive && !bfd_is_thin_archive (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;
-    }
+  iobfd = ibfd;
+  if (ibfd->my_archive && !bfd_is_thin_archive (ibfd->my_archive))
+    iobfd = ibfd->my_archive;
+  file->name = iobfd->filename;
 
   if (!iobfd->iostream && !bfd_open_file (iobfd))
     return 0;
 
-  file.fd = fileno ((FILE *) iobfd->iostream);
+  file->fd = fileno ((FILE *) iobfd->iostream);
 
-  if (!abfd->my_archive || bfd_is_thin_archive (abfd->my_archive))
+  if (iobfd == ibfd)
     {
       struct stat stat_buf;
-      if (fstat (file.fd, &stat_buf))
+      if (fstat (file->fd, &stat_buf))
         return 0;
-      file.filesize = stat_buf.st_size;
+      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;
 
+  if (!bfd_plugin_open_input (abfd, &file))
+    return 0;
   file.handle = abfd;
-  off_t cur_offset = lseek(file.fd, 0, SEEK_CUR);
+  off_t cur_offset = lseek (file.fd, 0, SEEK_CUR);
   claim_file (&file, &claimed);
-  lseek(file.fd, cur_offset, SEEK_SET);
-  if (!claimed)
-    return 0;
-
-  return 1;
+  lseek (file.fd, cur_offset, SEEK_SET);
+  return claimed;
 }
 
 static int
index 529f8c111fdddf4c7fcbe1045d58f733d92598e8..08671226190be3ae8725295af6e563792d4e24da 100644 (file)
@@ -21,9 +21,8 @@
 #ifndef _PLUGIN_H_
 #define _PLUGIN_H_
 
-#include "bfd.h"
-
 void bfd_plugin_set_program_name (const char *);
+int bfd_plugin_open_input (bfd *, struct ld_plugin_input_file *);
 void bfd_plugin_set_plugin (const char *);
 bfd_boolean bfd_plugin_target_p (const bfd_target *);
 bfd_boolean bfd_plugin_specified_p (void);
index 8cf318809306a87619e4aa620665c747efcd3bd4..fed99fc93437c38a1b90edcbd59fc8b0ccf69ee1 100644 (file)
@@ -1,3 +1,8 @@
+2016-07-16  Alan Modra  <amodra@gmail.com>
+
+       * ar.c: Include plugin-api.h.
+       * nm.c: Likewise.
+
 2016-07-16  Alan Modra  <amodra@gmail.com>
 
        * bucomm.c: Don't include libbfd.h.
index 1337710d20efb7482fcdc4c94d58fe3cfff9c1ea..ba0d5810fa1889feebc04b17c9a6ee4936719147 100644 (file)
@@ -33,6 +33,7 @@
 #include "arsup.h"
 #include "filenames.h"
 #include "binemul.h"
+#include "plugin-api.h"
 #include "plugin.h"
 
 #ifdef __GO32___
index 5ca4d34ee3843c8d5e3575dcd180f7a744490c71..766564dc847c9381b7eb6ba191fcc0eb595fb145 100644 (file)
@@ -36,6 +36,7 @@
 #include "coff/internal.h"
 #include "libcoff.h"
 #include "bucomm.h"
+#include "plugin-api.h"
 #include "plugin.h"
 
 /* When sorting by size, we use this structure to hold the size and a
index e4026ec8ce62d85fc868e8ccfe1be73f8a3ee83c..758d7adeeb7dbab22c307af1b4e3a94d61369b17 100644 (file)
@@ -1,3 +1,9 @@
+2016-07-16  Alan Modra  <amodra@gmail.com>
+
+       * plugin.c: Don't include libbfd.h.  Include plugin-api.h
+       before bfd/plugin.h.
+       (plugin_object_p): Use bfd_plugin_open_input.
+
 2016-07-16  Alan Modra  <amodra@gmail.com>
 
        * ldlang.c (open_output): Replace bfd_search_for_target with
index 924b59cb61903076dbaaf1635df91f56416efd59..ffa0dd39015a3c4b3913bf4a9c36d65ae9ad588b 100644 (file)
@@ -21,7 +21,6 @@
 #include "sysdep.h"
 #include "libiberty.h"
 #include "bfd.h"
-#include "libbfd.h"
 #include "bfdlink.h"
 #include "bfdver.h"
 #include "ld.h"
@@ -30,9 +29,9 @@
 #include "ldexp.h"
 #include "ldlang.h"
 #include "ldfile.h"
+#include "plugin-api.h"
 #include "../bfd/plugin.h"
 #include "plugin.h"
-#include "plugin-api.h"
 #include "elf-bfd.h"
 #if HAVE_MMAP
 # include <sys/mman.h>
@@ -1083,12 +1082,8 @@ plugin_object_p (bfd *ibfd)
 {
   int claimed;
   plugin_input_file_t *input;
-  off_t offset, filesize;
   struct ld_plugin_input_file file;
   bfd *abfd;
-  bfd_boolean inarchive;
-  const char *name;
-  int fd;
 
   /* Don't try the dummy object file.  */
   if ((ibfd->flags & BFD_PLUGIN) != 0)
@@ -1102,14 +1097,6 @@ plugin_object_p (bfd *ibfd)
        return NULL;
     }
 
-  inarchive = (ibfd->my_archive != NULL
-              && !bfd_is_thin_archive (ibfd->my_archive));
-  name = inarchive ? ibfd->my_archive->filename : ibfd->filename;
-  fd = open (name, O_RDONLY | O_BINARY);
-
-  if (fd < 0)
-    return NULL;
-
   /* We create a dummy BFD, initially empty, to house whatever symbols
      the plugin may want to add.  */
   abfd = plugin_get_ir_dummy_bfd (ibfd->filename, ibfd);
@@ -1119,39 +1106,31 @@ plugin_object_p (bfd *ibfd)
     einfo (_("%P%F: plugin failed to allocate memory for input: %s\n"),
           bfd_get_error ());
 
-  if (inarchive)
-    {
-      /* Offset and filesize must refer to the individual archive
-        member, not the whole file, and must exclude the header.
-        Fortunately for us, that is how the data is stored in the
-        origin field of the bfd and in the arelt_data.  */
-      offset = ibfd->origin;
-      filesize = arelt_size (ibfd);
-    }
-  else
-    {
-      offset = 0;
-      filesize = lseek (fd, 0, SEEK_END);
+  if (!bfd_plugin_open_input (ibfd, &file))
+    return NULL;
 
+  if (file.name == ibfd->filename)
+    {
       /* We must copy filename attached to ibfd if it is not an archive
         member since it may be freed by bfd_close below.  */
-      name = plugin_strdup (abfd, name);
+      file.name = plugin_strdup (abfd, file.name);
     }
 
-  file.name = name;
-  file.offset = offset;
-  file.filesize = filesize;
-  file.fd = fd;
   file.handle = input;
+  /* The plugin API expects that the file descriptor won't be closed
+     and reused as done by the bfd file cache.  So dup one.  */
+  file.fd = dup (file.fd);
+  if (file.fd < 0)
+    return NULL;
 
   input->abfd = abfd;
   input->view_buffer.addr = NULL;
   input->view_buffer.filesize = 0;
   input->view_buffer.offset = 0;
-  input->fd = fd;
+  input->fd = file.fd;
   input->use_mmap = FALSE;
-  input->offset = offset;
-  input->filesize = filesize;
+  input->offset = file.offset;
+  input->filesize = file.filesize;
   input->name = plugin_strdup (abfd, ibfd->filename);
 
   claimed = 0;
@@ -1160,7 +1139,7 @@ plugin_object_p (bfd *ibfd)
     einfo (_("%P%F: %s: plugin reported error claiming file\n"),
           plugin_error_plugin ());
 
-  if (input->fd != -1 && ! bfd_plugin_target_p (ibfd->xvec))
+  if (input->fd != -1 && !bfd_plugin_target_p (ibfd->xvec))
     {
       /* FIXME: fd belongs to us, not the plugin.  GCC plugin, which
         doesn't need fd after plugin_call_claim_file, doesn't use
@@ -1170,7 +1149,7 @@ plugin_object_p (bfd *ibfd)
         release_input_file after it is done, uses BFD plugin target
         vector.  This scheme doesn't work when a plugin needs fd and
         doesn't use BFD plugin target vector neither.  */
-      close (fd);
+      close (input->fd);
       input->fd = -1;
     }