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.
This commit is contained in:
parent
aac502f7d7
commit
7d0b9ebc1e
9 changed files with 74 additions and 73 deletions
|
@ -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..
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "libiberty.h"
|
||||
#include "objalloc.h"
|
||||
#if BFD_SUPPORTS_PLUGINS
|
||||
#include "plugin-api.h"
|
||||
#include "plugin.h"
|
||||
#endif
|
||||
|
||||
|
|
69
bfd/plugin.c
69
bfd/plugin.c
|
@ -158,49 +158,50 @@ bfd_plugin_set_program_name (const char *program_name)
|
|||
plugin_program_name = program_name;
|
||||
}
|
||||
|
||||
int
|
||||
bfd_plugin_open_input (bfd *ibfd, struct ld_plugin_input_file *file)
|
||||
{
|
||||
bfd *iobfd;
|
||||
|
||||
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);
|
||||
|
||||
if (iobfd == ibfd)
|
||||
{
|
||||
struct stat stat_buf;
|
||||
if (fstat (file->fd, &stat_buf))
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
||||
if (!iobfd->iostream && !bfd_open_file (iobfd))
|
||||
if (!bfd_plugin_open_input (abfd, &file))
|
||||
return 0;
|
||||
|
||||
file.fd = fileno ((FILE *) iobfd->iostream);
|
||||
|
||||
if (!abfd->my_archive || bfd_is_thin_archive (abfd->my_archive))
|
||||
{
|
||||
struct stat stat_buf;
|
||||
if (fstat (file.fd, &stat_buf))
|
||||
return 0;
|
||||
file.filesize = stat_buf.st_size;
|
||||
}
|
||||
|
||||
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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include "arsup.h"
|
||||
#include "filenames.h"
|
||||
#include "binemul.h"
|
||||
#include "plugin-api.h"
|
||||
#include "plugin.h"
|
||||
|
||||
#ifdef __GO32___
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
53
ld/plugin.c
53
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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue