From: DJ Delorie Date: Tue, 17 Nov 1998 03:25:29 +0000 (+0000) Subject: * archive.c (bfd_ar_hdr_from_filesystem): support BFD_IN_MEMORY X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=020917f9d0c8a8c3e9a19fb617d6b077ff26a940;p=binutils-gdb.git * archive.c (bfd_ar_hdr_from_filesystem): support BFD_IN_MEMORY bfds; they have no "file" so we fake it. * bfd-in2.h: add bfd_make_writable and bfd_make_readable (regen) * libbfd.c (bfd_write): Allow writing to BFD_IN_MEMORY bfds by resizing the memory buffer. * opncls.c (bfd_make_writable): New function; lets you write a bfd_create'd bfd to an in-memory buffer. (bfd_make_readable): New function; lets you read back that buffer as if it were from bfd_openr. Used to build generated archive members (winsup's ld's dlltool) --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 4e73c5dd75c..7e50041375c 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,16 @@ +Mon Nov 16 22:19:21 1998 DJ Delorie + + * archive.c (bfd_ar_hdr_from_filesystem): support BFD_IN_MEMORY + bfds; they have no "file" so we fake it. + * bfd-in2.h: add bfd_make_writable and bfd_make_readable (regen) + * libbfd.c (bfd_write): Allow writing to BFD_IN_MEMORY bfds by + resizing the memory buffer. + * opncls.c (bfd_make_writable): New function; lets you write a + bfd_create'd bfd to an in-memory buffer. + (bfd_make_readable): New function; lets you read back that buffer + as if it were from bfd_openr. Used to build generated archive + members (winsup's ld's dlltool) + Mon Nov 16 19:15:19 1998 Dave Brolley * po/bfd.pot: Regenerated. diff --git a/bfd/opncls.c b/bfd/opncls.c index ebef3ca6936..a609e7dbd86 100644 --- a/bfd/opncls.c +++ b/bfd/opncls.c @@ -220,16 +220,17 @@ bfd_fdopenr (filename, target, fd) return NULL; } -#if defined(VMS) || defined(__GO32__) - nbfd->iostream = (PTR)fopen(filename, FOPEN_RB); +#ifndef HAVE_FDOPEN + nbfd->iostream = (PTR) fopen (filename, FOPEN_RB); #else /* (O_ACCMODE) parens are to avoid Ultrix header file bug */ - switch (fdflags & (O_ACCMODE)) { - case O_RDONLY: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RB); break; - case O_WRONLY: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RUB); break; - case O_RDWR: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RUB); break; - default: abort (); - } + switch (fdflags & (O_ACCMODE)) + { + case O_RDONLY: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RB); break; + case O_WRONLY: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RUB); break; + case O_RDWR: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RUB); break; + default: abort (); + } #endif if (nbfd->iostream == NULL) @@ -271,7 +272,7 @@ FUNCTION bfd_openstreamr SYNOPSIS - bfd *bfd_openstreamr(); + bfd *bfd_openstreamr(const char *, const char *, PTR); DESCRIPTION @@ -280,11 +281,12 @@ DESCRIPTION */ bfd * -bfd_openstreamr (filename, target, stream) +bfd_openstreamr (filename, target, streamarg) const char *filename; const char *target; - FILE *stream; + PTR streamarg; { + FILE *stream = (FILE *) streamarg; bfd *nbfd; const bfd_target *target_vec; @@ -528,6 +530,84 @@ bfd_create (filename, templ) return nbfd; } +/* +FUNCTION + bfd_make_writable + +SYNOPSIS + boolean bfd_make_writable(bfd *abfd); + +DESCRIPTION + Takes a BFD as created by <> and converts it + into one like as returned by <>. It does this + by converting the BFD to BFD_IN_MEMORY. It's assumed that + you will call <> on this bfd later. + +RETURNS + <> is returned if all is ok, otherwise <>. +*/ + +boolean +bfd_make_writable(abfd) + bfd *abfd; +{ + struct bfd_in_memory *bim; + + if (abfd->direction != no_direction) + { + bfd_set_error (bfd_error_invalid_operation); + return false; + } + + bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory)); + abfd->iostream = (PTR) bim; + /* bfd_write will grow these as needed */ + bim->size = 0; + bim->buffer = 0; + + abfd->flags |= BFD_IN_MEMORY; + abfd->direction = write_direction; + abfd->where = 0; + + return true; +} + +/* +FUNCTION + bfd_make_readable + +SYNOPSIS + boolean bfd_make_readable(bfd *abfd); + +DESCRIPTION + Takes a BFD as created by <> and + <> and converts it into one like as + returned by <>. It does this by writing the + contents out to the memory buffer, then reversing the + direction. + +RETURNS + <> is returned if all is ok, otherwise <>. */ + +boolean +bfd_make_readable(abfd) + bfd *abfd; +{ + if (abfd->direction != write_direction || !(abfd->flags & BFD_IN_MEMORY)) + { + bfd_set_error (bfd_error_invalid_operation); + return false; + } + + if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd))) + return false; + + abfd->where = 0; + abfd->direction = read_direction; + + return true; +} + /* INTERNAL_FUNCTION bfd_alloc