aboutsummaryrefslogtreecommitdiff
path: root/ld/plugin.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2016-07-16 13:32:16 +0930
committerAlan Modra <amodra@gmail.com>2016-07-16 19:09:00 +0930
commit7d0b9ebc1e0079271a7c7737b53bc026525eab64 (patch)
tree975420444ead89bf45f08b8e620da1ce5f0ab6d2 /ld/plugin.c
parentaac502f7d7899d96477fbd83f0038235af641def (diff)
downloadgdb-7d0b9ebc1e0079271a7c7737b53bc026525eab64.zip
gdb-7d0b9ebc1e0079271a7c7737b53bc026525eab64.tar.gz
gdb-7d0b9ebc1e0079271a7c7737b53bc026525eab64.tar.bz2
Don't include libbfd.h outside of bfd, part 6
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.
Diffstat (limited to 'ld/plugin.c')
-rw-r--r--ld/plugin.c53
1 files changed, 16 insertions, 37 deletions
diff --git a/ld/plugin.c b/ld/plugin.c
index 924b59c..ffa0dd3 100644
--- a/ld/plugin.c
+++ b/ld/plugin.c
@@ -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;
}