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:
Alan Modra 2016-07-16 13:32:16 +09:30
parent aac502f7d7
commit 7d0b9ebc1e
9 changed files with 74 additions and 73 deletions

View 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..

View file

@ -29,6 +29,7 @@
#include "libiberty.h"
#include "objalloc.h"
#if BFD_SUPPORTS_PLUGINS
#include "plugin-api.h"
#include "plugin.h"
#endif

View file

@ -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

View 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);

View 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.

View file

@ -33,6 +33,7 @@
#include "arsup.h"
#include "filenames.h"
#include "binemul.h"
#include "plugin-api.h"
#include "plugin.h"
#ifdef __GO32___

View 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

View 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

View 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;
}