diff options
author | Alan Modra <amodra@gmail.com> | 2016-07-16 13:32:16 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2016-07-16 19:09:00 +0930 |
commit | 7d0b9ebc1e0079271a7c7737b53bc026525eab64 (patch) | |
tree | 975420444ead89bf45f08b8e620da1ce5f0ab6d2 /ld/plugin.c | |
parent | aac502f7d7899d96477fbd83f0038235af641def (diff) | |
download | gdb-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.c | 53 |
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; } |