* mh-apollo68: remove unused HDEFINES setting.
[deliverable/binutils-gdb.git] / bfd / opncls.c
CommitLineData
252b5132 1/* opncls.c -- open and close a BFD.
7898deda 2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
c4f3d130 3 2001, 2002
252b5132
RH
4 Free Software Foundation, Inc.
5
6 Written by Cygnus Support.
7
c4f3d130 8 This file is part of BFD, the Binary File Descriptor library.
252b5132 9
c4f3d130
NC
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.
252b5132 14
c4f3d130
NC
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.
252b5132 19
c4f3d130
NC
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. */
252b5132
RH
23
24#include "bfd.h"
25#include "sysdep.h"
26#include "objalloc.h"
27#include "libbfd.h"
28
29#ifndef S_IXUSR
30#define S_IXUSR 0100 /* Execute by owner. */
31#endif
32#ifndef S_IXGRP
33#define S_IXGRP 0010 /* Execute by group. */
34#endif
35#ifndef S_IXOTH
36#define S_IXOTH 0001 /* Execute by others. */
37#endif
38
39/* fdopen is a loser -- we should use stdio exclusively. Unfortunately
40 if we do that we can't use fcntl. */
41
252b5132
RH
42/* Return a new BFD. All BFD's are allocated through this routine. */
43
44bfd *
45_bfd_new_bfd ()
46{
47 bfd *nbfd;
48
dc810e39 49 nbfd = (bfd *) bfd_zmalloc ((bfd_size_type) sizeof (bfd));
252b5132
RH
50 if (nbfd == NULL)
51 return NULL;
52
53 nbfd->memory = (PTR) objalloc_create ();
54 if (nbfd->memory == NULL)
55 {
56 bfd_set_error (bfd_error_no_memory);
73e87d70 57 free (nbfd);
252b5132
RH
58 return NULL;
59 }
60
61 nbfd->arch_info = &bfd_default_arch_struct;
62
63 nbfd->direction = no_direction;
64 nbfd->iostream = NULL;
65 nbfd->where = 0;
73e87d70
AM
66 if (!bfd_hash_table_init (&nbfd->section_htab, bfd_section_hash_newfunc))
67 {
68 free (nbfd);
69 return NULL;
70 }
252b5132 71 nbfd->sections = (asection *) NULL;
73e87d70 72 nbfd->section_tail = &nbfd->sections;
252b5132
RH
73 nbfd->format = bfd_unknown;
74 nbfd->my_archive = (bfd *) NULL;
dc810e39 75 nbfd->origin = 0;
252b5132
RH
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;
83
84 return nbfd;
85}
86
87/* Allocate a new BFD as a member of archive OBFD. */
88
89bfd *
90_bfd_new_bfd_contained_in (obfd)
91 bfd *obfd;
92{
93 bfd *nbfd;
94
95 nbfd = _bfd_new_bfd ();
301e3139
AM
96 if (nbfd == NULL)
97 return NULL;
252b5132
RH
98 nbfd->xvec = obfd->xvec;
99 nbfd->my_archive = obfd;
100 nbfd->direction = read_direction;
101 nbfd->target_defaulted = obfd->target_defaulted;
102 return nbfd;
103}
104
73e87d70
AM
105/* Delete a BFD. */
106
107void
108_bfd_delete_bfd (abfd)
109 bfd *abfd;
110{
111 bfd_hash_table_free (&abfd->section_htab);
112 objalloc_free ((struct objalloc *) abfd->memory);
113 free (abfd);
114}
115
252b5132
RH
116/*
117SECTION
118 Opening and closing BFDs
119
120*/
121
122/*
123FUNCTION
124 bfd_openr
125
126SYNOPSIS
dc810e39 127 bfd *bfd_openr(const char *filename, const char *target);
252b5132
RH
128
129DESCRIPTION
130 Open the file @var{filename} (using <<fopen>>) with the target
131 @var{target}. Return a pointer to the created BFD.
132
133 Calls <<bfd_find_target>>, so @var{target} is interpreted as by
134 that function.
135
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.
138*/
139
140bfd *
141bfd_openr (filename, target)
dc810e39
AM
142 const char *filename;
143 const char *target;
252b5132
RH
144{
145 bfd *nbfd;
146 const bfd_target *target_vec;
147
148 nbfd = _bfd_new_bfd ();
149 if (nbfd == NULL)
150 return NULL;
151
152 target_vec = bfd_find_target (target, nbfd);
153 if (target_vec == NULL)
154 {
252b5132 155 bfd_set_error (bfd_error_invalid_target);
73e87d70 156 _bfd_delete_bfd (nbfd);
252b5132
RH
157 return NULL;
158 }
159
160 nbfd->filename = filename;
161 nbfd->direction = read_direction;
162
163 if (bfd_open_file (nbfd) == NULL)
164 {
c4f3d130 165 /* File didn't exist, or some such. */
252b5132 166 bfd_set_error (bfd_error_system_call);
73e87d70 167 _bfd_delete_bfd (nbfd);
252b5132
RH
168 return NULL;
169 }
170
171 return nbfd;
172}
173
174/* Don't try to `optimize' this function:
175
176 o - We lock using stack space so that interrupting the locking
177 won't cause a storage leak.
178 o - We open the file stream last, since we don't want to have to
179 close it if anything goes wrong. Closing the stream means closing
c4f3d130 180 the file descriptor too, even though we didn't open it. */
252b5132
RH
181/*
182FUNCTION
183 bfd_fdopenr
184
185SYNOPSIS
dc810e39 186 bfd *bfd_fdopenr(const char *filename, const char *target, int fd);
252b5132
RH
187
188DESCRIPTION
189 <<bfd_fdopenr>> is to <<bfd_fopenr>> much like <<fdopen>> is to <<fopen>>.
190 It opens a BFD on a file already described by the @var{fd}
191 supplied.
192
193 When the file is later <<bfd_close>>d, the file descriptor will be closed.
194
195 If the caller desires that this file descriptor be cached by BFD
196 (opened as needed, closed as needed to free descriptors for
197 other opens), with the supplied @var{fd} used as an initial
198 file descriptor (but subject to closure at any time), call
199 bfd_set_cacheable(bfd, 1) on the returned BFD. The default is to
200 assume no cacheing; the file descriptor will remain open until
201 <<bfd_close>>, and will not be affected by BFD operations on other
202 files.
203
204 Possible errors are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
205*/
206
207bfd *
208bfd_fdopenr (filename, target, fd)
dc810e39
AM
209 const char *filename;
210 const char *target;
252b5132
RH
211 int fd;
212{
213 bfd *nbfd;
214 const bfd_target *target_vec;
215 int fdflags;
216
217 bfd_set_error (bfd_error_system_call);
218#if ! defined(HAVE_FCNTL) || ! defined(F_GETFL)
c4f3d130 219 fdflags = O_RDWR; /* Assume full access. */
252b5132
RH
220#else
221 fdflags = fcntl (fd, F_GETFL, NULL);
222#endif
223 if (fdflags == -1) return NULL;
224
225 nbfd = _bfd_new_bfd ();
226 if (nbfd == NULL)
227 return NULL;
228
229 target_vec = bfd_find_target (target, nbfd);
230 if (target_vec == NULL)
231 {
232 bfd_set_error (bfd_error_invalid_target);
73e87d70 233 _bfd_delete_bfd (nbfd);
252b5132
RH
234 return NULL;
235 }
236
237#ifndef HAVE_FDOPEN
238 nbfd->iostream = (PTR) fopen (filename, FOPEN_RB);
239#else
c4f3d130 240 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
252b5132
RH
241 switch (fdflags & (O_ACCMODE))
242 {
243 case O_RDONLY: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RB); break;
244 case O_WRONLY: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RUB); break;
245 case O_RDWR: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RUB); break;
246 default: abort ();
247 }
248#endif
249
250 if (nbfd->iostream == NULL)
251 {
73e87d70 252 _bfd_delete_bfd (nbfd);
252b5132
RH
253 return NULL;
254 }
255
c4f3d130 256 /* OK, put everything where it belongs. */
252b5132
RH
257 nbfd->filename = filename;
258
259 /* As a special case we allow a FD open for read/write to
260 be written through, although doing so requires that we end
261 the previous clause with a preposition. */
c4f3d130 262 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
d768008d 263 switch (fdflags & (O_ACCMODE))
252b5132
RH
264 {
265 case O_RDONLY: nbfd->direction = read_direction; break;
266 case O_WRONLY: nbfd->direction = write_direction; break;
267 case O_RDWR: nbfd->direction = both_direction; break;
268 default: abort ();
269 }
270
271 if (! bfd_cache_init (nbfd))
272 {
73e87d70 273 _bfd_delete_bfd (nbfd);
252b5132
RH
274 return NULL;
275 }
276 nbfd->opened_once = true;
277
278 return nbfd;
279}
280
281/*
282FUNCTION
283 bfd_openstreamr
284
285SYNOPSIS
286 bfd *bfd_openstreamr(const char *, const char *, PTR);
287
288DESCRIPTION
289
290 Open a BFD for read access on an existing stdio stream. When
291 the BFD is passed to <<bfd_close>>, the stream will be closed.
292*/
293
294bfd *
295bfd_openstreamr (filename, target, streamarg)
296 const char *filename;
297 const char *target;
298 PTR streamarg;
299{
300 FILE *stream = (FILE *) streamarg;
301 bfd *nbfd;
302 const bfd_target *target_vec;
303
304 nbfd = _bfd_new_bfd ();
305 if (nbfd == NULL)
306 return NULL;
307
308 target_vec = bfd_find_target (target, nbfd);
309 if (target_vec == NULL)
310 {
311 bfd_set_error (bfd_error_invalid_target);
73e87d70 312 _bfd_delete_bfd (nbfd);
252b5132
RH
313 return NULL;
314 }
315
316 nbfd->iostream = (PTR) stream;
317 nbfd->filename = filename;
318 nbfd->direction = read_direction;
dc810e39 319
252b5132
RH
320 if (! bfd_cache_init (nbfd))
321 {
73e87d70 322 _bfd_delete_bfd (nbfd);
252b5132
RH
323 return NULL;
324 }
325
326 return nbfd;
327}
328\f
c4f3d130
NC
329/* bfd_openw -- open for writing.
330 Returns a pointer to a freshly-allocated BFD on success, or NULL.
252b5132 331
c4f3d130 332 See comment by bfd_fdopenr before you try to modify this function. */
252b5132
RH
333
334/*
335FUNCTION
336 bfd_openw
337
338SYNOPSIS
dc810e39 339 bfd *bfd_openw(const char *filename, const char *target);
252b5132
RH
340
341DESCRIPTION
342 Create a BFD, associated with file @var{filename}, using the
343 file format @var{target}, and return a pointer to it.
344
345 Possible errors are <<bfd_error_system_call>>, <<bfd_error_no_memory>>,
346 <<bfd_error_invalid_target>>.
347*/
348
349bfd *
350bfd_openw (filename, target)
dc810e39
AM
351 const char *filename;
352 const char *target;
252b5132
RH
353{
354 bfd *nbfd;
355 const bfd_target *target_vec;
356
357 bfd_set_error (bfd_error_system_call);
358
359 /* nbfd has to point to head of malloc'ed block so that bfd_close may
c4f3d130 360 reclaim it correctly. */
252b5132
RH
361 nbfd = _bfd_new_bfd ();
362 if (nbfd == NULL)
363 return NULL;
364
365 target_vec = bfd_find_target (target, nbfd);
366 if (target_vec == NULL)
367 {
73e87d70 368 _bfd_delete_bfd (nbfd);
252b5132
RH
369 return NULL;
370 }
371
372 nbfd->filename = filename;
373 nbfd->direction = write_direction;
374
375 if (bfd_open_file (nbfd) == NULL)
376 {
c4f3d130
NC
377 /* File not writeable, etc. */
378 bfd_set_error (bfd_error_system_call);
73e87d70 379 _bfd_delete_bfd (nbfd);
252b5132
RH
380 return NULL;
381 }
382
383 return nbfd;
384}
385
386/*
387
388FUNCTION
389 bfd_close
390
391SYNOPSIS
392 boolean bfd_close(bfd *abfd);
393
394DESCRIPTION
395
396 Close a BFD. If the BFD was open for writing,
397 then pending operations are completed and the file written out
398 and closed. If the created file is executable, then
399 <<chmod>> is called to mark it as such.
400
401 All memory attached to the BFD is released.
402
403 The file descriptor associated with the BFD is closed (even
404 if it was passed in to BFD by <<bfd_fdopenr>>).
405
406RETURNS
407 <<true>> is returned if all is ok, otherwise <<false>>.
408*/
409
410
411boolean
412bfd_close (abfd)
413 bfd *abfd;
414{
415 boolean ret;
416
c4f3d130 417 if (bfd_write_p (abfd))
252b5132
RH
418 {
419 if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
420 return false;
421 }
422
423 if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
424 return false;
425
426 ret = bfd_cache_close (abfd);
427
428 /* If the file was open for writing and is now executable,
c4f3d130 429 make it so. */
252b5132
RH
430 if (ret
431 && abfd->direction == write_direction
432 && abfd->flags & EXEC_P)
433 {
434 struct stat buf;
435
436 if (stat (abfd->filename, &buf) == 0)
437 {
dc810e39 438 unsigned int mask = umask (0);
c4f3d130 439
252b5132
RH
440 umask (mask);
441 chmod (abfd->filename,
442 (0777
443 & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
444 }
445 }
446
73e87d70 447 _bfd_delete_bfd (abfd);
252b5132
RH
448
449 return ret;
450}
451
452/*
453FUNCTION
454 bfd_close_all_done
455
456SYNOPSIS
457 boolean bfd_close_all_done(bfd *);
458
459DESCRIPTION
460 Close a BFD. Differs from <<bfd_close>>
461 since it does not complete any pending operations. This
462 routine would be used if the application had just used BFD for
463 swapping and didn't want to use any of the writing code.
464
465 If the created file is executable, then <<chmod>> is called
466 to mark it as such.
467
468 All memory attached to the BFD is released.
469
470RETURNS
471 <<true>> is returned if all is ok, otherwise <<false>>.
252b5132
RH
472*/
473
474boolean
475bfd_close_all_done (abfd)
476 bfd *abfd;
477{
478 boolean ret;
479
480 ret = bfd_cache_close (abfd);
481
482 /* If the file was open for writing and is now executable,
c4f3d130 483 make it so. */
252b5132
RH
484 if (ret
485 && abfd->direction == write_direction
486 && abfd->flags & EXEC_P)
487 {
488 struct stat buf;
489
490 if (stat (abfd->filename, &buf) == 0)
491 {
dc810e39 492 unsigned int mask = umask (0);
c4f3d130 493
252b5132
RH
494 umask (mask);
495 chmod (abfd->filename,
b6cdd0fd 496 (0777
252b5132
RH
497 & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
498 }
499 }
500
73e87d70 501 _bfd_delete_bfd (abfd);
252b5132
RH
502
503 return ret;
504}
505
506/*
507FUNCTION
508 bfd_create
509
510SYNOPSIS
dc810e39 511 bfd *bfd_create(const char *filename, bfd *templ);
252b5132
RH
512
513DESCRIPTION
514 Create a new BFD in the manner of
515 <<bfd_openw>>, but without opening a file. The new BFD
516 takes the target from the target used by @var{template}. The
517 format is always set to <<bfd_object>>.
252b5132
RH
518*/
519
520bfd *
521bfd_create (filename, templ)
dc810e39 522 const char *filename;
252b5132
RH
523 bfd *templ;
524{
525 bfd *nbfd;
526
527 nbfd = _bfd_new_bfd ();
528 if (nbfd == NULL)
529 return NULL;
530 nbfd->filename = filename;
531 if (templ)
532 nbfd->xvec = templ->xvec;
533 nbfd->direction = no_direction;
534 bfd_set_format (nbfd, bfd_object);
c4f3d130 535
252b5132
RH
536 return nbfd;
537}
538
539/*
540FUNCTION
541 bfd_make_writable
542
543SYNOPSIS
544 boolean bfd_make_writable(bfd *abfd);
545
546DESCRIPTION
547 Takes a BFD as created by <<bfd_create>> and converts it
548 into one like as returned by <<bfd_openw>>. It does this
549 by converting the BFD to BFD_IN_MEMORY. It's assumed that
550 you will call <<bfd_make_readable>> on this bfd later.
551
552RETURNS
553 <<true>> is returned if all is ok, otherwise <<false>>.
554*/
555
556boolean
557bfd_make_writable(abfd)
558 bfd *abfd;
559{
560 struct bfd_in_memory *bim;
561
562 if (abfd->direction != no_direction)
563 {
564 bfd_set_error (bfd_error_invalid_operation);
565 return false;
566 }
567
dc810e39
AM
568 bim = ((struct bfd_in_memory *)
569 bfd_malloc ((bfd_size_type) sizeof (struct bfd_in_memory)));
252b5132 570 abfd->iostream = (PTR) bim;
c4f3d130 571 /* bfd_bwrite will grow these as needed. */
252b5132
RH
572 bim->size = 0;
573 bim->buffer = 0;
574
575 abfd->flags |= BFD_IN_MEMORY;
576 abfd->direction = write_direction;
577 abfd->where = 0;
578
579 return true;
580}
581
582/*
583FUNCTION
584 bfd_make_readable
585
586SYNOPSIS
587 boolean bfd_make_readable(bfd *abfd);
588
589DESCRIPTION
590 Takes a BFD as created by <<bfd_create>> and
591 <<bfd_make_writable>> and converts it into one like as
592 returned by <<bfd_openr>>. It does this by writing the
593 contents out to the memory buffer, then reversing the
594 direction.
595
596RETURNS
597 <<true>> is returned if all is ok, otherwise <<false>>. */
598
599boolean
600bfd_make_readable(abfd)
601 bfd *abfd;
602{
603 if (abfd->direction != write_direction || !(abfd->flags & BFD_IN_MEMORY))
604 {
605 bfd_set_error (bfd_error_invalid_operation);
606 return false;
607 }
608
609 if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
610 return false;
611
612 if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
613 return false;
614
615
616 abfd->arch_info = &bfd_default_arch_struct;
617
618 abfd->where = 0;
252b5132
RH
619 abfd->format = bfd_unknown;
620 abfd->my_archive = (bfd *) NULL;
dc810e39 621 abfd->origin = 0;
252b5132
RH
622 abfd->opened_once = false;
623 abfd->output_has_begun = false;
624 abfd->section_count = 0;
625 abfd->usrdata = (PTR) NULL;
626 abfd->cacheable = false;
627 abfd->flags = BFD_IN_MEMORY;
628 abfd->mtime_set = false;
629
630 abfd->target_defaulted = true;
631 abfd->direction = read_direction;
632 abfd->sections = 0;
633 abfd->symcount = 0;
634 abfd->outsymbols = 0;
635 abfd->tdata.any = 0;
636
e54fdaa5
AM
637 bfd_section_list_clear (abfd);
638 bfd_check_format (abfd, bfd_object);
252b5132
RH
639
640 return true;
641}
642
643/*
644INTERNAL_FUNCTION
645 bfd_alloc
646
647SYNOPSIS
648 PTR bfd_alloc (bfd *abfd, size_t wanted);
649
650DESCRIPTION
651 Allocate a block of @var{wanted} bytes of memory attached to
652 <<abfd>> and return a pointer to it.
653*/
654
655
656PTR
657bfd_alloc (abfd, size)
658 bfd *abfd;
dc810e39 659 bfd_size_type size;
252b5132
RH
660{
661 PTR ret;
662
dc810e39
AM
663 if (size != (unsigned long) size)
664 {
665 bfd_set_error (bfd_error_no_memory);
666 return NULL;
667 }
668
252b5132
RH
669 ret = objalloc_alloc (abfd->memory, (unsigned long) size);
670 if (ret == NULL)
671 bfd_set_error (bfd_error_no_memory);
672 return ret;
673}
674
675PTR
676bfd_zalloc (abfd, size)
677 bfd *abfd;
dc810e39 678 bfd_size_type size;
252b5132
RH
679{
680 PTR res;
681
682 res = bfd_alloc (abfd, size);
683 if (res)
dc810e39 684 memset (res, 0, (size_t) size);
252b5132
RH
685 return res;
686}
687
73e87d70
AM
688/* Free a block allocated for a BFD.
689 Note: Also frees all more recently allocated blocks! */
252b5132
RH
690
691void
692bfd_release (abfd, block)
693 bfd *abfd;
694 PTR block;
695{
696 objalloc_free_block ((struct objalloc *) abfd->memory, block);
697}
This page took 0.195587 seconds and 4 git commands to generate.