Merge branch 'vendor/TCPDUMP'
[dragonfly.git] / contrib / binutils-2.21 / bfd / opncls.c
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 {
530   return (void *) -1;
531 }
532
533 static const struct bfd_iovec opncls_iovec = {
534   &opncls_bread, &opncls_bwrite, &opncls_btell, &opncls_bseek,
535   &opncls_bclose, &opncls_bflush, &opncls_bstat, &opncls_bmmap
536 };
537
538 bfd *
539 bfd_openr_iovec (const char *filename, const char *target,
540                  void *(*open_p) (struct bfd *, void *),
541                  void *open_closure,
542                  file_ptr (*pread_p) (struct bfd *, void *, void *,
543                                       file_ptr, file_ptr),
544                  int (*close_p) (struct bfd *, void *),
545                  int (*stat_p) (struct bfd *, void *, struct stat *))
546 {
547   bfd *nbfd;
548   const bfd_target *target_vec;
549   struct opncls *vec;
550   void *stream;
551
552   nbfd = _bfd_new_bfd ();
553   if (nbfd == NULL)
554     return NULL;
555
556   target_vec = bfd_find_target (target, nbfd);
557   if (target_vec == NULL)
558     {
559       _bfd_delete_bfd (nbfd);
560       return NULL;
561     }
562
563   nbfd->filename = filename;
564   nbfd->direction = read_direction;
565
566   /* `open_p (...)' would get expanded by an the open(2) syscall macro.  */
567   stream = (*open_p) (nbfd, open_closure);
568   if (stream == NULL)
569     {
570       _bfd_delete_bfd (nbfd);
571       return NULL;
572     }
573
574   vec = (struct opncls *) bfd_zalloc (nbfd, sizeof (struct opncls));
575   vec->stream = stream;
576   vec->pread = pread_p;
577   vec->close = close_p;
578   vec->stat = stat_p;
579
580   nbfd->iovec = &opncls_iovec;
581   nbfd->iostream = vec;
582
583   return nbfd;
584 }
585 \f
586 /* bfd_openw -- open for writing.
587    Returns a pointer to a freshly-allocated BFD on success, or NULL.
588
589    See comment by bfd_fdopenr before you try to modify this function.  */
590
591 /*
592 FUNCTION
593         bfd_openw
594
595 SYNOPSIS
596         bfd *bfd_openw (const char *filename, const char *target);
597
598 DESCRIPTION
599         Create a BFD, associated with file @var{filename}, using the
600         file format @var{target}, and return a pointer to it.
601
602         Possible errors are <<bfd_error_system_call>>, <<bfd_error_no_memory>>,
603         <<bfd_error_invalid_target>>.
604 */
605
606 bfd *
607 bfd_openw (const char *filename, const char *target)
608 {
609   bfd *nbfd;
610   const bfd_target *target_vec;
611
612   /* nbfd has to point to head of malloc'ed block so that bfd_close may
613      reclaim it correctly.  */
614   nbfd = _bfd_new_bfd ();
615   if (nbfd == NULL)
616     return NULL;
617
618   target_vec = bfd_find_target (target, nbfd);
619   if (target_vec == NULL)
620     {
621       _bfd_delete_bfd (nbfd);
622       return NULL;
623     }
624
625   nbfd->filename = filename;
626   nbfd->direction = write_direction;
627
628   if (bfd_open_file (nbfd) == NULL)
629     {
630       /* File not writeable, etc.  */
631       bfd_set_error (bfd_error_system_call);
632       _bfd_delete_bfd (nbfd);
633       return NULL;
634   }
635
636   return nbfd;
637 }
638
639 static inline void
640 _maybe_make_executable (bfd * abfd)
641 {
642   /* If the file was open for writing and is now executable,
643      make it so.  */
644   if (abfd->direction == write_direction
645       && (abfd->flags & (EXEC_P | DYNAMIC)) != 0)
646     {
647       struct stat buf;
648
649       if (stat (abfd->filename, &buf) == 0
650           /* Do not attempt to change non-regular files.  This is
651              here especially for configure scripts and kernel builds
652              which run tests with "ld [...] -o /dev/null".  */
653           && S_ISREG(buf.st_mode))
654         {
655           unsigned int mask = umask (0);
656
657           umask (mask);
658           chmod (abfd->filename,
659                  (0777
660                   & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
661         }
662     }
663 }
664
665 /*
666
667 FUNCTION
668         bfd_close
669
670 SYNOPSIS
671         bfd_boolean bfd_close (bfd *abfd);
672
673 DESCRIPTION
674
675         Close a BFD. If the BFD was open for writing, then pending
676         operations are completed and the file written out and closed.
677         If the created file is executable, then <<chmod>> is called
678         to mark it as such.
679
680         All memory attached to the BFD is released.
681
682         The file descriptor associated with the BFD is closed (even
683         if it was passed in to BFD by <<bfd_fdopenr>>).
684
685 RETURNS
686         <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
687 */
688
689
690 bfd_boolean
691 bfd_close (bfd *abfd)
692 {
693   bfd_boolean ret;
694   bfd *nbfd;
695   bfd *next;
696
697   if (bfd_write_p (abfd))
698     {
699       if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
700         return FALSE;
701     }
702
703   /* Close nested archives (if this bfd is a thin archive).  */
704   for (nbfd = abfd->nested_archives; nbfd; nbfd = next)
705     {
706       next = nbfd->archive_next;
707       bfd_close (nbfd);
708     }
709
710   if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
711     return FALSE;
712
713   ret = abfd->iovec->bclose (abfd);
714
715   if (ret)
716     _maybe_make_executable (abfd);
717
718   _bfd_delete_bfd (abfd);
719
720   return ret;
721 }
722
723 /*
724 FUNCTION
725         bfd_close_all_done
726
727 SYNOPSIS
728         bfd_boolean bfd_close_all_done (bfd *);
729
730 DESCRIPTION
731         Close a BFD.  Differs from <<bfd_close>> since it does not
732         complete any pending operations.  This routine would be used
733         if the application had just used BFD for swapping and didn't
734         want to use any of the writing code.
735
736         If the created file is executable, then <<chmod>> is called
737         to mark it as such.
738
739         All memory attached to the BFD is released.
740
741 RETURNS
742         <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
743 */
744
745 bfd_boolean
746 bfd_close_all_done (bfd *abfd)
747 {
748   bfd_boolean ret;
749
750   ret = bfd_cache_close (abfd);
751
752   if (ret)
753     _maybe_make_executable (abfd);
754
755   _bfd_delete_bfd (abfd);
756
757   return ret;
758 }
759
760 /*
761 FUNCTION
762         bfd_create
763
764 SYNOPSIS
765         bfd *bfd_create (const char *filename, bfd *templ);
766
767 DESCRIPTION
768         Create a new BFD in the manner of <<bfd_openw>>, but without
769         opening a file. The new BFD takes the target from the target
770         used by @var{templ}. The format is always set to <<bfd_object>>.
771 */
772
773 bfd *
774 bfd_create (const char *filename, bfd *templ)
775 {
776   bfd *nbfd;
777
778   nbfd = _bfd_new_bfd ();
779   if (nbfd == NULL)
780     return NULL;
781   nbfd->filename = filename;
782   if (templ)
783     nbfd->xvec = templ->xvec;
784   nbfd->direction = no_direction;
785   bfd_set_format (nbfd, bfd_object);
786
787   return nbfd;
788 }
789
790 /*
791 FUNCTION
792         bfd_make_writable
793
794 SYNOPSIS
795         bfd_boolean bfd_make_writable (bfd *abfd);
796
797 DESCRIPTION
798         Takes a BFD as created by <<bfd_create>> and converts it
799         into one like as returned by <<bfd_openw>>.  It does this
800         by converting the BFD to BFD_IN_MEMORY.  It's assumed that
801         you will call <<bfd_make_readable>> on this bfd later.
802
803 RETURNS
804         <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
805 */
806
807 bfd_boolean
808 bfd_make_writable (bfd *abfd)
809 {
810   struct bfd_in_memory *bim;
811
812   if (abfd->direction != no_direction)
813     {
814       bfd_set_error (bfd_error_invalid_operation);
815       return FALSE;
816     }
817
818   bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory));
819   if (bim == NULL)
820     return FALSE;       /* bfd_error already set.  */
821   abfd->iostream = bim;
822   /* bfd_bwrite will grow these as needed.  */
823   bim->size = 0;
824   bim->buffer = 0;
825
826   abfd->flags |= BFD_IN_MEMORY;
827   abfd->iovec = &_bfd_memory_iovec;
828   abfd->origin = 0;
829   abfd->direction = write_direction;
830   abfd->where = 0;
831
832   return TRUE;
833 }
834
835 /*
836 FUNCTION
837         bfd_make_readable
838
839 SYNOPSIS
840         bfd_boolean bfd_make_readable (bfd *abfd);
841
842 DESCRIPTION
843         Takes a BFD as created by <<bfd_create>> and
844         <<bfd_make_writable>> and converts it into one like as
845         returned by <<bfd_openr>>.  It does this by writing the
846         contents out to the memory buffer, then reversing the
847         direction.
848
849 RETURNS
850         <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.  */
851
852 bfd_boolean
853 bfd_make_readable (bfd *abfd)
854 {
855   if (abfd->direction != write_direction || !(abfd->flags & BFD_IN_MEMORY))
856     {
857       bfd_set_error (bfd_error_invalid_operation);
858       return FALSE;
859     }
860
861   if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
862     return FALSE;
863
864   if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
865     return FALSE;
866
867   abfd->arch_info = &bfd_default_arch_struct;
868
869   abfd->where = 0;
870   abfd->format = bfd_unknown;
871   abfd->my_archive = NULL;
872   abfd->origin = 0;
873   abfd->opened_once = FALSE;
874   abfd->output_has_begun = FALSE;
875   abfd->section_count = 0;
876   abfd->usrdata = NULL;
877   abfd->cacheable = FALSE;
878   abfd->flags |= BFD_IN_MEMORY;
879   abfd->mtime_set = FALSE;
880
881   abfd->target_defaulted = TRUE;
882   abfd->direction = read_direction;
883   abfd->sections = 0;
884   abfd->symcount = 0;
885   abfd->outsymbols = 0;
886   abfd->tdata.any = 0;
887
888   bfd_section_list_clear (abfd);
889   bfd_check_format (abfd, bfd_object);
890
891   return TRUE;
892 }
893
894 /*
895 FUNCTION
896         bfd_alloc
897
898 SYNOPSIS
899         void *bfd_alloc (bfd *abfd, bfd_size_type wanted);
900
901 DESCRIPTION
902         Allocate a block of @var{wanted} bytes of memory attached to
903         <<abfd>> and return a pointer to it.
904 */
905
906 void *
907 bfd_alloc (bfd *abfd, bfd_size_type size)
908 {
909   void *ret;
910
911   if (size != (unsigned long) size)
912     {
913       bfd_set_error (bfd_error_no_memory);
914       return NULL;
915     }
916
917   ret = objalloc_alloc ((struct objalloc *) abfd->memory, (unsigned long) size);
918   if (ret == NULL)
919     bfd_set_error (bfd_error_no_memory);
920   return ret;
921 }
922
923 /*
924 INTERNAL_FUNCTION
925         bfd_alloc2
926
927 SYNOPSIS
928         void *bfd_alloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size);
929
930 DESCRIPTION
931         Allocate a block of @var{nmemb} elements of @var{size} bytes each
932         of memory attached to <<abfd>> and return a pointer to it.
933 */
934
935 void *
936 bfd_alloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size)
937 {
938   void *ret;
939
940   if ((nmemb | size) >= HALF_BFD_SIZE_TYPE
941       && size != 0
942       && nmemb > ~(bfd_size_type) 0 / size)
943     {
944       bfd_set_error (bfd_error_no_memory);
945       return NULL;
946     }
947
948   size *= nmemb;
949
950   if (size != (unsigned long) size)
951     {
952       bfd_set_error (bfd_error_no_memory);
953       return NULL;
954     }
955
956   ret = objalloc_alloc ((struct objalloc *) abfd->memory, (unsigned long) size);
957   if (ret == NULL)
958     bfd_set_error (bfd_error_no_memory);
959   return ret;
960 }
961
962 /*
963 FUNCTION
964         bfd_zalloc
965
966 SYNOPSIS
967         void *bfd_zalloc (bfd *abfd, bfd_size_type wanted);
968
969 DESCRIPTION
970         Allocate a block of @var{wanted} bytes of zeroed memory
971         attached to <<abfd>> and return a pointer to it.
972 */
973
974 void *
975 bfd_zalloc (bfd *abfd, bfd_size_type size)
976 {
977   void *res;
978
979   res = bfd_alloc (abfd, size);
980   if (res)
981     memset (res, 0, (size_t) size);
982   return res;
983 }
984
985 /*
986 INTERNAL_FUNCTION
987         bfd_zalloc2
988
989 SYNOPSIS
990         void *bfd_zalloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size);
991
992 DESCRIPTION
993         Allocate a block of @var{nmemb} elements of @var{size} bytes each
994         of zeroed memory attached to <<abfd>> and return a pointer to it.
995 */
996
997 void *
998 bfd_zalloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size)
999 {
1000   void *res;
1001
1002   if ((nmemb | size) >= HALF_BFD_SIZE_TYPE
1003       && size != 0
1004       && nmemb > ~(bfd_size_type) 0 / size)
1005     {
1006       bfd_set_error (bfd_error_no_memory);
1007       return NULL;
1008     }
1009
1010   size *= nmemb;
1011
1012   res = bfd_alloc (abfd, size);
1013   if (res)
1014     memset (res, 0, (size_t) size);
1015   return res;
1016 }
1017
1018 /* Free a block allocated for a BFD.
1019    Note:  Also frees all more recently allocated blocks!  */
1020
1021 void
1022 bfd_release (bfd *abfd, void *block)
1023 {
1024   objalloc_free_block ((struct objalloc *) abfd->memory, block);
1025 }
1026
1027
1028 /*
1029    GNU Extension: separate debug-info files
1030
1031    The idea here is that a special section called .gnu_debuglink might be
1032    embedded in a binary file, which indicates that some *other* file
1033    contains the real debugging information. This special section contains a
1034    filename and CRC32 checksum, which we read and resolve to another file,
1035    if it exists.
1036
1037    This facilitates "optional" provision of debugging information, without
1038    having to provide two complete copies of every binary object (with and
1039    without debug symbols).
1040 */
1041
1042 #define GNU_DEBUGLINK   ".gnu_debuglink"
1043 /*
1044 FUNCTION
1045         bfd_calc_gnu_debuglink_crc32
1046
1047 SYNOPSIS
1048         unsigned long bfd_calc_gnu_debuglink_crc32
1049           (unsigned long crc, const unsigned char *buf, bfd_size_type len);
1050
1051 DESCRIPTION
1052         Computes a CRC value as used in the .gnu_debuglink section.
1053         Advances the previously computed @var{crc} value by computing
1054         and adding in the crc32 for @var{len} bytes of @var{buf}.
1055
1056 RETURNS
1057         Return the updated CRC32 value.
1058 */
1059
1060 unsigned long
1061 bfd_calc_gnu_debuglink_crc32 (unsigned long crc,
1062                               const unsigned char *buf,
1063                               bfd_size_type len)
1064 {
1065   static const unsigned long crc32_table[256] =
1066     {
1067       0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
1068       0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
1069       0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
1070       0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
1071       0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
1072       0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
1073       0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
1074       0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
1075       0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
1076       0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
1077       0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
1078       0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
1079       0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
1080       0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
1081       0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
1082       0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
1083       0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
1084       0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
1085       0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
1086       0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
1087       0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
1088       0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
1089       0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
1090       0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
1091       0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
1092       0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
1093       0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
1094       0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
1095       0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
1096       0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
1097       0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
1098       0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
1099       0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
1100       0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
1101       0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
1102       0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
1103       0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
1104       0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
1105       0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
1106       0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
1107       0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
1108       0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
1109       0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
1110       0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
1111       0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
1112       0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
1113       0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
1114       0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
1115       0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
1116       0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
1117       0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
1118       0x2d02ef8d
1119     };
1120   const unsigned char *end;
1121
1122   crc = ~crc & 0xffffffff;
1123   for (end = buf + len; buf < end; ++ buf)
1124     crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
1125   return ~crc & 0xffffffff;;
1126 }
1127
1128
1129 /*
1130 INTERNAL_FUNCTION
1131         get_debug_link_info
1132
1133 SYNOPSIS
1134         char *get_debug_link_info (bfd *abfd, unsigned long *crc32_out);
1135
1136 DESCRIPTION
1137         fetch the filename and CRC32 value for any separate debuginfo
1138         associated with @var{abfd}. Return NULL if no such info found,
1139         otherwise return filename and update @var{crc32_out}.
1140 */
1141
1142 static char *
1143 get_debug_link_info (bfd *abfd, unsigned long *crc32_out)
1144 {
1145   asection *sect;
1146   unsigned long crc32;
1147   bfd_byte *contents;
1148   int crc_offset;
1149   char *name;
1150
1151   BFD_ASSERT (abfd);
1152   BFD_ASSERT (crc32_out);
1153
1154   sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
1155
1156   if (sect == NULL)
1157     return NULL;
1158
1159   if (!bfd_malloc_and_get_section (abfd, sect, &contents))
1160     {
1161       if (contents != NULL)
1162         free (contents);
1163       return NULL;
1164     }
1165
1166   /* Crc value is stored after the filename, aligned up to 4 bytes.  */
1167   name = (char *) contents;
1168   crc_offset = strlen (name) + 1;
1169   crc_offset = (crc_offset + 3) & ~3;
1170
1171   crc32 = bfd_get_32 (abfd, contents + crc_offset);
1172
1173   *crc32_out = crc32;
1174   return name;
1175 }
1176
1177 /*
1178 INTERNAL_FUNCTION
1179         separate_debug_file_exists
1180
1181 SYNOPSIS
1182         bfd_boolean separate_debug_file_exists
1183           (char *name, unsigned long crc32);
1184
1185 DESCRIPTION
1186         Checks to see if @var{name} is a file and if its contents
1187         match @var{crc32}.
1188 */
1189
1190 static bfd_boolean
1191 separate_debug_file_exists (const char *name, const unsigned long crc)
1192 {
1193   static unsigned char buffer [8 * 1024];
1194   unsigned long file_crc = 0;
1195   FILE *f;
1196   bfd_size_type count;
1197
1198   BFD_ASSERT (name);
1199
1200   f = real_fopen (name, FOPEN_RB);
1201   if (f == NULL)
1202     return FALSE;
1203
1204   while ((count = fread (buffer, 1, sizeof (buffer), f)) > 0)
1205     file_crc = bfd_calc_gnu_debuglink_crc32 (file_crc, buffer, count);
1206
1207   fclose (f);
1208
1209   return crc == file_crc;
1210 }
1211
1212
1213 /*
1214 INTERNAL_FUNCTION
1215         find_separate_debug_file
1216
1217 SYNOPSIS
1218         char *find_separate_debug_file (bfd *abfd);
1219
1220 DESCRIPTION
1221         Searches @var{abfd} for a reference to separate debugging
1222         information, scans various locations in the filesystem, including
1223         the file tree rooted at @var{debug_file_directory}, and returns a
1224         filename of such debugging information if the file is found and has
1225         matching CRC32.  Returns NULL if no reference to debugging file
1226         exists, or file cannot be found.
1227 */
1228
1229 static char *
1230 find_separate_debug_file (bfd *abfd, const char *debug_file_directory)
1231 {
1232   char *base;
1233   char *dir;
1234   char *debugfile;
1235   char *canon_dir;
1236   unsigned long crc32;
1237   size_t dirlen;
1238   size_t canon_dirlen;
1239
1240   BFD_ASSERT (abfd);
1241   if (debug_file_directory == NULL)
1242     debug_file_directory = ".";
1243
1244   /* BFD may have been opened from a stream.  */
1245   if (abfd->filename == NULL)
1246     {
1247       bfd_set_error (bfd_error_invalid_operation);
1248       return NULL;
1249     }
1250
1251   base = get_debug_link_info (abfd, & crc32);
1252   if (base == NULL)
1253     return NULL;
1254
1255   if (base[0] == '\0')
1256     {
1257       free (base);
1258       bfd_set_error (bfd_error_no_debug_section);
1259       return NULL;
1260     }
1261
1262   for (dirlen = strlen (abfd->filename); dirlen > 0; dirlen--)
1263     if (IS_DIR_SEPARATOR (abfd->filename[dirlen - 1]))
1264       break;
1265
1266   dir = (char *) bfd_malloc (dirlen + 1);
1267   if (dir == NULL)
1268     {
1269       free (base);
1270       return NULL;
1271     }
1272   memcpy (dir, abfd->filename, dirlen);
1273   dir[dirlen] = '\0';
1274
1275   /* Compute the canonical name of the bfd object with all symbolic links
1276      resolved, for use in the global debugfile directory.  */
1277   canon_dir = lrealpath (abfd->filename);
1278   for (canon_dirlen = strlen (canon_dir); canon_dirlen > 0; canon_dirlen--)
1279     if (IS_DIR_SEPARATOR (canon_dir[canon_dirlen - 1]))
1280       break;
1281   canon_dir[canon_dirlen] = '\0';
1282
1283   debugfile = (char *)
1284       bfd_malloc (strlen (debug_file_directory) + 1
1285                   + (canon_dirlen > dirlen ? canon_dirlen : dirlen)
1286                   + strlen (".debug/")
1287                   + strlen (base)
1288                   + 1);
1289   if (debugfile == NULL)
1290     {
1291       free (base);
1292       free (dir);
1293       free (canon_dir);
1294       return NULL;
1295     }
1296
1297   /* First try in the same directory as the original file:  */
1298   strcpy (debugfile, dir);
1299   strcat (debugfile, base);
1300
1301   if (separate_debug_file_exists (debugfile, crc32))
1302     {
1303       free (base);
1304       free (dir);
1305       free (canon_dir);
1306       return debugfile;
1307     }
1308
1309   /* Then try in a subdirectory called .debug.  */
1310   strcpy (debugfile, dir);
1311   strcat (debugfile, ".debug/");
1312   strcat (debugfile, base);
1313
1314   if (separate_debug_file_exists (debugfile, crc32))
1315     {
1316       free (base);
1317       free (dir);
1318       free (canon_dir);
1319       return debugfile;
1320     }
1321
1322   /* Then try in the global debugfile directory.  */
1323   strcpy (debugfile, debug_file_directory);
1324   dirlen = strlen (debug_file_directory) - 1;
1325   if (dirlen > 0
1326       && debug_file_directory[dirlen] != '/'
1327       && canon_dir[0] != '/')
1328     strcat (debugfile, "/");
1329   strcat (debugfile, canon_dir);
1330   strcat (debugfile, base);
1331
1332   if (separate_debug_file_exists (debugfile, crc32))
1333     {
1334       free (base);
1335       free (dir);
1336       free (canon_dir);
1337       return debugfile;
1338     }
1339
1340   free (debugfile);
1341   free (base);
1342   free (dir);
1343   free (canon_dir);
1344   return NULL;
1345 }
1346
1347
1348 /*
1349 FUNCTION
1350         bfd_follow_gnu_debuglink
1351
1352 SYNOPSIS
1353         char *bfd_follow_gnu_debuglink (bfd *abfd, const char *dir);
1354
1355 DESCRIPTION
1356
1357         Takes a BFD and searches it for a .gnu_debuglink section.  If this
1358         section is found, it examines the section for the name and checksum
1359         of a '.debug' file containing auxiliary debugging information.  It
1360         then searches the filesystem for this .debug file in some standard
1361         locations, including the directory tree rooted at @var{dir}, and if
1362         found returns the full filename.
1363
1364         If @var{dir} is NULL, it will search a default path configured into
1365         libbfd at build time.  [XXX this feature is not currently
1366         implemented].
1367
1368 RETURNS
1369         <<NULL>> on any errors or failure to locate the .debug file,
1370         otherwise a pointer to a heap-allocated string containing the
1371         filename.  The caller is responsible for freeing this string.
1372 */
1373
1374 char *
1375 bfd_follow_gnu_debuglink (bfd *abfd, const char *dir)
1376 {
1377   return find_separate_debug_file (abfd, dir);
1378 }
1379
1380 /*
1381 FUNCTION
1382         bfd_create_gnu_debuglink_section
1383
1384 SYNOPSIS
1385         struct bfd_section *bfd_create_gnu_debuglink_section
1386           (bfd *abfd, const char *filename);
1387
1388 DESCRIPTION
1389
1390         Takes a @var{BFD} and adds a .gnu_debuglink section to it.  The section is sized
1391         to be big enough to contain a link to the specified @var{filename}.
1392
1393 RETURNS
1394         A pointer to the new section is returned if all is ok.  Otherwise <<NULL>> is
1395         returned and bfd_error is set.
1396 */
1397
1398 asection *
1399 bfd_create_gnu_debuglink_section (bfd *abfd, const char *filename)
1400 {
1401   asection *sect;
1402   bfd_size_type debuglink_size;
1403   flagword flags;
1404
1405   if (abfd == NULL || filename == NULL)
1406     {
1407       bfd_set_error (bfd_error_invalid_operation);
1408       return NULL;
1409     }
1410
1411   /* Strip off any path components in filename.  */
1412   filename = lbasename (filename);
1413
1414   sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
1415   if (sect)
1416     {
1417       /* Section already exists.  */
1418       bfd_set_error (bfd_error_invalid_operation);
1419       return NULL;
1420     }
1421
1422   flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
1423   sect = bfd_make_section_with_flags (abfd, GNU_DEBUGLINK, flags);
1424   if (sect == NULL)
1425     return NULL;
1426
1427   debuglink_size = strlen (filename) + 1;
1428   debuglink_size += 3;
1429   debuglink_size &= ~3;
1430   debuglink_size += 4;
1431
1432   if (! bfd_set_section_size (abfd, sect, debuglink_size))
1433     /* XXX Should we delete the section from the bfd ?  */
1434     return NULL;
1435
1436   return sect;
1437 }
1438
1439
1440 /*
1441 FUNCTION
1442         bfd_fill_in_gnu_debuglink_section
1443
1444 SYNOPSIS
1445         bfd_boolean bfd_fill_in_gnu_debuglink_section
1446           (bfd *abfd, struct bfd_section *sect, const char *filename);
1447
1448 DESCRIPTION
1449
1450         Takes a @var{BFD} and containing a .gnu_debuglink section @var{SECT}
1451         and fills in the contents of the section to contain a link to the
1452         specified @var{filename}.  The filename should be relative to the
1453         current directory.
1454
1455 RETURNS
1456         <<TRUE>> is returned if all is ok.  Otherwise <<FALSE>> is returned
1457         and bfd_error is set.
1458 */
1459
1460 bfd_boolean
1461 bfd_fill_in_gnu_debuglink_section (bfd *abfd,
1462                                    struct bfd_section *sect,
1463                                    const char *filename)
1464 {
1465   bfd_size_type debuglink_size;
1466   unsigned long crc32;
1467   char * contents;
1468   bfd_size_type crc_offset;
1469   FILE * handle;
1470   static unsigned char buffer[8 * 1024];
1471   size_t count;
1472   size_t filelen;
1473
1474   if (abfd == NULL || sect == NULL || filename == NULL)
1475     {
1476       bfd_set_error (bfd_error_invalid_operation);
1477       return FALSE;
1478     }
1479
1480   /* Make sure that we can read the file.
1481      XXX - Should we attempt to locate the debug info file using the same
1482      algorithm as gdb ?  At the moment, since we are creating the
1483      .gnu_debuglink section, we insist upon the user providing us with a
1484      correct-for-section-creation-time path, but this need not conform to
1485      the gdb location algorithm.  */
1486   handle = real_fopen (filename, FOPEN_RB);
1487   if (handle == NULL)
1488     {
1489       bfd_set_error (bfd_error_system_call);
1490       return FALSE;
1491     }
1492
1493   crc32 = 0;
1494   while ((count = fread (buffer, 1, sizeof buffer, handle)) > 0)
1495     crc32 = bfd_calc_gnu_debuglink_crc32 (crc32, buffer, count);
1496   fclose (handle);
1497
1498   /* Strip off any path components in filename,
1499      now that we no longer need them.  */
1500   filename = lbasename (filename);
1501
1502   filelen = strlen (filename);
1503   debuglink_size = filelen + 1;
1504   debuglink_size += 3;
1505   debuglink_size &= ~3;
1506   debuglink_size += 4;
1507
1508   contents = (char *) bfd_malloc (debuglink_size);
1509   if (contents == NULL)
1510     {
1511       /* XXX Should we delete the section from the bfd ?  */
1512       return FALSE;
1513     }
1514
1515   crc_offset = debuglink_size - 4;
1516   memcpy (contents, filename, filelen);
1517   memset (contents + filelen, 0, crc_offset - filelen);
1518
1519   bfd_put_32 (abfd, crc32, contents + crc_offset);
1520
1521   if (! bfd_set_section_contents (abfd, sect, contents, 0, debuglink_size))
1522     {
1523       /* XXX Should we delete the section from the bfd ?  */
1524       free (contents);
1525       return FALSE;
1526     }
1527
1528   return TRUE;
1529 }