1 /* opncls.c -- open and close a BFD.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
4 Free Software Foundation, Inc.
6 Written by Cygnus Support.
8 This file is part of BFD, the Binary File Descriptor library.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
30 #define S_IXUSR 0100 /* Execute by owner. */
33 #define S_IXGRP 0010 /* Execute by group. */
36 #define S_IXOTH 0001 /* Execute by others. */
39 /* fdopen is a loser -- we should use stdio exclusively. Unfortunately
40 if we do that we can't use fcntl. */
42 /* Return a new BFD. All BFD's are allocated through this routine. */
49 nbfd
= (bfd
*) bfd_zmalloc ((bfd_size_type
) sizeof (bfd
));
53 nbfd
->memory
= (PTR
) objalloc_create ();
54 if (nbfd
->memory
== NULL
)
56 bfd_set_error (bfd_error_no_memory
);
61 nbfd
->arch_info
= &bfd_default_arch_struct
;
63 nbfd
->direction
= no_direction
;
64 nbfd
->iostream
= NULL
;
66 if (!bfd_hash_table_init (&nbfd
->section_htab
, bfd_section_hash_newfunc
))
71 nbfd
->sections
= (asection
*) NULL
;
72 nbfd
->section_tail
= &nbfd
->sections
;
73 nbfd
->format
= bfd_unknown
;
74 nbfd
->my_archive
= (bfd
*) NULL
;
76 nbfd
->opened_once
= false;
77 nbfd
->output_has_begun
= false;
78 nbfd
->section_count
= 0;
79 nbfd
->usrdata
= (PTR
) NULL
;
80 nbfd
->cacheable
= false;
81 nbfd
->flags
= BFD_NO_FLAGS
;
82 nbfd
->mtime_set
= false;
87 /* Allocate a new BFD as a member of archive OBFD. */
90 _bfd_new_bfd_contained_in (obfd
)
95 nbfd
= _bfd_new_bfd ();
98 nbfd
->xvec
= obfd
->xvec
;
99 nbfd
->my_archive
= obfd
;
100 nbfd
->direction
= read_direction
;
101 nbfd
->target_defaulted
= obfd
->target_defaulted
;
108 _bfd_delete_bfd (abfd
)
111 bfd_hash_table_free (&abfd
->section_htab
);
112 objalloc_free ((struct objalloc
*) abfd
->memory
);
118 Opening and closing BFDs
127 bfd *bfd_openr(const char *filename, const char *target);
130 Open the file @var{filename} (using <<fopen>>) with the target
131 @var{target}. Return a pointer to the created BFD.
133 Calls <<bfd_find_target>>, so @var{target} is interpreted as by
136 If <<NULL>> is returned then an error has occured. Possible errors
137 are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or <<system_call>> error.
141 bfd_openr (filename
, target
)
142 const char *filename
;
146 const bfd_target
*target_vec
;
148 nbfd
= _bfd_new_bfd ();
152 target_vec
= bfd_find_target (target
, nbfd
);
153 if (target_vec
== NULL
)
155 _bfd_delete_bfd (nbfd
);
159 nbfd
->filename
= filename
;
160 nbfd
->direction
= read_direction
;
162 if (bfd_open_file (nbfd
) == NULL
)
164 /* File didn't exist, or some such. */
165 bfd_set_error (bfd_error_system_call
);
166 _bfd_delete_bfd (nbfd
);
173 /* Don't try to `optimize' this function:
175 o - We lock using stack space so that interrupting the locking
176 won't cause a storage leak.
177 o - We open the file stream last, since we don't want to have to
178 close it if anything goes wrong. Closing the stream means closing
179 the file descriptor too, even though we didn't open it. */
185 bfd *bfd_fdopenr(const char *filename, const char *target, int fd);
188 <<bfd_fdopenr>> is to <<bfd_fopenr>> much like <<fdopen>> is to <<fopen>>.
189 It opens a BFD on a file already described by the @var{fd}
192 When the file is later <<bfd_close>>d, the file descriptor will be closed.
194 If the caller desires that this file descriptor be cached by BFD
195 (opened as needed, closed as needed to free descriptors for
196 other opens), with the supplied @var{fd} used as an initial
197 file descriptor (but subject to closure at any time), call
198 bfd_set_cacheable(bfd, 1) on the returned BFD. The default is to
199 assume no cacheing; the file descriptor will remain open until
200 <<bfd_close>>, and will not be affected by BFD operations on other
203 Possible errors are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
207 bfd_fdopenr (filename
, target
, fd
)
208 const char *filename
;
213 const bfd_target
*target_vec
;
216 bfd_set_error (bfd_error_system_call
);
217 #if ! defined(HAVE_FCNTL) || ! defined(F_GETFL)
218 fdflags
= O_RDWR
; /* Assume full access. */
220 fdflags
= fcntl (fd
, F_GETFL
, NULL
);
225 nbfd
= _bfd_new_bfd ();
229 target_vec
= bfd_find_target (target
, nbfd
);
230 if (target_vec
== NULL
)
232 _bfd_delete_bfd (nbfd
);
237 nbfd
->iostream
= (PTR
) fopen (filename
, FOPEN_RB
);
239 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
240 switch (fdflags
& (O_ACCMODE
))
242 case O_RDONLY
: nbfd
->iostream
= (PTR
) fdopen (fd
, FOPEN_RB
); break;
243 case O_WRONLY
: nbfd
->iostream
= (PTR
) fdopen (fd
, FOPEN_RUB
); break;
244 case O_RDWR
: nbfd
->iostream
= (PTR
) fdopen (fd
, FOPEN_RUB
); break;
249 if (nbfd
->iostream
== NULL
)
251 _bfd_delete_bfd (nbfd
);
255 /* OK, put everything where it belongs. */
256 nbfd
->filename
= filename
;
258 /* As a special case we allow a FD open for read/write to
259 be written through, although doing so requires that we end
260 the previous clause with a preposition. */
261 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
262 switch (fdflags
& (O_ACCMODE
))
264 case O_RDONLY
: nbfd
->direction
= read_direction
; break;
265 case O_WRONLY
: nbfd
->direction
= write_direction
; break;
266 case O_RDWR
: nbfd
->direction
= both_direction
; break;
270 if (! bfd_cache_init (nbfd
))
272 _bfd_delete_bfd (nbfd
);
275 nbfd
->opened_once
= true;
285 bfd *bfd_openstreamr(const char *, const char *, PTR);
289 Open a BFD for read access on an existing stdio stream. When
290 the BFD is passed to <<bfd_close>>, the stream will be closed.
294 bfd_openstreamr (filename
, target
, streamarg
)
295 const char *filename
;
299 FILE *stream
= (FILE *) streamarg
;
301 const bfd_target
*target_vec
;
303 nbfd
= _bfd_new_bfd ();
307 target_vec
= bfd_find_target (target
, nbfd
);
308 if (target_vec
== NULL
)
310 _bfd_delete_bfd (nbfd
);
314 nbfd
->iostream
= (PTR
) stream
;
315 nbfd
->filename
= filename
;
316 nbfd
->direction
= read_direction
;
318 if (! bfd_cache_init (nbfd
))
320 _bfd_delete_bfd (nbfd
);
327 /* bfd_openw -- open for writing.
328 Returns a pointer to a freshly-allocated BFD on success, or NULL.
330 See comment by bfd_fdopenr before you try to modify this function. */
337 bfd *bfd_openw(const char *filename, const char *target);
340 Create a BFD, associated with file @var{filename}, using the
341 file format @var{target}, and return a pointer to it.
343 Possible errors are <<bfd_error_system_call>>, <<bfd_error_no_memory>>,
344 <<bfd_error_invalid_target>>.
348 bfd_openw (filename
, target
)
349 const char *filename
;
353 const bfd_target
*target_vec
;
355 /* nbfd has to point to head of malloc'ed block so that bfd_close may
356 reclaim it correctly. */
357 nbfd
= _bfd_new_bfd ();
361 target_vec
= bfd_find_target (target
, nbfd
);
362 if (target_vec
== NULL
)
364 _bfd_delete_bfd (nbfd
);
368 nbfd
->filename
= filename
;
369 nbfd
->direction
= write_direction
;
371 if (bfd_open_file (nbfd
) == NULL
)
373 /* File not writeable, etc. */
374 bfd_set_error (bfd_error_system_call
);
375 _bfd_delete_bfd (nbfd
);
388 boolean bfd_close(bfd *abfd);
392 Close a BFD. If the BFD was open for writing,
393 then pending operations are completed and the file written out
394 and closed. If the created file is executable, then
395 <<chmod>> is called to mark it as such.
397 All memory attached to the BFD is released.
399 The file descriptor associated with the BFD is closed (even
400 if it was passed in to BFD by <<bfd_fdopenr>>).
403 <<true>> is returned if all is ok, otherwise <<false>>.
413 if (bfd_write_p (abfd
))
415 if (! BFD_SEND_FMT (abfd
, _bfd_write_contents
, (abfd
)))
419 if (! BFD_SEND (abfd
, _close_and_cleanup
, (abfd
)))
422 ret
= bfd_cache_close (abfd
);
424 /* If the file was open for writing and is now executable,
427 && abfd
->direction
== write_direction
428 && abfd
->flags
& EXEC_P
)
432 if (stat (abfd
->filename
, &buf
) == 0)
434 unsigned int mask
= umask (0);
437 chmod (abfd
->filename
,
439 & (buf
.st_mode
| ((S_IXUSR
| S_IXGRP
| S_IXOTH
) &~ mask
))));
443 _bfd_delete_bfd (abfd
);
453 boolean bfd_close_all_done(bfd *);
456 Close a BFD. Differs from <<bfd_close>>
457 since it does not complete any pending operations. This
458 routine would be used if the application had just used BFD for
459 swapping and didn't want to use any of the writing code.
461 If the created file is executable, then <<chmod>> is called
464 All memory attached to the BFD is released.
467 <<true>> is returned if all is ok, otherwise <<false>>.
471 bfd_close_all_done (abfd
)
476 ret
= bfd_cache_close (abfd
);
478 /* If the file was open for writing and is now executable,
481 && abfd
->direction
== write_direction
482 && abfd
->flags
& EXEC_P
)
486 if (stat (abfd
->filename
, &buf
) == 0)
488 unsigned int mask
= umask (0);
491 chmod (abfd
->filename
,
493 & (buf
.st_mode
| ((S_IXUSR
| S_IXGRP
| S_IXOTH
) &~ mask
))));
497 _bfd_delete_bfd (abfd
);
507 bfd *bfd_create(const char *filename, bfd *templ);
510 Create a new BFD in the manner of
511 <<bfd_openw>>, but without opening a file. The new BFD
512 takes the target from the target used by @var{template}. The
513 format is always set to <<bfd_object>>.
517 bfd_create (filename
, templ
)
518 const char *filename
;
523 nbfd
= _bfd_new_bfd ();
526 nbfd
->filename
= filename
;
528 nbfd
->xvec
= templ
->xvec
;
529 nbfd
->direction
= no_direction
;
530 bfd_set_format (nbfd
, bfd_object
);
540 boolean bfd_make_writable(bfd *abfd);
543 Takes a BFD as created by <<bfd_create>> and converts it
544 into one like as returned by <<bfd_openw>>. It does this
545 by converting the BFD to BFD_IN_MEMORY. It's assumed that
546 you will call <<bfd_make_readable>> on this bfd later.
549 <<true>> is returned if all is ok, otherwise <<false>>.
553 bfd_make_writable(abfd
)
556 struct bfd_in_memory
*bim
;
558 if (abfd
->direction
!= no_direction
)
560 bfd_set_error (bfd_error_invalid_operation
);
564 bim
= ((struct bfd_in_memory
*)
565 bfd_malloc ((bfd_size_type
) sizeof (struct bfd_in_memory
)));
566 abfd
->iostream
= (PTR
) bim
;
567 /* bfd_bwrite will grow these as needed. */
571 abfd
->flags
|= BFD_IN_MEMORY
;
572 abfd
->direction
= write_direction
;
583 boolean bfd_make_readable(bfd *abfd);
586 Takes a BFD as created by <<bfd_create>> and
587 <<bfd_make_writable>> and converts it into one like as
588 returned by <<bfd_openr>>. It does this by writing the
589 contents out to the memory buffer, then reversing the
593 <<true>> is returned if all is ok, otherwise <<false>>. */
596 bfd_make_readable(abfd
)
599 if (abfd
->direction
!= write_direction
|| !(abfd
->flags
& BFD_IN_MEMORY
))
601 bfd_set_error (bfd_error_invalid_operation
);
605 if (! BFD_SEND_FMT (abfd
, _bfd_write_contents
, (abfd
)))
608 if (! BFD_SEND (abfd
, _close_and_cleanup
, (abfd
)))
612 abfd
->arch_info
= &bfd_default_arch_struct
;
615 abfd
->format
= bfd_unknown
;
616 abfd
->my_archive
= (bfd
*) NULL
;
618 abfd
->opened_once
= false;
619 abfd
->output_has_begun
= false;
620 abfd
->section_count
= 0;
621 abfd
->usrdata
= (PTR
) NULL
;
622 abfd
->cacheable
= false;
623 abfd
->flags
= BFD_IN_MEMORY
;
624 abfd
->mtime_set
= false;
626 abfd
->target_defaulted
= true;
627 abfd
->direction
= read_direction
;
630 abfd
->outsymbols
= 0;
633 bfd_section_list_clear (abfd
);
634 bfd_check_format (abfd
, bfd_object
);
644 PTR bfd_alloc (bfd *abfd, size_t wanted);
647 Allocate a block of @var{wanted} bytes of memory attached to
648 <<abfd>> and return a pointer to it.
653 bfd_alloc (abfd
, size
)
659 if (size
!= (unsigned long) size
)
661 bfd_set_error (bfd_error_no_memory
);
665 ret
= objalloc_alloc (abfd
->memory
, (unsigned long) size
);
667 bfd_set_error (bfd_error_no_memory
);
672 bfd_zalloc (abfd
, size
)
678 res
= bfd_alloc (abfd
, size
);
680 memset (res
, 0, (size_t) size
);
684 /* Free a block allocated for a BFD.
685 Note: Also frees all more recently allocated blocks! */
688 bfd_release (abfd
, block
)
692 objalloc_free_block ((struct objalloc
*) abfd
->memory
, block
);