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