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