summaryrefslogtreecommitdiff
path: root/bfd/plugin.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2016-07-16 13:32:16 +0930
committerAlan Modra <amodra@gmail.com>2016-07-16 19:09:00 +0930
commit7d0b9ebc1e0079271a7c7737b53bc026525eab64 (patch)
tree975420444ead89bf45f08b8e620da1ce5f0ab6d2 /bfd/plugin.c
parentaac502f7d7899d96477fbd83f0038235af641def (diff)
downloadbinutils-gdb-7d0b9ebc1e0079271a7c7737b53bc026525eab64.tar.gz
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 'bfd/plugin.c')
-rw-r--r--bfd/plugin.c57
1 files changed, 29 insertions, 28 deletions
diff --git a/bfd/plugin.c b/bfd/plugin.c
index c66d95eaffc..3931d2750b1 100644
--- a/bfd/plugin.c
+++ b/bfd/plugin.c
@@ -158,49 +158,50 @@ bfd_plugin_set_program_name (const char *program_name)
plugin_program_name = program_name;
}
-static int
-try_claim (bfd *abfd)
+int
+bfd_plugin_open_input (bfd *ibfd, struct ld_plugin_input_file *file)
{
- 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;
- }
+ 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);
+ file->fd = fileno ((FILE *) iobfd->iostream);
- if (!abfd->my_archive || bfd_is_thin_archive (abfd->my_archive))
+ if (iobfd == ibfd)
{
struct stat stat_buf;
- if (fstat (file.fd, &stat_buf))
+ if (fstat (file->fd, &stat_buf))
return 0;
- file.filesize = stat_buf.st_size;
+ 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;
+ if (!bfd_plugin_open_input (abfd, &file))
+ return 0;
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