xref: /dragonfly/contrib/gdb-7/bfd/opncls.c (revision b4f25088)
1 /* opncls.c -- open and close a BFD.
2    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
3    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4    Free Software Foundation, Inc.
5 
6    Written by Cygnus Support.
7 
8    This file is part of BFD, the Binary File Descriptor library.
9 
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 3 of the License, or
13    (at your option) any later version.
14 
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.
19 
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., 51 Franklin Street - Fifth Floor, Boston,
23    MA 02110-1301, USA.  */
24 
25 #include "sysdep.h"
26 #include "bfd.h"
27 #include "objalloc.h"
28 #include "libbfd.h"
29 #include "libiberty.h"
30 
31 #ifndef S_IXUSR
32 #define S_IXUSR 0100	/* Execute by owner.  */
33 #endif
34 #ifndef S_IXGRP
35 #define S_IXGRP 0010	/* Execute by group.  */
36 #endif
37 #ifndef S_IXOTH
38 #define S_IXOTH 0001	/* Execute by others.  */
39 #endif
40 
41 /* Counters used to initialize the bfd identifier.  */
42 
43 static unsigned int bfd_id_counter = 0;
44 static unsigned int bfd_reserved_id_counter = 0;
45 
46 /*
47 CODE_FRAGMENT
48 .{* Set to N to open the next N BFDs using an alternate id space.  *}
49 .extern unsigned int bfd_use_reserved_id;
50 */
51 unsigned int bfd_use_reserved_id = 0;
52 
53 /* fdopen is a loser -- we should use stdio exclusively.  Unfortunately
54    if we do that we can't use fcntl.  */
55 
56 /* Return a new BFD.  All BFD's are allocated through this routine.  */
57 
58 bfd *
59 _bfd_new_bfd (void)
60 {
61   bfd *nbfd;
62 
63   nbfd = (bfd *) bfd_zmalloc (sizeof (bfd));
64   if (nbfd == NULL)
65     return NULL;
66 
67   if (bfd_use_reserved_id)
68     {
69       nbfd->id = --bfd_reserved_id_counter;
70       --bfd_use_reserved_id;
71     }
72   else
73     nbfd->id = bfd_id_counter++;
74 
75   nbfd->memory = objalloc_create ();
76   if (nbfd->memory == NULL)
77     {
78       bfd_set_error (bfd_error_no_memory);
79       free (nbfd);
80       return NULL;
81     }
82 
83   nbfd->arch_info = &bfd_default_arch_struct;
84 
85   nbfd->direction = no_direction;
86   nbfd->iostream = NULL;
87   nbfd->where = 0;
88   if (!bfd_hash_table_init_n (& nbfd->section_htab, bfd_section_hash_newfunc,
89 			      sizeof (struct section_hash_entry), 251))
90     {
91       free (nbfd);
92       return NULL;
93     }
94   nbfd->sections = NULL;
95   nbfd->section_last = NULL;
96   nbfd->format = bfd_unknown;
97   nbfd->my_archive = NULL;
98   nbfd->origin = 0;
99   nbfd->opened_once = FALSE;
100   nbfd->output_has_begun = FALSE;
101   nbfd->section_count = 0;
102   nbfd->usrdata = NULL;
103   nbfd->cacheable = FALSE;
104   nbfd->flags = BFD_NO_FLAGS;
105   nbfd->mtime_set = FALSE;
106 
107   return nbfd;
108 }
109 
110 /* Allocate a new BFD as a member of archive OBFD.  */
111 
112 bfd *
113 _bfd_new_bfd_contained_in (bfd *obfd)
114 {
115   bfd *nbfd;
116 
117   nbfd = _bfd_new_bfd ();
118   if (nbfd == NULL)
119     return NULL;
120   nbfd->xvec = obfd->xvec;
121   nbfd->iovec = obfd->iovec;
122   nbfd->my_archive = obfd;
123   nbfd->direction = read_direction;
124   nbfd->target_defaulted = obfd->target_defaulted;
125   return nbfd;
126 }
127 
128 /* Delete a BFD.  */
129 
130 void
131 _bfd_delete_bfd (bfd *abfd)
132 {
133   if (abfd->memory)
134     {
135       bfd_hash_table_free (&abfd->section_htab);
136       objalloc_free ((struct objalloc *) abfd->memory);
137     }
138   free (abfd);
139 }
140 
141 /* Free objalloc memory.  */
142 
143 bfd_boolean
144 _bfd_free_cached_info (bfd *abfd)
145 {
146   if (abfd->memory)
147     {
148       bfd_hash_table_free (&abfd->section_htab);
149       objalloc_free ((struct objalloc *) abfd->memory);
150 
151       abfd->sections = NULL;
152       abfd->section_last = NULL;
153       abfd->outsymbols = NULL;
154       abfd->tdata.any = NULL;
155       abfd->usrdata = NULL;
156       abfd->memory = NULL;
157     }
158 
159   return TRUE;
160 }
161 
162 /*
163 SECTION
164 	Opening and closing BFDs
165 
166 SUBSECTION
167 	Functions for opening and closing
168 */
169 
170 /*
171 FUNCTION
172 	bfd_fopen
173 
174 SYNOPSIS
175 	bfd *bfd_fopen (const char *filename, const char *target,
176                         const char *mode, int fd);
177 
178 DESCRIPTION
179 	Open the file @var{filename} with the target @var{target}.
180 	Return a pointer to the created BFD.  If @var{fd} is not -1,
181 	then <<fdopen>> is used to open the file; otherwise, <<fopen>>
182 	is used.  @var{mode} is passed directly to <<fopen>> or
183 	<<fdopen>>.
184 
185 	Calls <<bfd_find_target>>, so @var{target} is interpreted as by
186 	that function.
187 
188 	The new BFD is marked as cacheable iff @var{fd} is -1.
189 
190 	If <<NULL>> is returned then an error has occured.   Possible errors
191 	are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or
192 	<<system_call>> error.
193 */
194 
195 bfd *
196 bfd_fopen (const char *filename, const char *target, const char *mode, int fd)
197 {
198   bfd *nbfd;
199   const bfd_target *target_vec;
200 
201   nbfd = _bfd_new_bfd ();
202   if (nbfd == NULL)
203     return NULL;
204 
205   target_vec = bfd_find_target (target, nbfd);
206   if (target_vec == NULL)
207     {
208       _bfd_delete_bfd (nbfd);
209       return NULL;
210     }
211 
212 #ifdef HAVE_FDOPEN
213   if (fd != -1)
214     nbfd->iostream = fdopen (fd, mode);
215   else
216 #endif
217     nbfd->iostream = real_fopen (filename, mode);
218   if (nbfd->iostream == NULL)
219     {
220       bfd_set_error (bfd_error_system_call);
221       _bfd_delete_bfd (nbfd);
222       return NULL;
223     }
224 
225   /* OK, put everything where it belongs.  */
226   nbfd->filename = filename;
227 
228   /* Figure out whether the user is opening the file for reading,
229      writing, or both, by looking at the MODE argument.  */
230   if ((mode[0] == 'r' || mode[0] == 'w' || mode[0] == 'a')
231       && mode[1] == '+')
232     nbfd->direction = both_direction;
233   else if (mode[0] == 'r')
234     nbfd->direction = read_direction;
235   else
236     nbfd->direction = write_direction;
237 
238   if (! bfd_cache_init (nbfd))
239     {
240       _bfd_delete_bfd (nbfd);
241       return NULL;
242     }
243   nbfd->opened_once = TRUE;
244   /* If we opened the file by name, mark it cacheable; we can close it
245      and reopen it later.  However, if a file descriptor was provided,
246      then it may have been opened with special flags that make it
247      unsafe to close and reopen the file.  */
248   if (fd == -1)
249     bfd_set_cacheable (nbfd, TRUE);
250 
251   return nbfd;
252 }
253 
254 /*
255 FUNCTION
256 	bfd_openr
257 
258 SYNOPSIS
259 	bfd *bfd_openr (const char *filename, const char *target);
260 
261 DESCRIPTION
262 	Open the file @var{filename} (using <<fopen>>) with the target
263 	@var{target}.  Return a pointer to the created BFD.
264 
265 	Calls <<bfd_find_target>>, so @var{target} is interpreted as by
266 	that function.
267 
268 	If <<NULL>> is returned then an error has occured.   Possible errors
269 	are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or
270 	<<system_call>> error.
271 */
272 
273 bfd *
274 bfd_openr (const char *filename, const char *target)
275 {
276   return bfd_fopen (filename, target, FOPEN_RB, -1);
277 }
278 
279 /* Don't try to `optimize' this function:
280 
281    o - We lock using stack space so that interrupting the locking
282        won't cause a storage leak.
283    o - We open the file stream last, since we don't want to have to
284        close it if anything goes wrong.  Closing the stream means closing
285        the file descriptor too, even though we didn't open it.  */
286 /*
287 FUNCTION
288 	bfd_fdopenr
289 
290 SYNOPSIS
291 	bfd *bfd_fdopenr (const char *filename, const char *target, int fd);
292 
293 DESCRIPTION
294 	<<bfd_fdopenr>> is to <<bfd_fopenr>> much like <<fdopen>> is to
295 	<<fopen>>.  It opens a BFD on a file already described by the
296 	@var{fd} supplied.
297 
298 	When the file is later <<bfd_close>>d, the file descriptor will
299 	be closed.  If the caller desires that this file descriptor be
300 	cached by BFD (opened as needed, closed as needed to free
301 	descriptors for other opens), with the supplied @var{fd} used as
302 	an initial file descriptor (but subject to closure at any time),
303 	call bfd_set_cacheable(bfd, 1) on the returned BFD.  The default
304 	is to assume no caching; the file descriptor will remain open
305 	until <<bfd_close>>, and will not be affected by BFD operations
306 	on other files.
307 
308 	Possible errors are <<bfd_error_no_memory>>,
309 	<<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
310 */
311 
312 bfd *
313 bfd_fdopenr (const char *filename, const char *target, int fd)
314 {
315   const char *mode;
316 #if defined(HAVE_FCNTL) && defined(F_GETFL)
317   int fdflags;
318 #endif
319 
320 #if ! defined(HAVE_FCNTL) || ! defined(F_GETFL)
321   mode = FOPEN_RUB; /* Assume full access.  */
322 #else
323   fdflags = fcntl (fd, F_GETFL, NULL);
324   if (fdflags == -1)
325     {
326       bfd_set_error (bfd_error_system_call);
327       return NULL;
328     }
329 
330   /* (O_ACCMODE) parens are to avoid Ultrix header file bug.  */
331   switch (fdflags & (O_ACCMODE))
332     {
333     case O_RDONLY: mode = FOPEN_RB; break;
334     case O_WRONLY: mode = FOPEN_RUB; break;
335     case O_RDWR:   mode = FOPEN_RUB; break;
336     default: abort ();
337     }
338 #endif
339 
340   return bfd_fopen (filename, target, mode, fd);
341 }
342 
343 /*
344 FUNCTION
345 	bfd_openstreamr
346 
347 SYNOPSIS
348 	bfd *bfd_openstreamr (const char *, const char *, void *);
349 
350 DESCRIPTION
351 
352 	Open a BFD for read access on an existing stdio stream.  When
353 	the BFD is passed to <<bfd_close>>, the stream will be closed.
354 */
355 
356 bfd *
357 bfd_openstreamr (const char *filename, const char *target, void *streamarg)
358 {
359   FILE *stream = (FILE *) streamarg;
360   bfd *nbfd;
361   const bfd_target *target_vec;
362 
363   nbfd = _bfd_new_bfd ();
364   if (nbfd == NULL)
365     return NULL;
366 
367   target_vec = bfd_find_target (target, nbfd);
368   if (target_vec == NULL)
369     {
370       _bfd_delete_bfd (nbfd);
371       return NULL;
372     }
373 
374   nbfd->iostream = stream;
375   nbfd->filename = filename;
376   nbfd->direction = read_direction;
377 
378   if (! bfd_cache_init (nbfd))
379     {
380       _bfd_delete_bfd (nbfd);
381       return NULL;
382     }
383 
384   return nbfd;
385 }
386 
387 /*
388 FUNCTION
389 	bfd_openr_iovec
390 
391 SYNOPSIS
392         bfd *bfd_openr_iovec (const char *filename, const char *target,
393                               void *(*open_func) (struct bfd *nbfd,
394                                                   void *open_closure),
395                               void *open_closure,
396                               file_ptr (*pread_func) (struct bfd *nbfd,
397                                                       void *stream,
398                                                       void *buf,
399                                                       file_ptr nbytes,
400                                                       file_ptr offset),
401                               int (*close_func) (struct bfd *nbfd,
402                                                  void *stream),
403 			      int (*stat_func) (struct bfd *abfd,
404 					        void *stream,
405 					        struct stat *sb));
406 
407 DESCRIPTION
408 
409         Create and return a BFD backed by a read-only @var{stream}.
410         The @var{stream} is created using @var{open_func}, accessed using
411         @var{pread_func} and destroyed using @var{close_func}.
412 
413 	Calls <<bfd_find_target>>, so @var{target} is interpreted as by
414 	that function.
415 
416 	Calls @var{open_func} (which can call <<bfd_zalloc>> and
417 	<<bfd_get_filename>>) to obtain the read-only stream backing
418 	the BFD.  @var{open_func} either succeeds returning the
419 	non-<<NULL>> @var{stream}, or fails returning <<NULL>>
420 	(setting <<bfd_error>>).
421 
422 	Calls @var{pread_func} to request @var{nbytes} of data from
423 	@var{stream} starting at @var{offset} (e.g., via a call to
424 	<<bfd_read>>).  @var{pread_func} either succeeds returning the
425 	number of bytes read (which can be less than @var{nbytes} when
426 	end-of-file), or fails returning -1 (setting <<bfd_error>>).
427 
428 	Calls @var{close_func} when the BFD is later closed using
429 	<<bfd_close>>.  @var{close_func} either succeeds returning 0, or
430 	fails returning -1 (setting <<bfd_error>>).
431 
432 	Calls @var{stat_func} to fill in a stat structure for bfd_stat,
433 	bfd_get_size, and bfd_get_mtime calls.  @var{stat_func} returns 0
434 	on success, or returns -1 on failure (setting <<bfd_error>>).
435 
436 	If <<bfd_openr_iovec>> returns <<NULL>> then an error has
437 	occurred.  Possible errors are <<bfd_error_no_memory>>,
438 	<<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
439 
440 */
441 
442 struct opncls
443 {
444   void *stream;
445   file_ptr (*pread) (struct bfd *abfd, void *stream, void *buf,
446 		     file_ptr nbytes, file_ptr offset);
447   int (*close) (struct bfd *abfd, void *stream);
448   int (*stat) (struct bfd *abfd, void *stream, struct stat *sb);
449   file_ptr where;
450 };
451 
452 static file_ptr
453 opncls_btell (struct bfd *abfd)
454 {
455   struct opncls *vec = (struct opncls *) abfd->iostream;
456   return vec->where;
457 }
458 
459 static int
460 opncls_bseek (struct bfd *abfd, file_ptr offset, int whence)
461 {
462   struct opncls *vec = (struct opncls *) abfd->iostream;
463   switch (whence)
464     {
465     case SEEK_SET: vec->where = offset; break;
466     case SEEK_CUR: vec->where += offset; break;
467     case SEEK_END: return -1;
468     }
469   return 0;
470 }
471 
472 static file_ptr
473 opncls_bread (struct bfd *abfd, void *buf, file_ptr nbytes)
474 {
475   struct opncls *vec = (struct opncls *) abfd->iostream;
476   file_ptr nread = (vec->pread) (abfd, vec->stream, buf, nbytes, vec->where);
477   if (nread < 0)
478     return nread;
479   vec->where += nread;
480   return nread;
481 }
482 
483 static file_ptr
484 opncls_bwrite (struct bfd *abfd ATTRIBUTE_UNUSED,
485 	      const void *where ATTRIBUTE_UNUSED,
486 	      file_ptr nbytes ATTRIBUTE_UNUSED)
487 {
488   return -1;
489 }
490 
491 static int
492 opncls_bclose (struct bfd *abfd)
493 {
494   struct opncls *vec = (struct opncls *) abfd->iostream;
495   /* Since the VEC's memory is bound to the bfd deleting the bfd will
496      free it.  */
497   int status = 0;
498   if (vec->close != NULL)
499     status = (vec->close) (abfd, vec->stream);
500   abfd->iostream = NULL;
501   return status;
502 }
503 
504 static int
505 opncls_bflush (struct bfd *abfd ATTRIBUTE_UNUSED)
506 {
507   return 0;
508 }
509 
510 static int
511 opncls_bstat (struct bfd *abfd, struct stat *sb)
512 {
513   struct opncls *vec = (struct opncls *) abfd->iostream;
514 
515   memset (sb, 0, sizeof (*sb));
516   if (vec->stat == NULL)
517     return 0;
518 
519   return (vec->stat) (abfd, vec->stream, sb);
520 }
521 
522 static void *
523 opncls_bmmap (struct bfd *abfd ATTRIBUTE_UNUSED,
524 	      void *addr ATTRIBUTE_UNUSED,
525 	      bfd_size_type len ATTRIBUTE_UNUSED,
526 	      int prot ATTRIBUTE_UNUSED,
527 	      int flags ATTRIBUTE_UNUSED,
528 	      file_ptr offset ATTRIBUTE_UNUSED,
529               void **map_addr ATTRIBUTE_UNUSED,
530               bfd_size_type *map_len ATTRIBUTE_UNUSED)
531 {
532   return (void *) -1;
533 }
534 
535 static const struct bfd_iovec opncls_iovec = {
536   &opncls_bread, &opncls_bwrite, &opncls_btell, &opncls_bseek,
537   &opncls_bclose, &opncls_bflush, &opncls_bstat, &opncls_bmmap
538 };
539 
540 bfd *
541 bfd_openr_iovec (const char *filename, const char *target,
542 		 void *(*open_p) (struct bfd *, void *),
543 		 void *open_closure,
544 		 file_ptr (*pread_p) (struct bfd *, void *, void *,
545 				      file_ptr, file_ptr),
546 		 int (*close_p) (struct bfd *, void *),
547 		 int (*stat_p) (struct bfd *, void *, struct stat *))
548 {
549   bfd *nbfd;
550   const bfd_target *target_vec;
551   struct opncls *vec;
552   void *stream;
553 
554   nbfd = _bfd_new_bfd ();
555   if (nbfd == NULL)
556     return NULL;
557 
558   target_vec = bfd_find_target (target, nbfd);
559   if (target_vec == NULL)
560     {
561       _bfd_delete_bfd (nbfd);
562       return NULL;
563     }
564 
565   nbfd->filename = filename;
566   nbfd->direction = read_direction;
567 
568   /* `open_p (...)' would get expanded by an the open(2) syscall macro.  */
569   stream = (*open_p) (nbfd, open_closure);
570   if (stream == NULL)
571     {
572       _bfd_delete_bfd (nbfd);
573       return NULL;
574     }
575 
576   vec = (struct opncls *) bfd_zalloc (nbfd, sizeof (struct opncls));
577   vec->stream = stream;
578   vec->pread = pread_p;
579   vec->close = close_p;
580   vec->stat = stat_p;
581 
582   nbfd->iovec = &opncls_iovec;
583   nbfd->iostream = vec;
584 
585   return nbfd;
586 }
587 
588 /* bfd_openw -- open for writing.
589    Returns a pointer to a freshly-allocated BFD on success, or NULL.
590 
591    See comment by bfd_fdopenr before you try to modify this function.  */
592 
593 /*
594 FUNCTION
595 	bfd_openw
596 
597 SYNOPSIS
598 	bfd *bfd_openw (const char *filename, const char *target);
599 
600 DESCRIPTION
601 	Create a BFD, associated with file @var{filename}, using the
602 	file format @var{target}, and return a pointer to it.
603 
604 	Possible errors are <<bfd_error_system_call>>, <<bfd_error_no_memory>>,
605 	<<bfd_error_invalid_target>>.
606 */
607 
608 bfd *
609 bfd_openw (const char *filename, const char *target)
610 {
611   bfd *nbfd;
612   const bfd_target *target_vec;
613 
614   /* nbfd has to point to head of malloc'ed block so that bfd_close may
615      reclaim it correctly.  */
616   nbfd = _bfd_new_bfd ();
617   if (nbfd == NULL)
618     return NULL;
619 
620   target_vec = bfd_find_target (target, nbfd);
621   if (target_vec == NULL)
622     {
623       _bfd_delete_bfd (nbfd);
624       return NULL;
625     }
626 
627   nbfd->filename = filename;
628   nbfd->direction = write_direction;
629 
630   if (bfd_open_file (nbfd) == NULL)
631     {
632       /* File not writeable, etc.  */
633       bfd_set_error (bfd_error_system_call);
634       _bfd_delete_bfd (nbfd);
635       return NULL;
636   }
637 
638   return nbfd;
639 }
640 
641 static inline void
642 _maybe_make_executable (bfd * abfd)
643 {
644   /* If the file was open for writing and is now executable,
645      make it so.  */
646   if (abfd->direction == write_direction
647       && (abfd->flags & (EXEC_P | DYNAMIC)) != 0)
648     {
649       struct stat buf;
650 
651       if (stat (abfd->filename, &buf) == 0
652 	  /* Do not attempt to change non-regular files.  This is
653 	     here especially for configure scripts and kernel builds
654 	     which run tests with "ld [...] -o /dev/null".  */
655 	  && S_ISREG(buf.st_mode))
656 	{
657 	  unsigned int mask = umask (0);
658 
659 	  umask (mask);
660 	  chmod (abfd->filename,
661 		 (0777
662 		  & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
663 	}
664     }
665 }
666 
667 /*
668 
669 FUNCTION
670 	bfd_close
671 
672 SYNOPSIS
673 	bfd_boolean bfd_close (bfd *abfd);
674 
675 DESCRIPTION
676 
677 	Close a BFD. If the BFD was open for writing, then pending
678 	operations are completed and the file written out and closed.
679 	If the created file is executable, then <<chmod>> is called
680 	to mark it as such.
681 
682 	All memory attached to the BFD is released.
683 
684 	The file descriptor associated with the BFD is closed (even
685 	if it was passed in to BFD by <<bfd_fdopenr>>).
686 
687 RETURNS
688 	<<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
689 */
690 
691 
692 bfd_boolean
693 bfd_close (bfd *abfd)
694 {
695   bfd_boolean ret;
696   bfd *nbfd;
697   bfd *next;
698 
699   if (bfd_write_p (abfd))
700     {
701       if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
702 	return FALSE;
703     }
704 
705   /* Close nested archives (if this bfd is a thin archive).  */
706   for (nbfd = abfd->nested_archives; nbfd; nbfd = next)
707     {
708       next = nbfd->archive_next;
709       bfd_close (nbfd);
710     }
711 
712   if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
713     return FALSE;
714 
715   ret = abfd->iovec->bclose (abfd);
716 
717   if (ret)
718     _maybe_make_executable (abfd);
719 
720   _bfd_delete_bfd (abfd);
721 
722   return ret;
723 }
724 
725 /*
726 FUNCTION
727 	bfd_close_all_done
728 
729 SYNOPSIS
730 	bfd_boolean bfd_close_all_done (bfd *);
731 
732 DESCRIPTION
733 	Close a BFD.  Differs from <<bfd_close>> since it does not
734 	complete any pending operations.  This routine would be used
735 	if the application had just used BFD for swapping and didn't
736 	want to use any of the writing code.
737 
738 	If the created file is executable, then <<chmod>> is called
739 	to mark it as such.
740 
741 	All memory attached to the BFD is released.
742 
743 RETURNS
744 	<<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
745 */
746 
747 bfd_boolean
748 bfd_close_all_done (bfd *abfd)
749 {
750   bfd_boolean ret;
751 
752   ret = bfd_cache_close (abfd);
753 
754   if (ret)
755     _maybe_make_executable (abfd);
756 
757   _bfd_delete_bfd (abfd);
758 
759   return ret;
760 }
761 
762 /*
763 FUNCTION
764 	bfd_create
765 
766 SYNOPSIS
767 	bfd *bfd_create (const char *filename, bfd *templ);
768 
769 DESCRIPTION
770 	Create a new BFD in the manner of <<bfd_openw>>, but without
771 	opening a file. The new BFD takes the target from the target
772 	used by @var{templ}. The format is always set to <<bfd_object>>.
773 */
774 
775 bfd *
776 bfd_create (const char *filename, bfd *templ)
777 {
778   bfd *nbfd;
779 
780   nbfd = _bfd_new_bfd ();
781   if (nbfd == NULL)
782     return NULL;
783   nbfd->filename = filename;
784   if (templ)
785     nbfd->xvec = templ->xvec;
786   nbfd->direction = no_direction;
787   bfd_set_format (nbfd, bfd_object);
788 
789   return nbfd;
790 }
791 
792 /*
793 FUNCTION
794 	bfd_make_writable
795 
796 SYNOPSIS
797 	bfd_boolean bfd_make_writable (bfd *abfd);
798 
799 DESCRIPTION
800 	Takes a BFD as created by <<bfd_create>> and converts it
801 	into one like as returned by <<bfd_openw>>.  It does this
802 	by converting the BFD to BFD_IN_MEMORY.  It's assumed that
803 	you will call <<bfd_make_readable>> on this bfd later.
804 
805 RETURNS
806 	<<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
807 */
808 
809 bfd_boolean
810 bfd_make_writable (bfd *abfd)
811 {
812   struct bfd_in_memory *bim;
813 
814   if (abfd->direction != no_direction)
815     {
816       bfd_set_error (bfd_error_invalid_operation);
817       return FALSE;
818     }
819 
820   bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory));
821   if (bim == NULL)
822     return FALSE;	/* bfd_error already set.  */
823   abfd->iostream = bim;
824   /* bfd_bwrite will grow these as needed.  */
825   bim->size = 0;
826   bim->buffer = 0;
827 
828   abfd->flags |= BFD_IN_MEMORY;
829   abfd->iovec = &_bfd_memory_iovec;
830   abfd->origin = 0;
831   abfd->direction = write_direction;
832   abfd->where = 0;
833 
834   return TRUE;
835 }
836 
837 /*
838 FUNCTION
839 	bfd_make_readable
840 
841 SYNOPSIS
842 	bfd_boolean bfd_make_readable (bfd *abfd);
843 
844 DESCRIPTION
845 	Takes a BFD as created by <<bfd_create>> and
846 	<<bfd_make_writable>> and converts it into one like as
847 	returned by <<bfd_openr>>.  It does this by writing the
848 	contents out to the memory buffer, then reversing the
849 	direction.
850 
851 RETURNS
852 	<<TRUE>> is returned if all is ok, otherwise <<FALSE>>.  */
853 
854 bfd_boolean
855 bfd_make_readable (bfd *abfd)
856 {
857   if (abfd->direction != write_direction || !(abfd->flags & BFD_IN_MEMORY))
858     {
859       bfd_set_error (bfd_error_invalid_operation);
860       return FALSE;
861     }
862 
863   if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
864     return FALSE;
865 
866   if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
867     return FALSE;
868 
869   abfd->arch_info = &bfd_default_arch_struct;
870 
871   abfd->where = 0;
872   abfd->format = bfd_unknown;
873   abfd->my_archive = NULL;
874   abfd->origin = 0;
875   abfd->opened_once = FALSE;
876   abfd->output_has_begun = FALSE;
877   abfd->section_count = 0;
878   abfd->usrdata = NULL;
879   abfd->cacheable = FALSE;
880   abfd->flags |= BFD_IN_MEMORY;
881   abfd->mtime_set = FALSE;
882 
883   abfd->target_defaulted = TRUE;
884   abfd->direction = read_direction;
885   abfd->sections = 0;
886   abfd->symcount = 0;
887   abfd->outsymbols = 0;
888   abfd->tdata.any = 0;
889 
890   bfd_section_list_clear (abfd);
891   bfd_check_format (abfd, bfd_object);
892 
893   return TRUE;
894 }
895 
896 /*
897 FUNCTION
898 	bfd_alloc
899 
900 SYNOPSIS
901 	void *bfd_alloc (bfd *abfd, bfd_size_type wanted);
902 
903 DESCRIPTION
904 	Allocate a block of @var{wanted} bytes of memory attached to
905 	<<abfd>> and return a pointer to it.
906 */
907 
908 void *
909 bfd_alloc (bfd *abfd, bfd_size_type size)
910 {
911   void *ret;
912 
913   if (size != (unsigned long) size)
914     {
915       bfd_set_error (bfd_error_no_memory);
916       return NULL;
917     }
918 
919   ret = objalloc_alloc ((struct objalloc *) abfd->memory, (unsigned long) size);
920   if (ret == NULL)
921     bfd_set_error (bfd_error_no_memory);
922   return ret;
923 }
924 
925 /*
926 INTERNAL_FUNCTION
927 	bfd_alloc2
928 
929 SYNOPSIS
930 	void *bfd_alloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size);
931 
932 DESCRIPTION
933 	Allocate a block of @var{nmemb} elements of @var{size} bytes each
934 	of memory attached to <<abfd>> and return a pointer to it.
935 */
936 
937 void *
938 bfd_alloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size)
939 {
940   void *ret;
941 
942   if ((nmemb | size) >= HALF_BFD_SIZE_TYPE
943       && size != 0
944       && nmemb > ~(bfd_size_type) 0 / size)
945     {
946       bfd_set_error (bfd_error_no_memory);
947       return NULL;
948     }
949 
950   size *= nmemb;
951 
952   if (size != (unsigned long) size)
953     {
954       bfd_set_error (bfd_error_no_memory);
955       return NULL;
956     }
957 
958   ret = objalloc_alloc ((struct objalloc *) abfd->memory, (unsigned long) size);
959   if (ret == NULL)
960     bfd_set_error (bfd_error_no_memory);
961   return ret;
962 }
963 
964 /*
965 FUNCTION
966 	bfd_zalloc
967 
968 SYNOPSIS
969 	void *bfd_zalloc (bfd *abfd, bfd_size_type wanted);
970 
971 DESCRIPTION
972 	Allocate a block of @var{wanted} bytes of zeroed memory
973 	attached to <<abfd>> and return a pointer to it.
974 */
975 
976 void *
977 bfd_zalloc (bfd *abfd, bfd_size_type size)
978 {
979   void *res;
980 
981   res = bfd_alloc (abfd, size);
982   if (res)
983     memset (res, 0, (size_t) size);
984   return res;
985 }
986 
987 /*
988 INTERNAL_FUNCTION
989 	bfd_zalloc2
990 
991 SYNOPSIS
992 	void *bfd_zalloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size);
993 
994 DESCRIPTION
995 	Allocate a block of @var{nmemb} elements of @var{size} bytes each
996 	of zeroed memory attached to <<abfd>> and return a pointer to it.
997 */
998 
999 void *
1000 bfd_zalloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size)
1001 {
1002   void *res;
1003 
1004   if ((nmemb | size) >= HALF_BFD_SIZE_TYPE
1005       && size != 0
1006       && nmemb > ~(bfd_size_type) 0 / size)
1007     {
1008       bfd_set_error (bfd_error_no_memory);
1009       return NULL;
1010     }
1011 
1012   size *= nmemb;
1013 
1014   res = bfd_alloc (abfd, size);
1015   if (res)
1016     memset (res, 0, (size_t) size);
1017   return res;
1018 }
1019 
1020 /* Free a block allocated for a BFD.
1021    Note:  Also frees all more recently allocated blocks!  */
1022 
1023 void
1024 bfd_release (bfd *abfd, void *block)
1025 {
1026   objalloc_free_block ((struct objalloc *) abfd->memory, block);
1027 }
1028 
1029 
1030 /*
1031    GNU Extension: separate debug-info files
1032 
1033    The idea here is that a special section called .gnu_debuglink might be
1034    embedded in a binary file, which indicates that some *other* file
1035    contains the real debugging information. This special section contains a
1036    filename and CRC32 checksum, which we read and resolve to another file,
1037    if it exists.
1038 
1039    This facilitates "optional" provision of debugging information, without
1040    having to provide two complete copies of every binary object (with and
1041    without debug symbols).
1042 */
1043 
1044 #define GNU_DEBUGLINK	".gnu_debuglink"
1045 /*
1046 FUNCTION
1047 	bfd_calc_gnu_debuglink_crc32
1048 
1049 SYNOPSIS
1050 	unsigned long bfd_calc_gnu_debuglink_crc32
1051 	  (unsigned long crc, const unsigned char *buf, bfd_size_type len);
1052 
1053 DESCRIPTION
1054 	Computes a CRC value as used in the .gnu_debuglink section.
1055 	Advances the previously computed @var{crc} value by computing
1056 	and adding in the crc32 for @var{len} bytes of @var{buf}.
1057 
1058 RETURNS
1059 	Return the updated CRC32 value.
1060 */
1061 
1062 unsigned long
1063 bfd_calc_gnu_debuglink_crc32 (unsigned long crc,
1064 			      const unsigned char *buf,
1065 			      bfd_size_type len)
1066 {
1067   static const unsigned long crc32_table[256] =
1068     {
1069       0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
1070       0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
1071       0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
1072       0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
1073       0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
1074       0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
1075       0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
1076       0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
1077       0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
1078       0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
1079       0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
1080       0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
1081       0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
1082       0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
1083       0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
1084       0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
1085       0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
1086       0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
1087       0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
1088       0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
1089       0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
1090       0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
1091       0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
1092       0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
1093       0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
1094       0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
1095       0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
1096       0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
1097       0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
1098       0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
1099       0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
1100       0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
1101       0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
1102       0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
1103       0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
1104       0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
1105       0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
1106       0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
1107       0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
1108       0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
1109       0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
1110       0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
1111       0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
1112       0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
1113       0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
1114       0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
1115       0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
1116       0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
1117       0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
1118       0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
1119       0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
1120       0x2d02ef8d
1121     };
1122   const unsigned char *end;
1123 
1124   crc = ~crc & 0xffffffff;
1125   for (end = buf + len; buf < end; ++ buf)
1126     crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
1127   return ~crc & 0xffffffff;;
1128 }
1129 
1130 
1131 /*
1132 INTERNAL_FUNCTION
1133 	get_debug_link_info
1134 
1135 SYNOPSIS
1136 	char *get_debug_link_info (bfd *abfd, unsigned long *crc32_out);
1137 
1138 DESCRIPTION
1139 	fetch the filename and CRC32 value for any separate debuginfo
1140 	associated with @var{abfd}. Return NULL if no such info found,
1141 	otherwise return filename and update @var{crc32_out}.
1142 */
1143 
1144 static char *
1145 get_debug_link_info (bfd *abfd, unsigned long *crc32_out)
1146 {
1147   asection *sect;
1148   unsigned long crc32;
1149   bfd_byte *contents;
1150   int crc_offset;
1151   char *name;
1152 
1153   BFD_ASSERT (abfd);
1154   BFD_ASSERT (crc32_out);
1155 
1156   sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
1157 
1158   if (sect == NULL)
1159     return NULL;
1160 
1161   if (!bfd_malloc_and_get_section (abfd, sect, &contents))
1162     {
1163       if (contents != NULL)
1164 	free (contents);
1165       return NULL;
1166     }
1167 
1168   /* Crc value is stored after the filename, aligned up to 4 bytes.  */
1169   name = (char *) contents;
1170   crc_offset = strlen (name) + 1;
1171   crc_offset = (crc_offset + 3) & ~3;
1172 
1173   crc32 = bfd_get_32 (abfd, contents + crc_offset);
1174 
1175   *crc32_out = crc32;
1176   return name;
1177 }
1178 
1179 /*
1180 INTERNAL_FUNCTION
1181 	separate_debug_file_exists
1182 
1183 SYNOPSIS
1184 	bfd_boolean separate_debug_file_exists
1185 	  (char *name, unsigned long crc32);
1186 
1187 DESCRIPTION
1188 	Checks to see if @var{name} is a file and if its contents
1189 	match @var{crc32}.
1190 */
1191 
1192 static bfd_boolean
1193 separate_debug_file_exists (const char *name, const unsigned long crc)
1194 {
1195   static unsigned char buffer [8 * 1024];
1196   unsigned long file_crc = 0;
1197   FILE *f;
1198   bfd_size_type count;
1199 
1200   BFD_ASSERT (name);
1201 
1202   f = real_fopen (name, FOPEN_RB);
1203   if (f == NULL)
1204     return FALSE;
1205 
1206   while ((count = fread (buffer, 1, sizeof (buffer), f)) > 0)
1207     file_crc = bfd_calc_gnu_debuglink_crc32 (file_crc, buffer, count);
1208 
1209   fclose (f);
1210 
1211   return crc == file_crc;
1212 }
1213 
1214 
1215 /*
1216 INTERNAL_FUNCTION
1217 	find_separate_debug_file
1218 
1219 SYNOPSIS
1220 	char *find_separate_debug_file (bfd *abfd);
1221 
1222 DESCRIPTION
1223 	Searches @var{abfd} for a reference to separate debugging
1224 	information, scans various locations in the filesystem, including
1225 	the file tree rooted at @var{debug_file_directory}, and returns a
1226 	filename of such debugging information if the file is found and has
1227 	matching CRC32.  Returns NULL if no reference to debugging file
1228 	exists, or file cannot be found.
1229 */
1230 
1231 static char *
1232 find_separate_debug_file (bfd *abfd, const char *debug_file_directory)
1233 {
1234   char *base;
1235   char *dir;
1236   char *debugfile;
1237   char *canon_dir;
1238   unsigned long crc32;
1239   size_t dirlen;
1240   size_t canon_dirlen;
1241 
1242   BFD_ASSERT (abfd);
1243   if (debug_file_directory == NULL)
1244     debug_file_directory = ".";
1245 
1246   /* BFD may have been opened from a stream.  */
1247   if (abfd->filename == NULL)
1248     {
1249       bfd_set_error (bfd_error_invalid_operation);
1250       return NULL;
1251     }
1252 
1253   base = get_debug_link_info (abfd, & crc32);
1254   if (base == NULL)
1255     return NULL;
1256 
1257   if (base[0] == '\0')
1258     {
1259       free (base);
1260       bfd_set_error (bfd_error_no_debug_section);
1261       return NULL;
1262     }
1263 
1264   for (dirlen = strlen (abfd->filename); dirlen > 0; dirlen--)
1265     if (IS_DIR_SEPARATOR (abfd->filename[dirlen - 1]))
1266       break;
1267 
1268   dir = (char *) bfd_malloc (dirlen + 1);
1269   if (dir == NULL)
1270     {
1271       free (base);
1272       return NULL;
1273     }
1274   memcpy (dir, abfd->filename, dirlen);
1275   dir[dirlen] = '\0';
1276 
1277   /* Compute the canonical name of the bfd object with all symbolic links
1278      resolved, for use in the global debugfile directory.  */
1279   canon_dir = lrealpath (abfd->filename);
1280   for (canon_dirlen = strlen (canon_dir); canon_dirlen > 0; canon_dirlen--)
1281     if (IS_DIR_SEPARATOR (canon_dir[canon_dirlen - 1]))
1282       break;
1283   canon_dir[canon_dirlen] = '\0';
1284 
1285   debugfile = (char *)
1286       bfd_malloc (strlen (debug_file_directory) + 1
1287                   + (canon_dirlen > dirlen ? canon_dirlen : dirlen)
1288                   + strlen (".debug/")
1289                   + strlen (base)
1290                   + 1);
1291   if (debugfile == NULL)
1292     {
1293       free (base);
1294       free (dir);
1295       free (canon_dir);
1296       return NULL;
1297     }
1298 
1299   /* First try in the same directory as the original file:  */
1300   strcpy (debugfile, dir);
1301   strcat (debugfile, base);
1302 
1303   if (separate_debug_file_exists (debugfile, crc32))
1304     {
1305       free (base);
1306       free (dir);
1307       free (canon_dir);
1308       return debugfile;
1309     }
1310 
1311   /* Then try in a subdirectory called .debug.  */
1312   strcpy (debugfile, dir);
1313   strcat (debugfile, ".debug/");
1314   strcat (debugfile, base);
1315 
1316   if (separate_debug_file_exists (debugfile, crc32))
1317     {
1318       free (base);
1319       free (dir);
1320       free (canon_dir);
1321       return debugfile;
1322     }
1323 
1324   /* Then try in the global debugfile directory.  */
1325   strcpy (debugfile, debug_file_directory);
1326   dirlen = strlen (debug_file_directory) - 1;
1327   if (dirlen > 0
1328       && debug_file_directory[dirlen] != '/'
1329       && canon_dir[0] != '/')
1330     strcat (debugfile, "/");
1331   strcat (debugfile, canon_dir);
1332   strcat (debugfile, base);
1333 
1334   if (separate_debug_file_exists (debugfile, crc32))
1335     {
1336       free (base);
1337       free (dir);
1338       free (canon_dir);
1339       return debugfile;
1340     }
1341 
1342   free (debugfile);
1343   free (base);
1344   free (dir);
1345   free (canon_dir);
1346   return NULL;
1347 }
1348 
1349 
1350 /*
1351 FUNCTION
1352 	bfd_follow_gnu_debuglink
1353 
1354 SYNOPSIS
1355 	char *bfd_follow_gnu_debuglink (bfd *abfd, const char *dir);
1356 
1357 DESCRIPTION
1358 
1359 	Takes a BFD and searches it for a .gnu_debuglink section.  If this
1360 	section is found, it examines the section for the name and checksum
1361 	of a '.debug' file containing auxiliary debugging information.  It
1362 	then searches the filesystem for this .debug file in some standard
1363 	locations, including the directory tree rooted at @var{dir}, and if
1364 	found returns the full filename.
1365 
1366 	If @var{dir} is NULL, it will search a default path configured into
1367 	libbfd at build time.  [XXX this feature is not currently
1368 	implemented].
1369 
1370 RETURNS
1371 	<<NULL>> on any errors or failure to locate the .debug file,
1372 	otherwise a pointer to a heap-allocated string containing the
1373 	filename.  The caller is responsible for freeing this string.
1374 */
1375 
1376 char *
1377 bfd_follow_gnu_debuglink (bfd *abfd, const char *dir)
1378 {
1379   return find_separate_debug_file (abfd, dir);
1380 }
1381 
1382 /*
1383 FUNCTION
1384 	bfd_create_gnu_debuglink_section
1385 
1386 SYNOPSIS
1387 	struct bfd_section *bfd_create_gnu_debuglink_section
1388 	  (bfd *abfd, const char *filename);
1389 
1390 DESCRIPTION
1391 
1392 	Takes a @var{BFD} and adds a .gnu_debuglink section to it.  The section is sized
1393 	to be big enough to contain a link to the specified @var{filename}.
1394 
1395 RETURNS
1396 	A pointer to the new section is returned if all is ok.  Otherwise <<NULL>> is
1397 	returned and bfd_error is set.
1398 */
1399 
1400 asection *
1401 bfd_create_gnu_debuglink_section (bfd *abfd, const char *filename)
1402 {
1403   asection *sect;
1404   bfd_size_type debuglink_size;
1405   flagword flags;
1406 
1407   if (abfd == NULL || filename == NULL)
1408     {
1409       bfd_set_error (bfd_error_invalid_operation);
1410       return NULL;
1411     }
1412 
1413   /* Strip off any path components in filename.  */
1414   filename = lbasename (filename);
1415 
1416   sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
1417   if (sect)
1418     {
1419       /* Section already exists.  */
1420       bfd_set_error (bfd_error_invalid_operation);
1421       return NULL;
1422     }
1423 
1424   flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
1425   sect = bfd_make_section_with_flags (abfd, GNU_DEBUGLINK, flags);
1426   if (sect == NULL)
1427     return NULL;
1428 
1429   debuglink_size = strlen (filename) + 1;
1430   debuglink_size += 3;
1431   debuglink_size &= ~3;
1432   debuglink_size += 4;
1433 
1434   if (! bfd_set_section_size (abfd, sect, debuglink_size))
1435     /* XXX Should we delete the section from the bfd ?  */
1436     return NULL;
1437 
1438   return sect;
1439 }
1440 
1441 
1442 /*
1443 FUNCTION
1444 	bfd_fill_in_gnu_debuglink_section
1445 
1446 SYNOPSIS
1447 	bfd_boolean bfd_fill_in_gnu_debuglink_section
1448 	  (bfd *abfd, struct bfd_section *sect, const char *filename);
1449 
1450 DESCRIPTION
1451 
1452 	Takes a @var{BFD} and containing a .gnu_debuglink section @var{SECT}
1453 	and fills in the contents of the section to contain a link to the
1454 	specified @var{filename}.  The filename should be relative to the
1455 	current directory.
1456 
1457 RETURNS
1458 	<<TRUE>> is returned if all is ok.  Otherwise <<FALSE>> is returned
1459 	and bfd_error is set.
1460 */
1461 
1462 bfd_boolean
1463 bfd_fill_in_gnu_debuglink_section (bfd *abfd,
1464 				   struct bfd_section *sect,
1465 				   const char *filename)
1466 {
1467   bfd_size_type debuglink_size;
1468   unsigned long crc32;
1469   char * contents;
1470   bfd_size_type crc_offset;
1471   FILE * handle;
1472   static unsigned char buffer[8 * 1024];
1473   size_t count;
1474   size_t filelen;
1475 
1476   if (abfd == NULL || sect == NULL || filename == NULL)
1477     {
1478       bfd_set_error (bfd_error_invalid_operation);
1479       return FALSE;
1480     }
1481 
1482   /* Make sure that we can read the file.
1483      XXX - Should we attempt to locate the debug info file using the same
1484      algorithm as gdb ?  At the moment, since we are creating the
1485      .gnu_debuglink section, we insist upon the user providing us with a
1486      correct-for-section-creation-time path, but this need not conform to
1487      the gdb location algorithm.  */
1488   handle = real_fopen (filename, FOPEN_RB);
1489   if (handle == NULL)
1490     {
1491       bfd_set_error (bfd_error_system_call);
1492       return FALSE;
1493     }
1494 
1495   crc32 = 0;
1496   while ((count = fread (buffer, 1, sizeof buffer, handle)) > 0)
1497     crc32 = bfd_calc_gnu_debuglink_crc32 (crc32, buffer, count);
1498   fclose (handle);
1499 
1500   /* Strip off any path components in filename,
1501      now that we no longer need them.  */
1502   filename = lbasename (filename);
1503 
1504   filelen = strlen (filename);
1505   debuglink_size = filelen + 1;
1506   debuglink_size += 3;
1507   debuglink_size &= ~3;
1508   debuglink_size += 4;
1509 
1510   contents = (char *) bfd_malloc (debuglink_size);
1511   if (contents == NULL)
1512     {
1513       /* XXX Should we delete the section from the bfd ?  */
1514       return FALSE;
1515     }
1516 
1517   crc_offset = debuglink_size - 4;
1518   memcpy (contents, filename, filelen);
1519   memset (contents + filelen, 0, crc_offset - filelen);
1520 
1521   bfd_put_32 (abfd, crc32, contents + crc_offset);
1522 
1523   if (! bfd_set_section_contents (abfd, sect, contents, 0, debuglink_size))
1524     {
1525       /* XXX Should we delete the section from the bfd ?  */
1526       free (contents);
1527       return FALSE;
1528     }
1529 
1530   return TRUE;
1531 }
1532