This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [patch] Fix some plugin API issues in BFD
- From: Rafael Ávila de Espíndola <respindola at mozilla dot com>
- To: binutils at sourceware dot org
- Cc: iant at google dot com, ccoutant at google dot com
- Date: Sun, 20 Feb 2011 14:54:54 -0500
- Subject: Re: [patch] Fix some plugin API issues in BFD
- References: <4D52072E.20908@mozilla.com>
An updated patch is attached that also avoids calling onload multiple times.
2010-02-20 Rafael Ávila de Espíndola <respindola@mozilla.com>
* plugin.c (bfd_plugin_object_p): Correctly set the filesize
and handle claim_file seeking. Only try to load the plugin once.
On 2011-02-08 22:17, Rafael Ávila de Espíndola wrote:
> I recently updated a plugin to use the file descriptor directly. This
> worked fine in gold, but had two issues using bfd (nm and ar):
>
> *) The filesize was not being set.
> *) The code expected the claim_file callback to not seek.
>
> That is not my understanding from reading the api documentation in
> http://gcc.gnu.org/wiki/whopr/driver, so the attached patch fixes both
> issues.
Cheers,
Rafael
diff --git a/bfd/plugin.c b/bfd/plugin.c
index 30a4923..224d0e2 100644
--- a/bfd/plugin.c
+++ b/bfd/plugin.c
@@ -232,16 +232,21 @@ static const bfd_target *
bfd_plugin_object_p (bfd *abfd)
{
int claimed = 0;
- int t = load_plugin ();
struct ld_plugin_input_file file;
bfd *iobfd;
-
- if (!t)
+ static int have_loaded = 0;
+ static int have_plugin = 0;
+ if (!have_loaded)
+ {
+ have_loaded = 1;
+ have_plugin = load_plugin ();
+ }
+ if (!have_plugin)
return NULL;
file.name = abfd->filename;
- if (abfd->my_archive)
+ if (abfd->format == bfd_archive)
{
iobfd = abfd->my_archive;
file.offset = abfd->origin;
@@ -251,7 +256,7 @@ bfd_plugin_object_p (bfd *abfd)
{
iobfd = abfd;
file.offset = 0;
- file.filesize = 0; /*FIXME*/
+ file.filesize = 0;
}
if (!iobfd->iostream && !bfd_open_file (iobfd))
@@ -259,8 +264,18 @@ bfd_plugin_object_p (bfd *abfd)
file.fd = fileno ((FILE *) iobfd->iostream);
+ if (abfd->format == bfd_object)
+ {
+ struct stat stat_buf;
+ if (fstat (file.fd, &stat_buf))
+ return NULL;
+ file.filesize = stat_buf.st_size;
+ }
+
file.handle = abfd;
+ off_t cur_offset = lseek(file.fd, 0, SEEK_CUR);
claim_file (&file, &claimed);
+ lseek(file.fd, cur_offset, SEEK_SET);
if (!claimed)
return NULL;