diff options
author | Alan Modra <amodra@gmail.com> | 2016-07-16 13:32:16 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2016-07-16 19:09:00 +0930 |
commit | 7d0b9ebc1e0079271a7c7737b53bc026525eab64 (patch) | |
tree | 975420444ead89bf45f08b8e620da1ce5f0ab6d2 /bfd/plugin.c | |
parent | aac502f7d7899d96477fbd83f0038235af641def (diff) | |
download | gdb-7d0b9ebc1e0079271a7c7737b53bc026525eab64.zip gdb-7d0b9ebc1e0079271a7c7737b53bc026525eab64.tar.gz gdb-7d0b9ebc1e0079271a7c7737b53bc026525eab64.tar.bz2 |
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.c | 57 |
1 files changed, 29 insertions, 28 deletions
diff --git a/bfd/plugin.c b/bfd/plugin.c index c66d95e..3931d27 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 |