Home | History | Annotate | Download | only in bfd
      1 /* opncls.c -- open and close a BFD.
      2    Copyright (C) 1990-2016 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 
     41 static unsigned int bfd_id_counter = 0;
     42 static unsigned int bfd_reserved_id_counter = 0;
     43 
     44 /*
     45 CODE_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 */
     49 unsigned 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 
     56 bfd *
     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 
     93 static const struct bfd_iovec opncls_iovec;
     94 
     95 /* Allocate a new BFD as a member of archive OBFD.  */
     96 
     97 bfd *
     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 
    119 static 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 
    136 bfd_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 /*
    156 SECTION
    157 	Opening and closing BFDs
    158 
    159 SUBSECTION
    160 	Functions for opening and closing
    161 */
    162 
    163 /*
    164 FUNCTION
    165 	bfd_fopen
    166 
    167 SYNOPSIS
    168 	bfd *bfd_fopen (const char *filename, const char *target,
    169                         const char *mode, int fd);
    170 
    171 DESCRIPTION
    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 
    193 bfd *
    194 bfd_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 /*
    263 FUNCTION
    264 	bfd_openr
    265 
    266 SYNOPSIS
    267 	bfd *bfd_openr (const char *filename, const char *target);
    268 
    269 DESCRIPTION
    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 
    284 bfd *
    285 bfd_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 /*
    298 FUNCTION
    299 	bfd_fdopenr
    300 
    301 SYNOPSIS
    302 	bfd *bfd_fdopenr (const char *filename, const char *target, int fd);
    303 
    304 DESCRIPTION
    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 
    328 bfd *
    329 bfd_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 /*
    364 FUNCTION
    365 	bfd_openstreamr
    366 
    367 SYNOPSIS
    368 	bfd *bfd_openstreamr (const char * filename, const char * target, void * stream);
    369 
    370 DESCRIPTION
    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 
    379 bfd *
    380 bfd_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 /*
    413 FUNCTION
    414 	bfd_openr_iovec
    415 
    416 SYNOPSIS
    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 
    432 DESCRIPTION
    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 
    469 struct 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 
    479 static file_ptr
    480 opncls_btell (struct bfd *abfd)
    481 {
    482   struct opncls *vec = (struct opncls *) abfd->iostream;
    483   return vec->where;
    484 }
    485 
    486 static int
    487 opncls_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 
    499 static file_ptr
    500 opncls_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 
    510 static file_ptr
    511 opncls_bwrite (struct bfd *abfd ATTRIBUTE_UNUSED,
    512 	      const void *where ATTRIBUTE_UNUSED,
    513 	      file_ptr nbytes ATTRIBUTE_UNUSED)
    514 {
    515   return -1;
    516 }
    517 
    518 static int
    519 opncls_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 
    531 static int
    532 opncls_bflush (struct bfd *abfd ATTRIBUTE_UNUSED)
    533 {
    534   return 0;
    535 }
    536 
    537 static int
    538 opncls_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 
    549 static void *
    550 opncls_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 
    562 static 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 
    567 bfd *
    568 bfd_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.
    619    Returns a pointer to a freshly-allocated BFD on success, or NULL.
    620 
    621    See comment by bfd_fdopenr before you try to modify this function.  */
    622 
    623 /*
    624 FUNCTION
    625 	bfd_openw
    626 
    627 SYNOPSIS
    628 	bfd *bfd_openw (const char *filename, const char *target);
    629 
    630 DESCRIPTION
    631 	Create a BFD, associated with file @var{filename}, using the
    632 	file format @var{target}, and return a pointer to it.
    633 
    634 	Possible errors are <<bfd_error_system_call>>, <<bfd_error_no_memory>>,
    635 	<<bfd_error_invalid_target>>.
    636 
    637 	A copy of the @var{filename} argument is stored in the newly created
    638 	BFD.  It can be accessed via the bfd_get_filename() macro.
    639 */
    640 
    641 bfd *
    642 bfd_openw (const char *filename, const char *target)
    643 {
    644   bfd *nbfd;
    645   const bfd_target *target_vec;
    646 
    647   /* nbfd has to point to head of malloc'ed block so that bfd_close may
    648      reclaim it correctly.  */
    649   nbfd = _bfd_new_bfd ();
    650   if (nbfd == NULL)
    651     return NULL;
    652 
    653   target_vec = bfd_find_target (target, nbfd);
    654   if (target_vec == NULL)
    655     {
    656       _bfd_delete_bfd (nbfd);
    657       return NULL;
    658     }
    659 
    660   /* PR 11983: Do not cache the original filename, but
    661      rather make a copy - the original might go away.  */
    662   nbfd->filename = xstrdup (filename);
    663   nbfd->direction = write_direction;
    664 
    665   if (bfd_open_file (nbfd) == NULL)
    666     {
    667       /* File not writeable, etc.  */
    668       bfd_set_error (bfd_error_system_call);
    669       _bfd_delete_bfd (nbfd);
    670       return NULL;
    671   }
    672 
    673   return nbfd;
    674 }
    675 
    676 static inline void
    677 _maybe_make_executable (bfd * abfd)
    678 {
    679   /* If the file was open for writing and is now executable,
    680      make it so.  */
    681   if (abfd->direction == write_direction
    682       && (abfd->flags & (EXEC_P | DYNAMIC)) != 0)
    683     {
    684       struct stat buf;
    685 
    686       if (stat (abfd->filename, &buf) == 0
    687 	  /* Do not attempt to change non-regular files.  This is
    688 	     here especially for configure scripts and kernel builds
    689 	     which run tests with "ld [...] -o /dev/null".  */
    690 	  && S_ISREG(buf.st_mode))
    691 	{
    692 	  unsigned int mask = umask (0);
    693 
    694 	  umask (mask);
    695 	  chmod (abfd->filename,
    696 		 (0777
    697 		  & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
    698 	}
    699     }
    700 }
    701 
    702 /*
    703 
    704 FUNCTION
    705 	bfd_close
    706 
    707 SYNOPSIS
    708 	bfd_boolean bfd_close (bfd *abfd);
    709 
    710 DESCRIPTION
    711 
    712 	Close a BFD. If the BFD was open for writing, then pending
    713 	operations are completed and the file written out and closed.
    714 	If the created file is executable, then <<chmod>> is called
    715 	to mark it as such.
    716 
    717 	All memory attached to the BFD is released.
    718 
    719 	The file descriptor associated with the BFD is closed (even
    720 	if it was passed in to BFD by <<bfd_fdopenr>>).
    721 
    722 RETURNS
    723 	<<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
    724 */
    725 
    726 
    727 bfd_boolean
    728 bfd_close (bfd *abfd)
    729 {
    730   bfd_boolean ret;
    731 
    732   if (bfd_write_p (abfd))
    733     {
    734       if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
    735 	return FALSE;
    736     }
    737 
    738   if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
    739     return FALSE;
    740 
    741   ret = abfd->iovec->bclose (abfd) == 0;
    742 
    743   if (ret)
    744     _maybe_make_executable (abfd);
    745 
    746   _bfd_delete_bfd (abfd);
    747 
    748   return ret;
    749 }
    750 
    751 /*
    752 FUNCTION
    753 	bfd_close_all_done
    754 
    755 SYNOPSIS
    756 	bfd_boolean bfd_close_all_done (bfd *);
    757 
    758 DESCRIPTION
    759 	Close a BFD.  Differs from <<bfd_close>> since it does not
    760 	complete any pending operations.  This routine would be used
    761 	if the application had just used BFD for swapping and didn't
    762 	want to use any of the writing code.
    763 
    764 	If the created file is executable, then <<chmod>> is called
    765 	to mark it as such.
    766 
    767 	All memory attached to the BFD is released.
    768 
    769 RETURNS
    770 	<<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
    771 */
    772 
    773 bfd_boolean
    774 bfd_close_all_done (bfd *abfd)
    775 {
    776   bfd_boolean ret;
    777 
    778   ret = bfd_cache_close (abfd);
    779 
    780   if (ret)
    781     _maybe_make_executable (abfd);
    782 
    783   _bfd_delete_bfd (abfd);
    784 
    785   return ret;
    786 }
    787 
    788 /*
    789 FUNCTION
    790 	bfd_create
    791 
    792 SYNOPSIS
    793 	bfd *bfd_create (const char *filename, bfd *templ);
    794 
    795 DESCRIPTION
    796 	Create a new BFD in the manner of <<bfd_openw>>, but without
    797 	opening a file. The new BFD takes the target from the target
    798 	used by @var{templ}. The format is always set to <<bfd_object>>.
    799 
    800 	A copy of the @var{filename} argument is stored in the newly created
    801 	BFD.  It can be accessed via the bfd_get_filename() macro.
    802 */
    803 
    804 bfd *
    805 bfd_create (const char *filename, bfd *templ)
    806 {
    807   bfd *nbfd;
    808 
    809   nbfd = _bfd_new_bfd ();
    810   if (nbfd == NULL)
    811     return NULL;
    812   /* PR 11983: Do not cache the original filename, but
    813      rather make a copy - the original might go away.  */
    814   nbfd->filename = xstrdup (filename);
    815   if (templ)
    816     nbfd->xvec = templ->xvec;
    817   nbfd->direction = no_direction;
    818   bfd_set_format (nbfd, bfd_object);
    819 
    820   return nbfd;
    821 }
    822 
    823 /*
    824 FUNCTION
    825 	bfd_make_writable
    826 
    827 SYNOPSIS
    828 	bfd_boolean bfd_make_writable (bfd *abfd);
    829 
    830 DESCRIPTION
    831 	Takes a BFD as created by <<bfd_create>> and converts it
    832 	into one like as returned by <<bfd_openw>>.  It does this
    833 	by converting the BFD to BFD_IN_MEMORY.  It's assumed that
    834 	you will call <<bfd_make_readable>> on this bfd later.
    835 
    836 RETURNS
    837 	<<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
    838 */
    839 
    840 bfd_boolean
    841 bfd_make_writable (bfd *abfd)
    842 {
    843   struct bfd_in_memory *bim;
    844 
    845   if (abfd->direction != no_direction)
    846     {
    847       bfd_set_error (bfd_error_invalid_operation);
    848       return FALSE;
    849     }
    850 
    851   bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory));
    852   if (bim == NULL)
    853     return FALSE;	/* bfd_error already set.  */
    854   abfd->iostream = bim;
    855   /* bfd_bwrite will grow these as needed.  */
    856   bim->size = 0;
    857   bim->buffer = 0;
    858 
    859   abfd->flags |= BFD_IN_MEMORY;
    860   abfd->iovec = &_bfd_memory_iovec;
    861   abfd->origin = 0;
    862   abfd->direction = write_direction;
    863   abfd->where = 0;
    864 
    865   return TRUE;
    866 }
    867 
    868 /*
    869 FUNCTION
    870 	bfd_make_readable
    871 
    872 SYNOPSIS
    873 	bfd_boolean bfd_make_readable (bfd *abfd);
    874 
    875 DESCRIPTION
    876 	Takes a BFD as created by <<bfd_create>> and
    877 	<<bfd_make_writable>> and converts it into one like as
    878 	returned by <<bfd_openr>>.  It does this by writing the
    879 	contents out to the memory buffer, then reversing the
    880 	direction.
    881 
    882 RETURNS
    883 	<<TRUE>> is returned if all is ok, otherwise <<FALSE>>.  */
    884 
    885 bfd_boolean
    886 bfd_make_readable (bfd *abfd)
    887 {
    888   if (abfd->direction != write_direction || !(abfd->flags & BFD_IN_MEMORY))
    889     {
    890       bfd_set_error (bfd_error_invalid_operation);
    891       return FALSE;
    892     }
    893 
    894   if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
    895     return FALSE;
    896 
    897   if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
    898     return FALSE;
    899 
    900   abfd->arch_info = &bfd_default_arch_struct;
    901 
    902   abfd->where = 0;
    903   abfd->format = bfd_unknown;
    904   abfd->my_archive = NULL;
    905   abfd->origin = 0;
    906   abfd->opened_once = FALSE;
    907   abfd->output_has_begun = FALSE;
    908   abfd->section_count = 0;
    909   abfd->usrdata = NULL;
    910   abfd->cacheable = FALSE;
    911   abfd->flags |= BFD_IN_MEMORY;
    912   abfd->mtime_set = FALSE;
    913 
    914   abfd->target_defaulted = TRUE;
    915   abfd->direction = read_direction;
    916   abfd->sections = 0;
    917   abfd->symcount = 0;
    918   abfd->outsymbols = 0;
    919   abfd->tdata.any = 0;
    920 
    921   bfd_section_list_clear (abfd);
    922   bfd_check_format (abfd, bfd_object);
    923 
    924   return TRUE;
    925 }
    926 
    927 /*
    928 FUNCTION
    929 	bfd_alloc
    930 
    931 SYNOPSIS
    932 	void *bfd_alloc (bfd *abfd, bfd_size_type wanted);
    933 
    934 DESCRIPTION
    935 	Allocate a block of @var{wanted} bytes of memory attached to
    936 	<<abfd>> and return a pointer to it.
    937 */
    938 
    939 void *
    940 bfd_alloc (bfd *abfd, bfd_size_type size)
    941 {
    942   void *ret;
    943   unsigned long ul_size = (unsigned long) size;
    944 
    945   if (size != ul_size
    946       /* Note - although objalloc_alloc takes an unsigned long as its
    947 	 argument, internally the size is treated as a signed long.  This can
    948 	 lead to problems where, for example, a request to allocate -1 bytes
    949 	 can result in just 1 byte being allocated, rather than
    950 	 ((unsigned long) -1) bytes.  Also memory checkers will often
    951 	 complain about attempts to allocate a negative amount of memory.
    952 	 So to stop these problems we fail if the size is negative.  */
    953       || ((signed long) ul_size) < 0)
    954     {
    955       bfd_set_error (bfd_error_no_memory);
    956       return NULL;
    957     }
    958 
    959   ret = objalloc_alloc ((struct objalloc *) abfd->memory, ul_size);
    960   if (ret == NULL)
    961     bfd_set_error (bfd_error_no_memory);
    962   return ret;
    963 }
    964 
    965 /*
    966 INTERNAL_FUNCTION
    967 	bfd_alloc2
    968 
    969 SYNOPSIS
    970 	void *bfd_alloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size);
    971 
    972 DESCRIPTION
    973 	Allocate a block of @var{nmemb} elements of @var{size} bytes each
    974 	of memory attached to <<abfd>> and return a pointer to it.
    975 */
    976 
    977 void *
    978 bfd_alloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size)
    979 {
    980   if ((nmemb | size) >= HALF_BFD_SIZE_TYPE
    981       && size != 0
    982       && nmemb > ~(bfd_size_type) 0 / size)
    983     {
    984       bfd_set_error (bfd_error_no_memory);
    985       return NULL;
    986     }
    987 
    988   return bfd_alloc (abfd, size * nmemb);
    989 }
    990 
    991 /*
    992 FUNCTION
    993 	bfd_zalloc
    994 
    995 SYNOPSIS
    996 	void *bfd_zalloc (bfd *abfd, bfd_size_type wanted);
    997 
    998 DESCRIPTION
    999 	Allocate a block of @var{wanted} bytes of zeroed memory
   1000 	attached to <<abfd>> and return a pointer to it.
   1001 */
   1002 
   1003 void *
   1004 bfd_zalloc (bfd *abfd, bfd_size_type size)
   1005 {
   1006   void *res;
   1007 
   1008   res = bfd_alloc (abfd, size);
   1009   if (res)
   1010     memset (res, 0, (size_t) size);
   1011   return res;
   1012 }
   1013 
   1014 /*
   1015 INTERNAL_FUNCTION
   1016 	bfd_zalloc2
   1017 
   1018 SYNOPSIS
   1019 	void *bfd_zalloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size);
   1020 
   1021 DESCRIPTION
   1022 	Allocate a block of @var{nmemb} elements of @var{size} bytes each
   1023 	of zeroed memory attached to <<abfd>> and return a pointer to it.
   1024 */
   1025 
   1026 void *
   1027 bfd_zalloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size)
   1028 {
   1029   void *res;
   1030 
   1031   if ((nmemb | size) >= HALF_BFD_SIZE_TYPE
   1032       && size != 0
   1033       && nmemb > ~(bfd_size_type) 0 / size)
   1034     {
   1035       bfd_set_error (bfd_error_no_memory);
   1036       return NULL;
   1037     }
   1038 
   1039   size *= nmemb;
   1040 
   1041   res = bfd_alloc (abfd, size);
   1042   if (res)
   1043     memset (res, 0, (size_t) size);
   1044   return res;
   1045 }
   1046 
   1047 /* Free a block allocated for a BFD.
   1048    Note:  Also frees all more recently allocated blocks!  */
   1049 
   1050 void
   1051 bfd_release (bfd *abfd, void *block)
   1052 {
   1053   objalloc_free_block ((struct objalloc *) abfd->memory, block);
   1054 }
   1055 
   1056 
   1057 /*
   1058    GNU Extension: separate debug-info files
   1059 
   1060    The idea here is that a special section called .gnu_debuglink might be
   1061    embedded in a binary file, which indicates that some *other* file
   1062    contains the real debugging information. This special section contains a
   1063    filename and CRC32 checksum, which we read and resolve to another file,
   1064    if it exists.
   1065 
   1066    This facilitates "optional" provision of debugging information, without
   1067    having to provide two complete copies of every binary object (with and
   1068    without debug symbols).  */
   1069 
   1070 #define GNU_DEBUGLINK		".gnu_debuglink"
   1071 #define GNU_DEBUGALTLINK	".gnu_debugaltlink"
   1072 
   1073 /*
   1074 FUNCTION
   1075 	bfd_calc_gnu_debuglink_crc32
   1076 
   1077 SYNOPSIS
   1078 	unsigned long bfd_calc_gnu_debuglink_crc32
   1079 	  (unsigned long crc, const unsigned char *buf, bfd_size_type len);
   1080 
   1081 DESCRIPTION
   1082 	Computes a CRC value as used in the .gnu_debuglink section.
   1083 	Advances the previously computed @var{crc} value by computing
   1084 	and adding in the crc32 for @var{len} bytes of @var{buf}.
   1085 
   1086 RETURNS
   1087 	Return the updated CRC32 value.
   1088 */
   1089 
   1090 unsigned long
   1091 bfd_calc_gnu_debuglink_crc32 (unsigned long crc,
   1092 			      const unsigned char *buf,
   1093 			      bfd_size_type len)
   1094 {
   1095   static const unsigned long crc32_table[256] =
   1096     {
   1097       0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
   1098       0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
   1099       0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
   1100       0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
   1101       0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
   1102       0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
   1103       0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
   1104       0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
   1105       0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
   1106       0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
   1107       0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
   1108       0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
   1109       0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
   1110       0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
   1111       0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
   1112       0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
   1113       0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
   1114       0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
   1115       0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
   1116       0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
   1117       0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
   1118       0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
   1119       0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
   1120       0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
   1121       0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
   1122       0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
   1123       0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
   1124       0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
   1125       0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
   1126       0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
   1127       0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
   1128       0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
   1129       0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
   1130       0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
   1131       0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
   1132       0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
   1133       0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
   1134       0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
   1135       0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
   1136       0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
   1137       0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
   1138       0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
   1139       0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
   1140       0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
   1141       0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
   1142       0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
   1143       0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
   1144       0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
   1145       0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
   1146       0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
   1147       0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
   1148       0x2d02ef8d
   1149     };
   1150   const unsigned char *end;
   1151 
   1152   crc = ~crc & 0xffffffff;
   1153   for (end = buf + len; buf < end; ++ buf)
   1154     crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
   1155   return ~crc & 0xffffffff;
   1156 }
   1157 
   1158 
   1159 /*
   1160 FUNCTION
   1161 	bfd_get_debug_link_info
   1162 
   1163 SYNOPSIS
   1164 	char *bfd_get_debug_link_info (bfd *abfd, unsigned long *crc32_out);
   1165 
   1166 DESCRIPTION
   1167 	Fetch the filename and CRC32 value for any separate debuginfo
   1168 	associated with @var{abfd}.  Return NULL if no such info found,
   1169 	otherwise return filename and update @var{crc32_out}.  The
   1170 	returned filename is allocated with @code{malloc}; freeing it
   1171 	is the responsibility of the caller.
   1172 */
   1173 
   1174 char *
   1175 bfd_get_debug_link_info (bfd *abfd, unsigned long *crc32_out)
   1176 {
   1177   asection *sect;
   1178   unsigned long crc32;
   1179   bfd_byte *contents;
   1180   unsigned int crc_offset;
   1181   char *name;
   1182 
   1183   BFD_ASSERT (abfd);
   1184   BFD_ASSERT (crc32_out);
   1185 
   1186   sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
   1187 
   1188   if (sect == NULL)
   1189     return NULL;
   1190 
   1191   if (!bfd_malloc_and_get_section (abfd, sect, &contents))
   1192     {
   1193       if (contents != NULL)
   1194 	free (contents);
   1195       return NULL;
   1196     }
   1197 
   1198   /* CRC value is stored after the filename, aligned up to 4 bytes.  */
   1199   name = (char *) contents;
   1200   /* PR 17597: avoid reading off the end of the buffer.  */
   1201   crc_offset = strnlen (name, bfd_get_section_size (sect)) + 1;
   1202   crc_offset = (crc_offset + 3) & ~3;
   1203   if (crc_offset >= bfd_get_section_size (sect))
   1204     return NULL;
   1205 
   1206   crc32 = bfd_get_32 (abfd, contents + crc_offset);
   1207 
   1208   *crc32_out = crc32;
   1209   return name;
   1210 }
   1211 
   1212 /*
   1213 FUNCTION
   1214 	bfd_get_alt_debug_link_info
   1215 
   1216 SYNOPSIS
   1217 	char *bfd_get_alt_debug_link_info (bfd * abfd,
   1218 					   bfd_size_type *buildid_len,
   1219 			                   bfd_byte **buildid_out);
   1220 
   1221 DESCRIPTION
   1222 	Fetch the filename and BuildID value for any alternate debuginfo
   1223 	associated with @var{abfd}.  Return NULL if no such info found,
   1224 	otherwise return filename and update @var{buildid_len} and
   1225 	@var{buildid_out}.  The returned filename and build_id are
   1226 	allocated with @code{malloc}; freeing them is the
   1227 	responsibility of the caller.
   1228 */
   1229 
   1230 char *
   1231 bfd_get_alt_debug_link_info (bfd * abfd, bfd_size_type *buildid_len,
   1232 			     bfd_byte **buildid_out)
   1233 {
   1234   asection *sect;
   1235   bfd_byte *contents;
   1236   unsigned int buildid_offset;
   1237   char *name;
   1238 
   1239   BFD_ASSERT (abfd);
   1240   BFD_ASSERT (buildid_len);
   1241   BFD_ASSERT (buildid_out);
   1242 
   1243   sect = bfd_get_section_by_name (abfd, GNU_DEBUGALTLINK);
   1244 
   1245   if (sect == NULL)
   1246     return NULL;
   1247 
   1248   if (!bfd_malloc_and_get_section (abfd, sect, & contents))
   1249     {
   1250       if (contents != NULL)
   1251 	free (contents);
   1252       return NULL;
   1253     }
   1254 
   1255   /* BuildID value is stored after the filename.  */
   1256   name = (char *) contents;
   1257   buildid_offset = strnlen (name, bfd_get_section_size (sect)) + 1;
   1258   if (buildid_offset >= bfd_get_section_size (sect))
   1259     return NULL;
   1260 
   1261   *buildid_len = bfd_get_section_size (sect) - buildid_offset;
   1262   *buildid_out = bfd_malloc (*buildid_len);
   1263   memcpy (*buildid_out, contents + buildid_offset, *buildid_len);
   1264 
   1265   return name;
   1266 }
   1267 
   1268 /*
   1269 INTERNAL_FUNCTION
   1270 	separate_debug_file_exists
   1271 
   1272 SYNOPSIS
   1273 	bfd_boolean separate_debug_file_exists
   1274 	  (char *name, unsigned long crc32);
   1275 
   1276 DESCRIPTION
   1277 	Checks to see if @var{name} is a file and if its contents
   1278 	match @var{crc32}.
   1279 */
   1280 
   1281 static bfd_boolean
   1282 separate_debug_file_exists (const char *name, const unsigned long crc)
   1283 {
   1284   static unsigned char buffer [8 * 1024];
   1285   unsigned long file_crc = 0;
   1286   FILE *f;
   1287   bfd_size_type count;
   1288 
   1289   BFD_ASSERT (name);
   1290 
   1291   f = real_fopen (name, FOPEN_RB);
   1292   if (f == NULL)
   1293     return FALSE;
   1294 
   1295   while ((count = fread (buffer, 1, sizeof (buffer), f)) > 0)
   1296     file_crc = bfd_calc_gnu_debuglink_crc32 (file_crc, buffer, count);
   1297 
   1298   fclose (f);
   1299 
   1300   return crc == file_crc;
   1301 }
   1302 
   1303 /*
   1304 INTERNAL_FUNCTION
   1305 	separate_alt_debug_file_exists
   1306 
   1307 SYNOPSIS
   1308 	bfd_boolean separate_alt_debug_file_exists
   1309 	  (char *name, unsigned long crc32);
   1310 
   1311 DESCRIPTION
   1312 	Checks to see if @var{name} is a file and if its BuildID
   1313 	matches @var{buildid}.
   1314 */
   1315 
   1316 static bfd_boolean
   1317 separate_alt_debug_file_exists (const char *name,
   1318 				const unsigned long buildid ATTRIBUTE_UNUSED)
   1319 {
   1320   FILE *f;
   1321 
   1322   BFD_ASSERT (name);
   1323 
   1324   f = real_fopen (name, FOPEN_RB);
   1325   if (f == NULL)
   1326     return FALSE;
   1327 
   1328   /* FIXME: Add code to check buildid.  */
   1329 
   1330   fclose (f);
   1331 
   1332   return TRUE;
   1333 }
   1334 
   1335 /*
   1336 INTERNAL_FUNCTION
   1337 	find_separate_debug_file
   1338 
   1339 SYNOPSIS
   1340 	char *find_separate_debug_file (bfd *abfd);
   1341 
   1342 DESCRIPTION
   1343 	Searches @var{abfd} for a section called @var{section_name} which
   1344 	is expected to contain a reference to a file containing separate
   1345 	debugging information.  The function scans various locations in
   1346 	the filesystem, including the file tree rooted at
   1347 	@var{debug_file_directory}, and returns the first matching
   1348 	filename that it finds.  If @var{check_crc} is TRUE then the
   1349 	contents of the file must also match the CRC value contained in
   1350 	@var{section_name}.  Returns NULL if no valid file could be found.
   1351 */
   1352 
   1353 typedef char *      (* get_func_type) (bfd *, unsigned long *);
   1354 typedef bfd_boolean (* check_func_type) (const char *, const unsigned long);
   1355 
   1356 static char *
   1357 find_separate_debug_file (bfd *           abfd,
   1358 			  const char *    debug_file_directory,
   1359 			  get_func_type   get_func,
   1360 			  check_func_type check_func)
   1361 {
   1362   char *base;
   1363   char *dir;
   1364   char *debugfile;
   1365   char *canon_dir;
   1366   unsigned long crc32;
   1367   size_t dirlen;
   1368   size_t canon_dirlen;
   1369 
   1370   BFD_ASSERT (abfd);
   1371   if (debug_file_directory == NULL)
   1372     debug_file_directory = ".";
   1373 
   1374   /* BFD may have been opened from a stream.  */
   1375   if (abfd->filename == NULL)
   1376     {
   1377       bfd_set_error (bfd_error_invalid_operation);
   1378       return NULL;
   1379     }
   1380 
   1381   base = get_func (abfd, & crc32);
   1382 
   1383   if (base == NULL)
   1384     return NULL;
   1385 
   1386   if (base[0] == '\0')
   1387     {
   1388       free (base);
   1389       bfd_set_error (bfd_error_no_debug_section);
   1390       return NULL;
   1391     }
   1392 
   1393   for (dirlen = strlen (abfd->filename); dirlen > 0; dirlen--)
   1394     if (IS_DIR_SEPARATOR (abfd->filename[dirlen - 1]))
   1395       break;
   1396 
   1397   dir = (char *) bfd_malloc (dirlen + 1);
   1398   if (dir == NULL)
   1399     {
   1400       free (base);
   1401       return NULL;
   1402     }
   1403   memcpy (dir, abfd->filename, dirlen);
   1404   dir[dirlen] = '\0';
   1405 
   1406   /* Compute the canonical name of the bfd object with all symbolic links
   1407      resolved, for use in the global debugfile directory.  */
   1408   canon_dir = lrealpath (abfd->filename);
   1409   for (canon_dirlen = strlen (canon_dir); canon_dirlen > 0; canon_dirlen--)
   1410     if (IS_DIR_SEPARATOR (canon_dir[canon_dirlen - 1]))
   1411       break;
   1412   canon_dir[canon_dirlen] = '\0';
   1413 
   1414   debugfile = (char *)
   1415       bfd_malloc (strlen (debug_file_directory) + 1
   1416                   + (canon_dirlen > dirlen ? canon_dirlen : dirlen)
   1417                   + strlen (".debug/")
   1418                   + strlen (base)
   1419                   + 1);
   1420   if (debugfile == NULL)
   1421     goto found; /* Actually this returns NULL.  */
   1422 
   1423   /* First try in the same directory as the original file:  */
   1424   strcpy (debugfile, dir);
   1425   strcat (debugfile, base);
   1426 
   1427   if (check_func (debugfile, crc32))
   1428     goto found;
   1429 
   1430   /* Then try in a subdirectory called .debug.  */
   1431   strcpy (debugfile, dir);
   1432   strcat (debugfile, ".debug/");
   1433   strcat (debugfile, base);
   1434 
   1435   if (check_func (debugfile, crc32))
   1436     goto found;
   1437 
   1438   /* Then try in the global debugfile directory.  */
   1439   strcpy (debugfile, debug_file_directory);
   1440   dirlen = strlen (debug_file_directory) - 1;
   1441   if (dirlen > 0
   1442       && debug_file_directory[dirlen] != '/'
   1443       && canon_dir[0] != '/')
   1444     strcat (debugfile, "/");
   1445   strcat (debugfile, canon_dir);
   1446   strcat (debugfile, base);
   1447 
   1448   if (check_func (debugfile, crc32))
   1449     goto found;
   1450 
   1451   /* Failed to find the file.  */
   1452   free (debugfile);
   1453   debugfile = NULL;
   1454 
   1455  found:
   1456   free (base);
   1457   free (dir);
   1458   free (canon_dir);
   1459   return debugfile;
   1460 }
   1461 
   1462 
   1463 /*
   1464 FUNCTION
   1465 	bfd_follow_gnu_debuglink
   1466 
   1467 SYNOPSIS
   1468 	char *bfd_follow_gnu_debuglink (bfd *abfd, const char *dir);
   1469 
   1470 DESCRIPTION
   1471 
   1472 	Takes a BFD and searches it for a .gnu_debuglink section.  If this
   1473 	section is found, it examines the section for the name and checksum
   1474 	of a '.debug' file containing auxiliary debugging information.  It
   1475 	then searches the filesystem for this .debug file in some standard
   1476 	locations, including the directory tree rooted at @var{dir}, and if
   1477 	found returns the full filename.
   1478 
   1479 	If @var{dir} is NULL, it will search a default path configured into
   1480 	libbfd at build time.  [XXX this feature is not currently
   1481 	implemented].
   1482 
   1483 RETURNS
   1484 	<<NULL>> on any errors or failure to locate the .debug file,
   1485 	otherwise a pointer to a heap-allocated string containing the
   1486 	filename.  The caller is responsible for freeing this string.
   1487 */
   1488 
   1489 char *
   1490 bfd_follow_gnu_debuglink (bfd *abfd, const char *dir)
   1491 {
   1492   return find_separate_debug_file (abfd, dir,
   1493 				   bfd_get_debug_link_info,
   1494 				   separate_debug_file_exists);
   1495 }
   1496 
   1497 /* Helper for bfd_follow_gnu_debugaltlink.  It just pretends to return
   1498    a CRC.  .gnu_debugaltlink supplies a build-id, which is different,
   1499    but this is ok because separate_alt_debug_file_exists ignores the
   1500    CRC anyway.  */
   1501 
   1502 static char *
   1503 get_alt_debug_link_info_shim (bfd * abfd, unsigned long *crc32_out)
   1504 {
   1505   bfd_size_type len;
   1506   bfd_byte *buildid = NULL;
   1507   char *result = bfd_get_alt_debug_link_info (abfd, &len, &buildid);
   1508 
   1509   *crc32_out = 0;
   1510   free (buildid);
   1511 
   1512   return result;
   1513 }
   1514 
   1515 /*
   1516 FUNCTION
   1517 	bfd_follow_gnu_debugaltlink
   1518 
   1519 SYNOPSIS
   1520 	char *bfd_follow_gnu_debugaltlink (bfd *abfd, const char *dir);
   1521 
   1522 DESCRIPTION
   1523 
   1524 	Takes a BFD and searches it for a .gnu_debugaltlink section.  If this
   1525 	section is found, it examines the section for the name of a file
   1526 	containing auxiliary debugging information.  It	then searches the
   1527 	filesystem for this file in a set of standard locations, including
   1528 	the directory tree rooted at @var{dir}, and if found returns the
   1529 	full filename.
   1530 
   1531 	If @var{dir} is NULL, it will search a default path configured into
   1532 	libbfd at build time.  [FIXME: This feature is not currently
   1533 	implemented].
   1534 
   1535 RETURNS
   1536 	<<NULL>> on any errors or failure to locate the debug file,
   1537 	otherwise a pointer to a heap-allocated string containing the
   1538 	filename.  The caller is responsible for freeing this string.
   1539 */
   1540 
   1541 char *
   1542 bfd_follow_gnu_debugaltlink (bfd *abfd, const char *dir)
   1543 {
   1544   return find_separate_debug_file (abfd, dir,
   1545 				   get_alt_debug_link_info_shim,
   1546 				   separate_alt_debug_file_exists);
   1547 }
   1548 
   1549 /*
   1550 FUNCTION
   1551 	bfd_create_gnu_debuglink_section
   1552 
   1553 SYNOPSIS
   1554 	struct bfd_section *bfd_create_gnu_debuglink_section
   1555 	  (bfd *abfd, const char *filename);
   1556 
   1557 DESCRIPTION
   1558 
   1559 	Takes a @var{BFD} and adds a .gnu_debuglink section to it.  The section is sized
   1560 	to be big enough to contain a link to the specified @var{filename}.
   1561 
   1562 RETURNS
   1563 	A pointer to the new section is returned if all is ok.  Otherwise <<NULL>> is
   1564 	returned and bfd_error is set.
   1565 */
   1566 
   1567 asection *
   1568 bfd_create_gnu_debuglink_section (bfd *abfd, const char *filename)
   1569 {
   1570   asection *sect;
   1571   bfd_size_type debuglink_size;
   1572   flagword flags;
   1573 
   1574   if (abfd == NULL || filename == NULL)
   1575     {
   1576       bfd_set_error (bfd_error_invalid_operation);
   1577       return NULL;
   1578     }
   1579 
   1580   /* Strip off any path components in filename.  */
   1581   filename = lbasename (filename);
   1582 
   1583   sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
   1584   if (sect)
   1585     {
   1586       /* Section already exists.  */
   1587       bfd_set_error (bfd_error_invalid_operation);
   1588       return NULL;
   1589     }
   1590 
   1591   flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
   1592   sect = bfd_make_section_with_flags (abfd, GNU_DEBUGLINK, flags);
   1593   if (sect == NULL)
   1594     return NULL;
   1595 
   1596   debuglink_size = strlen (filename) + 1;
   1597   debuglink_size += 3;
   1598   debuglink_size &= ~3;
   1599   debuglink_size += 4;
   1600 
   1601   if (! bfd_set_section_size (abfd, sect, debuglink_size))
   1602     /* XXX Should we delete the section from the bfd ?  */
   1603     return NULL;
   1604 
   1605   return sect;
   1606 }
   1607 
   1608 
   1609 /*
   1610 FUNCTION
   1611 	bfd_fill_in_gnu_debuglink_section
   1612 
   1613 SYNOPSIS
   1614 	bfd_boolean bfd_fill_in_gnu_debuglink_section
   1615 	  (bfd *abfd, struct bfd_section *sect, const char *filename);
   1616 
   1617 DESCRIPTION
   1618 
   1619 	Takes a @var{BFD} and containing a .gnu_debuglink section @var{SECT}
   1620 	and fills in the contents of the section to contain a link to the
   1621 	specified @var{filename}.  The filename should be relative to the
   1622 	current directory.
   1623 
   1624 RETURNS
   1625 	<<TRUE>> is returned if all is ok.  Otherwise <<FALSE>> is returned
   1626 	and bfd_error is set.
   1627 */
   1628 
   1629 bfd_boolean
   1630 bfd_fill_in_gnu_debuglink_section (bfd *abfd,
   1631 				   struct bfd_section *sect,
   1632 				   const char *filename)
   1633 {
   1634   bfd_size_type debuglink_size;
   1635   unsigned long crc32;
   1636   char * contents;
   1637   bfd_size_type crc_offset;
   1638   FILE * handle;
   1639   static unsigned char buffer[8 * 1024];
   1640   size_t count;
   1641   size_t filelen;
   1642 
   1643   if (abfd == NULL || sect == NULL || filename == NULL)
   1644     {
   1645       bfd_set_error (bfd_error_invalid_operation);
   1646       return FALSE;
   1647     }
   1648 
   1649   /* Make sure that we can read the file.
   1650      XXX - Should we attempt to locate the debug info file using the same
   1651      algorithm as gdb ?  At the moment, since we are creating the
   1652      .gnu_debuglink section, we insist upon the user providing us with a
   1653      correct-for-section-creation-time path, but this need not conform to
   1654      the gdb location algorithm.  */
   1655   handle = real_fopen (filename, FOPEN_RB);
   1656   if (handle == NULL)
   1657     {
   1658       bfd_set_error (bfd_error_system_call);
   1659       return FALSE;
   1660     }
   1661 
   1662   crc32 = 0;
   1663   while ((count = fread (buffer, 1, sizeof buffer, handle)) > 0)
   1664     crc32 = bfd_calc_gnu_debuglink_crc32 (crc32, buffer, count);
   1665   fclose (handle);
   1666 
   1667   /* Strip off any path components in filename,
   1668      now that we no longer need them.  */
   1669   filename = lbasename (filename);
   1670 
   1671   filelen = strlen (filename);
   1672   debuglink_size = filelen + 1;
   1673   debuglink_size += 3;
   1674   debuglink_size &= ~3;
   1675   debuglink_size += 4;
   1676 
   1677   contents = (char *) bfd_malloc (debuglink_size);
   1678   if (contents == NULL)
   1679     {
   1680       /* XXX Should we delete the section from the bfd ?  */
   1681       return FALSE;
   1682     }
   1683 
   1684   crc_offset = debuglink_size - 4;
   1685   memcpy (contents, filename, filelen);
   1686   memset (contents + filelen, 0, crc_offset - filelen);
   1687 
   1688   bfd_put_32 (abfd, crc32, contents + crc_offset);
   1689 
   1690   if (! bfd_set_section_contents (abfd, sect, contents, 0, debuglink_size))
   1691     {
   1692       /* XXX Should we delete the section from the bfd ?  */
   1693       free (contents);
   1694       return FALSE;
   1695     }
   1696 
   1697   return TRUE;
   1698 }
   1699