diff options
author | Rafael Ávila de Espíndola <respindola@mozilla.com> | 2011-02-26 00:03:09 +0000 |
---|---|---|
committer | Rafael Ávila de Espíndola <respindola@mozilla.com> | 2011-02-26 00:03:09 +0000 |
commit | 80549d04a2090e1c1a6a693485f577f9e45dcacc (patch) | |
tree | 2be25b3b6d93aba3cdac685579829d6cbddd1e36 /bfd/plugin.c | |
parent | eb3f9aa7a1cc1806a3ef2a5e595477024f7a7437 (diff) | |
download | binutils-gdb-80549d04a2090e1c1a6a693485f577f9e45dcacc.tar.gz |
2011-02-25 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.
Diffstat (limited to 'bfd/plugin.c')
-rw-r--r-- | bfd/plugin.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/bfd/plugin.c b/bfd/plugin.c index 30a492369d7..dde61c88309 100644 --- a/bfd/plugin.c +++ b/bfd/plugin.c @@ -232,11 +232,17 @@ 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; + static int have_loaded = 0; + static int have_plugin = 0; - if (!t) + if (!have_loaded) + { + have_loaded = 1; + have_plugin = load_plugin (); + } + if (!have_plugin) return NULL; file.name = abfd->filename; @@ -251,7 +257,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 +265,18 @@ bfd_plugin_object_p (bfd *abfd) file.fd = fileno ((FILE *) iobfd->iostream); + if (!abfd->my_archive) + { + 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; |