Home | History | Annotate | Line # | Download | only in bfd
opncls.c revision 1.1.1.7
      1 /* opncls.c -- open and close a BFD.
      2    Copyright (C) 1990-2024 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 #include "elf-bfd.h"
     29 
     30 #ifndef S_IXUSR
     31 #define S_IXUSR 0100	/* Execute by owner.  */
     32 #endif
     33 #ifndef S_IXGRP
     34 #define S_IXGRP 0010	/* Execute by group.  */
     35 #endif
     36 #ifndef S_IXOTH
     37 #define S_IXOTH 0001	/* Execute by others.  */
     38 #endif
     39 
     40 /*
     41 SECTION
     42 	Opening and closing BFDs
     43 
     44 SUBSECTION
     45 	Functions for opening and closing
     46 */
     47 
     48 /* Counters used to initialize the bfd identifier.  */
     49 
     50 static unsigned int bfd_id_counter = 0;
     51 static unsigned int bfd_reserved_id_counter = 0;
     52 
     53 /*
     54 EXTERNAL
     55 .{* Set to N to open the next N BFDs using an alternate id space.  *}
     56 .extern unsigned int bfd_use_reserved_id;
     57 .
     58 */
     59 unsigned int bfd_use_reserved_id = 0;
     60 
     61 /* fdopen is a loser -- we should use stdio exclusively.  Unfortunately
     62    if we do that we can't use fcntl.  */
     63 
     64 /*
     65 INTERNAL_FUNCTION
     66 	_bfd_new_bfd
     67 
     68 SYNOPSIS
     69 	bfd *_bfd_new_bfd (void);
     70 
     71 DESCRIPTION
     72 	Return a new BFD.  All BFD's are allocated through this routine.
     73 */
     74 
     75 bfd *
     76 _bfd_new_bfd (void)
     77 {
     78   bfd *nbfd;
     79 
     80   nbfd = (bfd *) bfd_zmalloc (sizeof (bfd));
     81   if (nbfd == NULL)
     82     return NULL;
     83 
     84   if (!bfd_lock ())
     85     return NULL;
     86   if (bfd_use_reserved_id)
     87     {
     88       nbfd->id = --bfd_reserved_id_counter;
     89       --bfd_use_reserved_id;
     90     }
     91   else
     92     nbfd->id = bfd_id_counter++;
     93   if (!bfd_unlock ())
     94     {
     95       free (nbfd);
     96       return NULL;
     97     }
     98 
     99   nbfd->memory = objalloc_create ();
    100   if (nbfd->memory == NULL)
    101     {
    102       bfd_set_error (bfd_error_no_memory);
    103       free (nbfd);
    104       return NULL;
    105     }
    106 
    107   nbfd->arch_info = &bfd_default_arch_struct;
    108 
    109   if (!bfd_hash_table_init_n (& nbfd->section_htab, bfd_section_hash_newfunc,
    110 			      sizeof (struct section_hash_entry), 13))
    111     {
    112       objalloc_free ((struct objalloc *) nbfd->memory);
    113       free (nbfd);
    114       return NULL;
    115     }
    116 
    117   nbfd->archive_plugin_fd = -1;
    118 
    119   return nbfd;
    120 }
    121 
    122 static const struct bfd_iovec opncls_iovec;
    123 
    124 /*
    125 INTERNAL_FUNCTION
    126 	_bfd_new_bfd_contained_in
    127 
    128 SYNOPSIS
    129 	bfd *_bfd_new_bfd_contained_in (bfd *);
    130 
    131 DESCRIPTION
    132 	Allocate a new BFD as a member of archive OBFD.
    133 */
    134 
    135 bfd *
    136 _bfd_new_bfd_contained_in (bfd *obfd)
    137 {
    138   bfd *nbfd;
    139 
    140   /* Nested archives in bims are unsupported.  */
    141   if ((obfd->flags & BFD_IN_MEMORY) != 0)
    142     {
    143       bfd_set_error (bfd_error_malformed_archive);
    144       return NULL;
    145     }
    146   nbfd = _bfd_new_bfd ();
    147   if (nbfd == NULL)
    148     return NULL;
    149   nbfd->xvec = obfd->xvec;
    150   nbfd->iovec = obfd->iovec;
    151   if (obfd->iovec == &opncls_iovec)
    152     nbfd->iostream = obfd->iostream;
    153   nbfd->my_archive = obfd;
    154   nbfd->direction = read_direction;
    155   nbfd->target_defaulted = obfd->target_defaulted;
    156   nbfd->lto_output = obfd->lto_output;
    157   nbfd->no_export = obfd->no_export;
    158   return nbfd;
    159 }
    160 
    161 /* Delete a BFD.  */
    162 
    163 static void
    164 _bfd_delete_bfd (bfd *abfd)
    165 {
    166   /* Give the target _bfd_free_cached_info a chance to free memory.  */
    167   if (abfd->memory && abfd->xvec)
    168     bfd_free_cached_info (abfd);
    169 
    170   /* The target _bfd_free_cached_info may not have done anything..  */
    171   if (abfd->memory)
    172     {
    173       bfd_hash_table_free (&abfd->section_htab);
    174       objalloc_free ((struct objalloc *) abfd->memory);
    175     }
    176   else
    177     free ((char *) bfd_get_filename (abfd));
    178 
    179   free (abfd->arelt_data);
    180   free (abfd);
    181 }
    182 
    183 /*
    184 INTERNAL_FUNCTION
    185 	_bfd_free_cached_info
    186 
    187 SYNOPSIS
    188 	bool _bfd_free_cached_info (bfd *);
    189 
    190 DESCRIPTION
    191 	Free objalloc memory.
    192 */
    193 
    194 bool
    195 _bfd_free_cached_info (bfd *abfd)
    196 {
    197   if (abfd->memory)
    198     {
    199       const char *filename = bfd_get_filename (abfd);
    200       if (filename)
    201 	{
    202 	  /* We can't afford to lose the bfd filename when freeing
    203 	     abfd->memory, because that would kill the cache.c scheme
    204 	     of closing and reopening files in order to limit the
    205 	     number of open files.  To reopen, you need the filename.
    206 	     And indeed _bfd_compute_and_write_armap calls
    207 	     _bfd_free_cached_info to free up space used by symbols
    208 	     and by check_format_matches.  Which we want to continue
    209 	     doing to handle very large archives.  Later the archive
    210 	     elements are copied, which might require reopening files.
    211 	     We also want to keep using objalloc memory for the
    212 	     filename since that allows the name to be updated
    213 	     without either leaking memory or implementing some sort
    214 	     of reference counted string for copies of the filename.  */
    215 	  size_t len = strlen (filename) + 1;
    216 	  char *copy = bfd_malloc (len);
    217 	  if (copy == NULL)
    218 	    return false;
    219 	  memcpy (copy, filename, len);
    220 	  abfd->filename = copy;
    221 	}
    222       bfd_hash_table_free (&abfd->section_htab);
    223       objalloc_free ((struct objalloc *) abfd->memory);
    224 
    225       abfd->sections = NULL;
    226       abfd->section_last = NULL;
    227       abfd->outsymbols = NULL;
    228       abfd->tdata.any = NULL;
    229       abfd->usrdata = NULL;
    230       abfd->memory = NULL;
    231     }
    232 
    233   return true;
    234 }
    235 
    236 /*
    237 FUNCTION
    238 	bfd_fopen
    239 
    240 SYNOPSIS
    241 	bfd *bfd_fopen (const char *filename, const char *target,
    242 			const char *mode, int fd);
    243 
    244 DESCRIPTION
    245 	Open the file @var{filename} with the target @var{target}.
    246 	Return a pointer to the created BFD.  If @var{fd} is not -1,
    247 	then <<fdopen>> is used to open the file; otherwise, <<fopen>>
    248 	is used.  @var{mode} is passed directly to <<fopen>> or
    249 	<<fdopen>>.
    250 
    251 	Calls <<bfd_find_target>>, so @var{target} is interpreted as by
    252 	that function.
    253 
    254 	The new BFD is marked as cacheable iff @var{fd} is -1.
    255 
    256 	If <<NULL>> is returned then an error has occured.   Possible errors
    257 	are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or
    258 	<<system_call>> error.
    259 
    260 	On error, @var{fd} is always closed.
    261 
    262 	A copy of the @var{filename} argument is stored in the newly created
    263 	BFD.  It can be accessed via the bfd_get_filename() macro.
    264 */
    265 
    266 bfd *
    267 bfd_fopen (const char *filename, const char *target, const char *mode, int fd)
    268 {
    269   bfd *nbfd;
    270   const bfd_target *target_vec;
    271 
    272   nbfd = _bfd_new_bfd ();
    273   if (nbfd == NULL)
    274     {
    275       if (fd != -1)
    276 	close (fd);
    277       return NULL;
    278     }
    279 
    280   target_vec = bfd_find_target (target, nbfd);
    281   if (target_vec == NULL)
    282     {
    283       if (fd != -1)
    284 	close (fd);
    285       _bfd_delete_bfd (nbfd);
    286       return NULL;
    287     }
    288 
    289 #ifdef HAVE_FDOPEN
    290   if (fd != -1)
    291     nbfd->iostream = fdopen (fd, mode);
    292   else
    293 #endif
    294     nbfd->iostream = _bfd_real_fopen (filename, mode);
    295   if (nbfd->iostream == NULL)
    296     {
    297       bfd_set_error (bfd_error_system_call);
    298       if (fd != -1)
    299 	close (fd);
    300       _bfd_delete_bfd (nbfd);
    301       return NULL;
    302     }
    303 
    304   /* OK, put everything where it belongs.  */
    305 
    306   /* PR 11983: Do not cache the original filename, but
    307      rather make a copy - the original might go away.  */
    308   if (!bfd_set_filename (nbfd, filename))
    309     {
    310       fclose (nbfd->iostream);
    311       _bfd_delete_bfd (nbfd);
    312       return NULL;
    313     }
    314 
    315   /* Figure out whether the user is opening the file for reading,
    316      writing, or both, by looking at the MODE argument.  */
    317   if ((mode[0] == 'r' || mode[0] == 'w' || mode[0] == 'a')
    318       && mode[1] == '+')
    319     nbfd->direction = both_direction;
    320   else if (mode[0] == 'r')
    321     nbfd->direction = read_direction;
    322   else
    323     nbfd->direction = write_direction;
    324 
    325   if (!bfd_cache_init (nbfd))
    326     {
    327       fclose (nbfd->iostream);
    328       _bfd_delete_bfd (nbfd);
    329       return NULL;
    330     }
    331   nbfd->opened_once = true;
    332 
    333   /* If we opened the file by name, mark it cacheable; we can close it
    334      and reopen it later.  However, if a file descriptor was provided,
    335      then it may have been opened with special flags that make it
    336      unsafe to close and reopen the file.  */
    337   if (fd == -1)
    338     (void) bfd_set_cacheable (nbfd, true);
    339 
    340   return nbfd;
    341 }
    342 
    343 /*
    344 FUNCTION
    345 	bfd_openr
    346 
    347 SYNOPSIS
    348 	bfd *bfd_openr (const char *filename, const char *target);
    349 
    350 DESCRIPTION
    351 	Open the file @var{filename} (using <<fopen>>) with the target
    352 	@var{target}.  Return a pointer to the created BFD.
    353 
    354 	Calls <<bfd_find_target>>, so @var{target} is interpreted as by
    355 	that function.
    356 
    357 	If <<NULL>> is returned then an error has occured.   Possible errors
    358 	are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or
    359 	<<system_call>> error.
    360 
    361 	A copy of the @var{filename} argument is stored in the newly created
    362 	BFD.  It can be accessed via the bfd_get_filename() macro.
    363 */
    364 
    365 bfd *
    366 bfd_openr (const char *filename, const char *target)
    367 {
    368   return bfd_fopen (filename, target, FOPEN_RB, -1);
    369 }
    370 
    371 /* Don't try to `optimize' this function:
    372 
    373    o - We lock using stack space so that interrupting the locking
    374        won't cause a storage leak.
    375    o - We open the file stream last, since we don't want to have to
    376        close it if anything goes wrong.  Closing the stream means closing
    377        the file descriptor too, even though we didn't open it.  */
    378 /*
    379 FUNCTION
    380 	bfd_fdopenr
    381 
    382 SYNOPSIS
    383 	bfd *bfd_fdopenr (const char *filename, const char *target, int fd);
    384 
    385 DESCRIPTION
    386 	<<bfd_fdopenr>> is to <<bfd_fopenr>> much like <<fdopen>> is to
    387 	<<fopen>>.  It opens a BFD on a file already described by the
    388 	@var{fd} supplied.
    389 
    390 	When the file is later <<bfd_close>>d, the file descriptor will
    391 	be closed.  If the caller desires that this file descriptor be
    392 	cached by BFD (opened as needed, closed as needed to free
    393 	descriptors for other opens), with the supplied @var{fd} used as
    394 	an initial file descriptor (but subject to closure at any time),
    395 	call bfd_set_cacheable(bfd, 1) on the returned BFD.  The default
    396 	is to assume no caching; the file descriptor will remain open
    397 	until <<bfd_close>>, and will not be affected by BFD operations
    398 	on other files.
    399 
    400 	Possible errors are <<bfd_error_no_memory>>,
    401 	<<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
    402 
    403 	On error, @var{fd} is closed.
    404 
    405 	A copy of the @var{filename} argument is stored in the newly created
    406 	BFD.  It can be accessed via the bfd_get_filename() macro.
    407 */
    408 
    409 bfd *
    410 bfd_fdopenr (const char *filename, const char *target, int fd)
    411 {
    412   const char *mode;
    413 #if defined(HAVE_FCNTL) && defined(F_GETFL)
    414   int fdflags;
    415 #endif
    416 
    417 #if ! defined(HAVE_FCNTL) || ! defined(F_GETFL)
    418   mode = FOPEN_RUB; /* Assume full access.  */
    419 #else
    420   fdflags = fcntl (fd, F_GETFL, NULL);
    421   if (fdflags == -1)
    422     {
    423       int save = errno;
    424 
    425       close (fd);
    426       errno = save;
    427       bfd_set_error (bfd_error_system_call);
    428       return NULL;
    429     }
    430 
    431   /* (O_ACCMODE) parens are to avoid Ultrix header file bug.  */
    432   switch (fdflags & (O_ACCMODE))
    433     {
    434     case O_RDONLY: mode = FOPEN_RB; break;
    435     case O_WRONLY: mode = FOPEN_RUB; break;
    436     case O_RDWR:   mode = FOPEN_RUB; break;
    437     default: abort ();
    438     }
    439 #endif
    440 
    441   return bfd_fopen (filename, target, mode, fd);
    442 }
    443 
    444 /*
    445 FUNCTION
    446 	bfd_fdopenw
    447 
    448 SYNOPSIS
    449 	bfd *bfd_fdopenw (const char *filename, const char *target, int fd);
    450 
    451 DESCRIPTION
    452 	<<bfd_fdopenw>> is exactly like <<bfd_fdopenr>> with the exception that
    453 	the resulting BFD is suitable for output.
    454 */
    455 
    456 bfd *
    457 bfd_fdopenw (const char *filename, const char *target, int fd)
    458 {
    459   bfd *out = bfd_fdopenr (filename, target, fd);
    460 
    461   if (out != NULL)
    462     {
    463       if (!bfd_write_p (out))
    464 	{
    465 	  close (fd);
    466 	  _bfd_delete_bfd (out);
    467 	  out = NULL;
    468 	  bfd_set_error (bfd_error_invalid_operation);
    469 	}
    470       else
    471 	out->direction = write_direction;
    472     }
    473 
    474   return out;
    475 }
    476 
    477 /*
    478 FUNCTION
    479 	bfd_openstreamr
    480 
    481 SYNOPSIS
    482 	bfd *bfd_openstreamr (const char * filename, const char * target,
    483 			      void * stream);
    484 
    485 DESCRIPTION
    486 	Open a BFD for read access on an existing stdio stream.  When
    487 	the BFD is passed to <<bfd_close>>, the stream will be closed.
    488 
    489 	A copy of the @var{filename} argument is stored in the newly created
    490 	BFD.  It can be accessed via the bfd_get_filename() macro.
    491 */
    492 
    493 bfd *
    494 bfd_openstreamr (const char *filename, const char *target, void *streamarg)
    495 {
    496   FILE *stream = (FILE *) streamarg;
    497   bfd *nbfd;
    498   const bfd_target *target_vec;
    499 
    500   nbfd = _bfd_new_bfd ();
    501   if (nbfd == NULL)
    502     return NULL;
    503 
    504   target_vec = bfd_find_target (target, nbfd);
    505   if (target_vec == NULL)
    506     {
    507       _bfd_delete_bfd (nbfd);
    508       return NULL;
    509     }
    510 
    511   nbfd->iostream = stream;
    512   /* PR 11983: Do not cache the original filename, but
    513      rather make a copy - the original might go away.  */
    514   if (!bfd_set_filename (nbfd, filename))
    515     {
    516       _bfd_delete_bfd (nbfd);
    517       return NULL;
    518     }
    519   nbfd->direction = read_direction;
    520 
    521   if (! bfd_cache_init (nbfd))
    522     {
    523       _bfd_delete_bfd (nbfd);
    524       return NULL;
    525     }
    526 
    527   return nbfd;
    528 }
    529 
    530 /*
    531 FUNCTION
    532 	bfd_openr_iovec
    533 
    534 SYNOPSIS
    535 	bfd *bfd_openr_iovec (const char *filename, const char *target,
    536 			      void *(*open_func) (struct bfd *nbfd,
    537 						  void *open_closure),
    538 			      void *open_closure,
    539 			      file_ptr (*pread_func) (struct bfd *nbfd,
    540 						      void *stream,
    541 						      void *buf,
    542 						      file_ptr nbytes,
    543 						      file_ptr offset),
    544 			      int (*close_func) (struct bfd *nbfd,
    545 						 void *stream),
    546 			      int (*stat_func) (struct bfd *abfd,
    547 						void *stream,
    548 						struct stat *sb));
    549 
    550 DESCRIPTION
    551 	Create and return a BFD backed by a read-only @var{stream}.
    552 	The @var{stream} is created using @var{open_func}, accessed using
    553 	@var{pread_func} and destroyed using @var{close_func}.
    554 
    555 	Calls <<bfd_find_target>>, so @var{target} is interpreted as by
    556 	that function.
    557 
    558 	Calls @var{open_func} (which can call <<bfd_zalloc>> and
    559 	<<bfd_get_filename>>) to obtain the read-only stream backing
    560 	the BFD.  @var{open_func} either succeeds returning the
    561 	non-<<NULL>> @var{stream}, or fails returning <<NULL>>
    562 	(setting <<bfd_error>>).
    563 
    564 	Calls @var{pread_func} to request @var{nbytes} of data from
    565 	@var{stream} starting at @var{offset} (e.g., via a call to
    566 	<<bfd_read>>).  @var{pread_func} either succeeds returning the
    567 	number of bytes read (which can be less than @var{nbytes} when
    568 	end-of-file), or fails returning -1 (setting <<bfd_error>>).
    569 
    570 	Calls @var{close_func} when the BFD is later closed using
    571 	<<bfd_close>>.  @var{close_func} either succeeds returning 0, or
    572 	fails returning -1 (setting <<bfd_error>>).
    573 
    574 	Calls @var{stat_func} to fill in a stat structure for bfd_stat,
    575 	bfd_get_size, and bfd_get_mtime calls.  @var{stat_func} returns 0
    576 	on success, or returns -1 on failure (setting <<bfd_error>>).
    577 
    578 	If <<bfd_openr_iovec>> returns <<NULL>> then an error has
    579 	occurred.  Possible errors are <<bfd_error_no_memory>>,
    580 	<<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
    581 
    582 	A copy of the @var{filename} argument is stored in the newly created
    583 	BFD.  It can be accessed via the bfd_get_filename() macro.
    584 */
    585 
    586 struct opncls
    587 {
    588   void *stream;
    589   file_ptr (*pread) (struct bfd *abfd, void *stream, void *buf,
    590 		     file_ptr nbytes, file_ptr offset);
    591   int (*close) (struct bfd *abfd, void *stream);
    592   int (*stat) (struct bfd *abfd, void *stream, struct stat *sb);
    593   file_ptr where;
    594 };
    595 
    596 static file_ptr
    597 opncls_btell (struct bfd *abfd)
    598 {
    599   struct opncls *vec = (struct opncls *) abfd->iostream;
    600   return vec->where;
    601 }
    602 
    603 static int
    604 opncls_bseek (struct bfd *abfd, file_ptr offset, int whence)
    605 {
    606   struct opncls *vec = (struct opncls *) abfd->iostream;
    607   switch (whence)
    608     {
    609     case SEEK_SET: vec->where = offset; break;
    610     case SEEK_CUR: vec->where += offset; break;
    611     case SEEK_END: return -1;
    612     }
    613   return 0;
    614 }
    615 
    616 static file_ptr
    617 opncls_bread (struct bfd *abfd, void *buf, file_ptr nbytes)
    618 {
    619   struct opncls *vec = (struct opncls *) abfd->iostream;
    620   file_ptr nread = (vec->pread) (abfd, vec->stream, buf, nbytes, vec->where);
    621 
    622   if (nread < 0)
    623     return nread;
    624   vec->where += nread;
    625   return nread;
    626 }
    627 
    628 static file_ptr
    629 opncls_bwrite (struct bfd *abfd ATTRIBUTE_UNUSED,
    630 	      const void *where ATTRIBUTE_UNUSED,
    631 	      file_ptr nbytes ATTRIBUTE_UNUSED)
    632 {
    633   return -1;
    634 }
    635 
    636 static int
    637 opncls_bclose (struct bfd *abfd)
    638 {
    639   struct opncls *vec = (struct opncls *) abfd->iostream;
    640   /* Since the VEC's memory is bound to the bfd deleting the bfd will
    641      free it.  */
    642   int status = 0;
    643 
    644   if (vec->close != NULL)
    645     status = (vec->close) (abfd, vec->stream);
    646   abfd->iostream = NULL;
    647   return status;
    648 }
    649 
    650 static int
    651 opncls_bflush (struct bfd *abfd ATTRIBUTE_UNUSED)
    652 {
    653   return 0;
    654 }
    655 
    656 static int
    657 opncls_bstat (struct bfd *abfd, struct stat *sb)
    658 {
    659   struct opncls *vec = (struct opncls *) abfd->iostream;
    660 
    661   memset (sb, 0, sizeof (*sb));
    662   if (vec->stat == NULL)
    663     return 0;
    664 
    665   return (vec->stat) (abfd, vec->stream, sb);
    666 }
    667 
    668 static void *
    669 opncls_bmmap (struct bfd *abfd ATTRIBUTE_UNUSED,
    670 	      void *addr ATTRIBUTE_UNUSED,
    671 	      bfd_size_type len ATTRIBUTE_UNUSED,
    672 	      int prot ATTRIBUTE_UNUSED,
    673 	      int flags ATTRIBUTE_UNUSED,
    674 	      file_ptr offset ATTRIBUTE_UNUSED,
    675 	      void **map_addr ATTRIBUTE_UNUSED,
    676 	      bfd_size_type *map_len ATTRIBUTE_UNUSED)
    677 {
    678   return (void *) -1;
    679 }
    680 
    681 static const struct bfd_iovec opncls_iovec =
    682 {
    683   &opncls_bread, &opncls_bwrite, &opncls_btell, &opncls_bseek,
    684   &opncls_bclose, &opncls_bflush, &opncls_bstat, &opncls_bmmap
    685 };
    686 
    687 bfd *
    688 bfd_openr_iovec (const char *filename, const char *target,
    689 		 void *(*open_p) (struct bfd *, void *),
    690 		 void *open_closure,
    691 		 file_ptr (*pread_p) (struct bfd *, void *, void *,
    692 				      file_ptr, file_ptr),
    693 		 int (*close_p) (struct bfd *, void *),
    694 		 int (*stat_p) (struct bfd *, void *, struct stat *))
    695 {
    696   bfd *nbfd;
    697   const bfd_target *target_vec;
    698   struct opncls *vec;
    699   void *stream;
    700 
    701   nbfd = _bfd_new_bfd ();
    702   if (nbfd == NULL)
    703     return NULL;
    704 
    705   target_vec = bfd_find_target (target, nbfd);
    706   if (target_vec == NULL)
    707     {
    708       _bfd_delete_bfd (nbfd);
    709       return NULL;
    710     }
    711 
    712   /* PR 11983: Do not cache the original filename, but
    713      rather make a copy - the original might go away.  */
    714   if (!bfd_set_filename (nbfd, filename))
    715     {
    716       _bfd_delete_bfd (nbfd);
    717       return NULL;
    718     }
    719   nbfd->direction = read_direction;
    720 
    721   /* `open_p (...)' would get expanded by an the open(2) syscall macro.  */
    722   stream = (*open_p) (nbfd, open_closure);
    723   if (stream == NULL)
    724     {
    725       _bfd_delete_bfd (nbfd);
    726       return NULL;
    727     }
    728 
    729   vec = (struct opncls *) bfd_zalloc (nbfd, sizeof (struct opncls));
    730   vec->stream = stream;
    731   vec->pread = pread_p;
    732   vec->close = close_p;
    733   vec->stat = stat_p;
    734 
    735   nbfd->iovec = &opncls_iovec;
    736   nbfd->iostream = vec;
    737 
    738   return nbfd;
    739 }
    740 
    741 /* bfd_openw -- open for writing.
    743    Returns a pointer to a freshly-allocated BFD on success, or NULL.
    744 
    745    See comment by bfd_fdopenr before you try to modify this function.  */
    746 
    747 /*
    748 FUNCTION
    749 	bfd_openw
    750 
    751 SYNOPSIS
    752 	bfd *bfd_openw (const char *filename, const char *target);
    753 
    754 DESCRIPTION
    755 	Create a BFD, associated with file @var{filename}, using the
    756 	file format @var{target}, and return a pointer to it.
    757 
    758 	Possible errors are <<bfd_error_system_call>>, <<bfd_error_no_memory>>,
    759 	<<bfd_error_invalid_target>>.
    760 
    761 	A copy of the @var{filename} argument is stored in the newly created
    762 	BFD.  It can be accessed via the bfd_get_filename() macro.
    763 */
    764 
    765 bfd *
    766 bfd_openw (const char *filename, const char *target)
    767 {
    768   bfd *nbfd;
    769   const bfd_target *target_vec;
    770 
    771   /* nbfd has to point to head of malloc'ed block so that bfd_close may
    772      reclaim it correctly.  */
    773   nbfd = _bfd_new_bfd ();
    774   if (nbfd == NULL)
    775     return NULL;
    776 
    777   target_vec = bfd_find_target (target, nbfd);
    778   if (target_vec == NULL)
    779     {
    780       _bfd_delete_bfd (nbfd);
    781       return NULL;
    782     }
    783 
    784   /* PR 11983: Do not cache the original filename, but
    785      rather make a copy - the original might go away.  */
    786   if (!bfd_set_filename (nbfd, filename))
    787     {
    788       _bfd_delete_bfd (nbfd);
    789       return NULL;
    790     }
    791   nbfd->direction = write_direction;
    792 
    793   if (bfd_open_file (nbfd) == NULL)
    794     {
    795       /* File not writeable, etc.  */
    796       bfd_set_error (bfd_error_system_call);
    797       _bfd_delete_bfd (nbfd);
    798       return NULL;
    799   }
    800 
    801   return nbfd;
    802 }
    803 
    804 /*
    805 FUNCTION
    806 	bfd_elf_bfd_from_remote_memory
    807 
    808 SYNOPSIS
    809 	bfd *bfd_elf_bfd_from_remote_memory
    810 	  (bfd *templ, bfd_vma ehdr_vma, bfd_size_type size, bfd_vma *loadbasep,
    811 	   int (*target_read_memory)
    812 	     (bfd_vma vma, bfd_byte *myaddr, bfd_size_type len));
    813 
    814 DESCRIPTION
    815 	Create a new BFD as if by bfd_openr.  Rather than opening a
    816 	file, reconstruct an ELF file by reading the segments out of
    817 	remote memory based on the ELF file header at EHDR_VMA and the
    818 	ELF program headers it points to.  If non-zero, SIZE is the
    819 	known extent of the object.  If not null, *LOADBASEP is filled
    820 	in with the difference between the VMAs from which the
    821 	segments were read, and the VMAs the file headers (and hence
    822 	BFD's idea of each section's VMA) put them at.
    823 
    824 	The function TARGET_READ_MEMORY is called to copy LEN bytes
    825 	from the remote memory at target address VMA into the local
    826 	buffer at MYADDR; it should return zero on success or an
    827 	errno code on failure.  TEMPL must be a BFD for an ELF
    828 	target with the word size and byte order found in the remote
    829 	memory.
    830 */
    831 
    832 bfd *
    833 bfd_elf_bfd_from_remote_memory
    834   (bfd *templ,
    835    bfd_vma ehdr_vma,
    836    bfd_size_type size,
    837    bfd_vma *loadbasep,
    838    int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
    839 {
    840   if (bfd_get_flavour (templ) != bfd_target_elf_flavour)
    841     {
    842       bfd_set_error (bfd_error_invalid_operation);
    843       return NULL;
    844     }
    845   return (*get_elf_backend_data (templ)->elf_backend_bfd_from_remote_memory)
    846     (templ, ehdr_vma, size, loadbasep, target_read_memory);
    847 }
    848 
    849 static inline void
    850 _maybe_make_executable (bfd * abfd)
    851 {
    852   /* If the file was open for writing and is now executable,
    853      make it so.  */
    854   if (abfd->direction == write_direction
    855       && (abfd->flags & (EXEC_P | DYNAMIC)) != 0)
    856     {
    857       struct stat buf;
    858 
    859       if (stat (bfd_get_filename (abfd), &buf) == 0
    860 	  /* Do not attempt to change non-regular files.  This is
    861 	     here especially for configure scripts and kernel builds
    862 	     which run tests with "ld [...] -o /dev/null".  */
    863 	  && S_ISREG(buf.st_mode))
    864 	{
    865 	  unsigned int mask = umask (0);
    866 
    867 	  umask (mask);
    868 	  chmod (bfd_get_filename (abfd),
    869 		 (0777
    870 		  & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
    871 	}
    872     }
    873 }
    874 
    875 /*
    876 FUNCTION
    877 	bfd_close
    878 
    879 SYNOPSIS
    880 	bool bfd_close (bfd *abfd);
    881 
    882 DESCRIPTION
    883 	Close a BFD. If the BFD was open for writing, then pending
    884 	operations are completed and the file written out and closed.
    885 	If the created file is executable, then <<chmod>> is called
    886 	to mark it as such.
    887 
    888 	All memory attached to the BFD is released.
    889 
    890 	The file descriptor associated with the BFD is closed (even
    891 	if it was passed in to BFD by <<bfd_fdopenr>>).
    892 
    893 	<<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
    894 */
    895 
    896 bool
    897 bfd_close (bfd *abfd)
    898 {
    899   bool ret = (!bfd_write_p (abfd)
    900 	      || BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)));
    901 
    902   return bfd_close_all_done (abfd) && ret;
    903 }
    904 
    905 /*
    906 FUNCTION
    907 	bfd_close_all_done
    908 
    909 SYNOPSIS
    910 	bool bfd_close_all_done (bfd *);
    911 
    912 DESCRIPTION
    913 	Close a BFD.  Differs from <<bfd_close>> since it does not
    914 	complete any pending operations.  This routine would be used
    915 	if the application had just used BFD for swapping and didn't
    916 	want to use any of the writing code.
    917 
    918 	If the created file is executable, then <<chmod>> is called
    919 	to mark it as such.
    920 
    921 	All memory attached to the BFD is released.
    922 
    923 	<<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
    924 */
    925 
    926 bool
    927 bfd_close_all_done (bfd *abfd)
    928 {
    929   bool ret = BFD_SEND (abfd, _close_and_cleanup, (abfd));
    930 
    931   if (abfd->iovec != NULL)
    932     ret &= abfd->iovec->bclose (abfd) == 0;
    933 
    934   if (ret)
    935     _maybe_make_executable (abfd);
    936 
    937   _bfd_delete_bfd (abfd);
    938   _bfd_clear_error_data ();
    939 
    940   return ret;
    941 }
    942 
    943 /*
    944 FUNCTION
    945 	bfd_create
    946 
    947 SYNOPSIS
    948 	bfd *bfd_create (const char *filename, bfd *templ);
    949 
    950 DESCRIPTION
    951 	Create a new BFD in the manner of <<bfd_openw>>, but without
    952 	opening a file. The new BFD takes the target from the target
    953 	used by @var{templ}. The format is always set to <<bfd_object>>.
    954 
    955 	A copy of the @var{filename} argument is stored in the newly created
    956 	BFD.  It can be accessed via the bfd_get_filename() macro.
    957 */
    958 
    959 bfd *
    960 bfd_create (const char *filename, bfd *templ)
    961 {
    962   bfd *nbfd;
    963 
    964   nbfd = _bfd_new_bfd ();
    965   if (nbfd == NULL)
    966     return NULL;
    967   /* PR 11983: Do not cache the original filename, but
    968      rather make a copy - the original might go away.  */
    969   if (!bfd_set_filename (nbfd, filename))
    970     {
    971       _bfd_delete_bfd (nbfd);
    972       return NULL;
    973     }
    974   if (templ)
    975     nbfd->xvec = templ->xvec;
    976   nbfd->direction = no_direction;
    977   bfd_set_format (nbfd, bfd_object);
    978 
    979   return nbfd;
    980 }
    981 
    982 /*
    983 FUNCTION
    984 	bfd_make_writable
    985 
    986 SYNOPSIS
    987 	bool bfd_make_writable (bfd *abfd);
    988 
    989 DESCRIPTION
    990 	Takes a BFD as created by <<bfd_create>> and converts it
    991 	into one like as returned by <<bfd_openw>>.  It does this
    992 	by converting the BFD to BFD_IN_MEMORY.  It's assumed that
    993 	you will call <<bfd_make_readable>> on this bfd later.
    994 
    995 	<<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
    996 */
    997 
    998 bool
    999 bfd_make_writable (bfd *abfd)
   1000 {
   1001   struct bfd_in_memory *bim;
   1002 
   1003   if (abfd->direction != no_direction)
   1004     {
   1005       bfd_set_error (bfd_error_invalid_operation);
   1006       return false;
   1007     }
   1008 
   1009   bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory));
   1010   if (bim == NULL)
   1011     return false;	/* bfd_error already set.  */
   1012   abfd->iostream = bim;
   1013   /* bfd_write will grow these as needed.  */
   1014   bim->size = 0;
   1015   bim->buffer = 0;
   1016 
   1017   abfd->flags |= BFD_IN_MEMORY;
   1018   abfd->iovec = &_bfd_memory_iovec;
   1019   abfd->origin = 0;
   1020   abfd->direction = write_direction;
   1021   abfd->where = 0;
   1022 
   1023   return true;
   1024 }
   1025 
   1026 /*
   1027 FUNCTION
   1028 	bfd_make_readable
   1029 
   1030 SYNOPSIS
   1031 	bool bfd_make_readable (bfd *abfd);
   1032 
   1033 DESCRIPTION
   1034 	Takes a BFD as created by <<bfd_create>> and
   1035 	<<bfd_make_writable>> and converts it into one like as
   1036 	returned by <<bfd_openr>>.  It does this by writing the
   1037 	contents out to the memory buffer, then reversing the
   1038 	direction.
   1039 
   1040 	<<TRUE>> is returned if all is ok, otherwise <<FALSE>>.  */
   1041 
   1042 bool
   1043 bfd_make_readable (bfd *abfd)
   1044 {
   1045   if (abfd->direction != write_direction || !(abfd->flags & BFD_IN_MEMORY))
   1046     {
   1047       bfd_set_error (bfd_error_invalid_operation);
   1048       return false;
   1049     }
   1050 
   1051   if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
   1052     return false;
   1053 
   1054   if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
   1055     return false;
   1056 
   1057   abfd->arch_info = &bfd_default_arch_struct;
   1058 
   1059   abfd->where = 0;
   1060   abfd->format = bfd_unknown;
   1061   abfd->my_archive = NULL;
   1062   abfd->origin = 0;
   1063   abfd->opened_once = false;
   1064   abfd->output_has_begun = false;
   1065   abfd->section_count = 0;
   1066   abfd->usrdata = NULL;
   1067   abfd->cacheable = false;
   1068   abfd->mtime_set = false;
   1069 
   1070   abfd->target_defaulted = true;
   1071   abfd->direction = read_direction;
   1072   abfd->sections = 0;
   1073   abfd->symcount = 0;
   1074   abfd->outsymbols = 0;
   1075   abfd->tdata.any = 0;
   1076   abfd->size = 0;
   1077 
   1078   bfd_section_list_clear (abfd);
   1079   bfd_check_format (abfd, bfd_object);
   1080 
   1081   return true;
   1082 }
   1083 
   1084 /*
   1085    GNU Extension: separate debug-info files
   1086 
   1087    The idea here is that a special section called .gnu_debuglink might be
   1088    embedded in a binary file, which indicates that some *other* file
   1089    contains the real debugging information. This special section contains a
   1090    filename and CRC32 checksum, which we read and resolve to another file,
   1091    if it exists.
   1092 
   1093    This facilitates "optional" provision of debugging information, without
   1094    having to provide two complete copies of every binary object (with and
   1095    without debug symbols).  */
   1096 
   1097 #define GNU_DEBUGLINK		".gnu_debuglink"
   1098 #define GNU_DEBUGALTLINK	".gnu_debugaltlink"
   1099 
   1100 /*
   1101 FUNCTION
   1102 	bfd_calc_gnu_debuglink_crc32
   1103 
   1104 SYNOPSIS
   1105 	uint32_t bfd_calc_gnu_debuglink_crc32
   1106 	  (uint32_t crc, const bfd_byte *buf, bfd_size_type len);
   1107 
   1108 DESCRIPTION
   1109 	Computes a CRC value as used in the .gnu_debuglink section.
   1110 	Advances the previously computed @var{crc} value by computing
   1111 	and adding in the crc32 for @var{len} bytes of @var{buf}.
   1112 
   1113 	Return the updated CRC32 value.
   1114 */
   1115 
   1116 uint32_t
   1117 bfd_calc_gnu_debuglink_crc32 (uint32_t crc,
   1118 			      const bfd_byte *buf,
   1119 			      bfd_size_type len)
   1120 {
   1121   static const uint32_t crc32_table[256] =
   1122     {
   1123       0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
   1124       0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
   1125       0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
   1126       0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
   1127       0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
   1128       0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
   1129       0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
   1130       0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
   1131       0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
   1132       0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
   1133       0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
   1134       0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
   1135       0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
   1136       0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
   1137       0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
   1138       0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
   1139       0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
   1140       0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
   1141       0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
   1142       0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
   1143       0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
   1144       0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
   1145       0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
   1146       0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
   1147       0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
   1148       0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
   1149       0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
   1150       0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
   1151       0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
   1152       0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
   1153       0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
   1154       0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
   1155       0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
   1156       0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
   1157       0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
   1158       0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
   1159       0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
   1160       0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
   1161       0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
   1162       0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
   1163       0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
   1164       0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
   1165       0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
   1166       0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
   1167       0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
   1168       0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
   1169       0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
   1170       0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
   1171       0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
   1172       0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
   1173       0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
   1174       0x2d02ef8d
   1175     };
   1176   const bfd_byte *end;
   1177 
   1178   crc = ~crc & 0xffffffff;
   1179   for (end = buf + len; buf < end; ++ buf)
   1180     crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
   1181   return ~crc & 0xffffffff;
   1182 }
   1183 
   1184 
   1185 /* Extracts the filename and CRC32 value for any separate debug
   1186    information file associated with @var{abfd}.
   1187 
   1188    The @var{crc32_out} parameter is an untyped pointer because
   1189    this routine is used as a @code{get_func_type} function, but it
   1190    is expected to be a uint32_t pointer.
   1191 
   1192    Returns the filename of the associated debug information file,
   1193    or NULL if there is no such file.  If the filename was found
   1194    then the contents of @var{crc32_out} are updated to hold the
   1195    corresponding CRC32 value for the file.
   1196 
   1197    The returned filename is allocated with @code{malloc}; freeing
   1198    it is the responsibility of the caller.  */
   1199 
   1200 static char *
   1201 bfd_get_debug_link_info_1 (bfd *abfd, void *crc32_out)
   1202 {
   1203   asection *sect;
   1204   uint32_t *crc32 = crc32_out;
   1205   bfd_byte *contents;
   1206   unsigned int crc_offset;
   1207   char *name;
   1208   bfd_size_type size;
   1209 
   1210   BFD_ASSERT (abfd);
   1211   BFD_ASSERT (crc32_out);
   1212 
   1213   sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
   1214 
   1215   if (sect == NULL || (sect->flags & SEC_HAS_CONTENTS) == 0)
   1216     return NULL;
   1217 
   1218   size = bfd_section_size (sect);
   1219 
   1220   /* PR 22794: Make sure that the section has a reasonable size.  */
   1221   if (size < 8)
   1222     return NULL;
   1223 
   1224   if (!bfd_malloc_and_get_section (abfd, sect, &contents))
   1225     return NULL;
   1226 
   1227   /* CRC value is stored after the filename, aligned up to 4 bytes.  */
   1228   name = (char *) contents;
   1229   /* PR 17597: Avoid reading off the end of the buffer.  */
   1230   crc_offset = strnlen (name, size) + 1;
   1231   crc_offset = (crc_offset + 3) & ~3;
   1232   if (crc_offset + 4 > size)
   1233     {
   1234       free (name);
   1235       return NULL;
   1236     }
   1237 
   1238   *crc32 = bfd_get_32 (abfd, contents + crc_offset);
   1239   return name;
   1240 }
   1241 
   1242 
   1243 /*
   1244 FUNCTION
   1245 	bfd_get_debug_link_info
   1246 
   1247 SYNOPSIS
   1248 	char *bfd_get_debug_link_info (bfd *abfd, uint32_t *crc32_out);
   1249 
   1250 DESCRIPTION
   1251 	Extracts the filename and CRC32 value for any separate debug
   1252 	information file associated with @var{abfd}.
   1253 
   1254 	Returns the filename of the associated debug information file,
   1255 	or NULL if there is no such file.  If the filename was found
   1256 	then the contents of @var{crc32_out} are updated to hold the
   1257 	corresponding CRC32 value for the file.
   1258 
   1259 	The returned filename is allocated with @code{malloc}; freeing
   1260 	it is the responsibility of the caller.
   1261 */
   1262 
   1263 char *
   1264 bfd_get_debug_link_info (bfd *abfd, uint32_t *crc32_out)
   1265 {
   1266   return bfd_get_debug_link_info_1 (abfd, crc32_out);
   1267 }
   1268 
   1269 /*
   1270 FUNCTION
   1271 	bfd_get_alt_debug_link_info
   1272 
   1273 SYNOPSIS
   1274 	char *bfd_get_alt_debug_link_info (bfd * abfd,
   1275 					   bfd_size_type *buildid_len,
   1276 					   bfd_byte **buildid_out);
   1277 
   1278 DESCRIPTION
   1279 	Fetch the filename and BuildID value for any alternate debuginfo
   1280 	associated with @var{abfd}.  Return NULL if no such info found,
   1281 	otherwise return filename and update @var{buildid_len} and
   1282 	@var{buildid_out}.  The returned filename and build_id are
   1283 	allocated with @code{malloc}; freeing them is the responsibility
   1284 	of the caller.
   1285 */
   1286 
   1287 char *
   1288 bfd_get_alt_debug_link_info (bfd * abfd, bfd_size_type *buildid_len,
   1289 			     bfd_byte **buildid_out)
   1290 {
   1291   asection *sect;
   1292   bfd_byte *contents;
   1293   unsigned int buildid_offset;
   1294   char *name;
   1295   bfd_size_type size;
   1296 
   1297   BFD_ASSERT (abfd);
   1298   BFD_ASSERT (buildid_len);
   1299   BFD_ASSERT (buildid_out);
   1300 
   1301   sect = bfd_get_section_by_name (abfd, GNU_DEBUGALTLINK);
   1302 
   1303   if (sect == NULL || (sect->flags & SEC_HAS_CONTENTS) == 0)
   1304     return NULL;
   1305 
   1306   size = bfd_section_size (sect);
   1307   if (size < 8)
   1308     return NULL;
   1309 
   1310   if (!bfd_malloc_and_get_section (abfd, sect, & contents))
   1311     return NULL;
   1312 
   1313   /* BuildID value is stored after the filename.  */
   1314   name = (char *) contents;
   1315   buildid_offset = strnlen (name, size) + 1;
   1316   if (buildid_offset >= bfd_section_size (sect))
   1317     return NULL;
   1318 
   1319   *buildid_len = size - buildid_offset;
   1320   *buildid_out = bfd_malloc (*buildid_len);
   1321   memcpy (*buildid_out, contents + buildid_offset, *buildid_len);
   1322 
   1323   return name;
   1324 }
   1325 
   1326 /* Checks to see if @var{name} is a file and if its contents match
   1327    @var{crc32}, which is a pointer to a @code{uint32_t}
   1328    containing a CRC32.
   1329 
   1330    The @var{crc32_p} parameter is an untyped pointer because this
   1331    routine is used as a @code{check_func_type} function.  */
   1332 
   1333 static bool
   1334 separate_debug_file_exists (const char *name, void *crc32_p)
   1335 {
   1336   unsigned char buffer[8 * 1024];
   1337   uint32_t file_crc = 0;
   1338   FILE *f;
   1339   bfd_size_type count;
   1340   uint32_t crc;
   1341 
   1342   BFD_ASSERT (name);
   1343   BFD_ASSERT (crc32_p);
   1344 
   1345   crc = *(uint32_t *) crc32_p;
   1346 
   1347   f = _bfd_real_fopen (name, FOPEN_RB);
   1348   if (f == NULL)
   1349     return false;
   1350 
   1351   while ((count = fread (buffer, 1, sizeof (buffer), f)) > 0)
   1352     file_crc = bfd_calc_gnu_debuglink_crc32 (file_crc, buffer, count);
   1353 
   1354   fclose (f);
   1355 
   1356   return crc == file_crc;
   1357 }
   1358 
   1359 /* Checks to see if @var{name} is a file.  */
   1360 
   1361 static bool
   1362 separate_alt_debug_file_exists (const char *name, void *unused ATTRIBUTE_UNUSED)
   1363 {
   1364   FILE *f;
   1365 
   1366   BFD_ASSERT (name);
   1367 
   1368   f = _bfd_real_fopen (name, FOPEN_RB);
   1369   if (f == NULL)
   1370     return false;
   1371 
   1372   fclose (f);
   1373 
   1374   return true;
   1375 }
   1376 
   1377 /* Searches for a debug information file corresponding to @var{abfd}.
   1378 
   1379    The name of the separate debug info file is returned by the
   1380    @var{get} function.  This function scans various fixed locations
   1381    in the filesystem, including the file tree rooted at @var{dir}.
   1382    If the @var{include_dirs} parameter is true then the directory
   1383    components of @var{abfd}'s filename will be included in the
   1384    searched locations.
   1385 
   1386    @var{data} is passed unmodified to the @var{get} and @var{check}
   1387    functions.  It is generally used to implement build-id-like
   1388    matching in the callback functions.
   1389 
   1390    Returns the filename of the first file to be found which
   1391    receives a TRUE result from the @var{check} function.
   1392    Returns NULL if no valid file could be found.  */
   1393 
   1394 typedef char * (*get_func_type) (bfd *, void *);
   1395 typedef bool (*check_func_type) (const char *, void *);
   1396 
   1397 static char *
   1398 find_separate_debug_file (bfd *abfd,
   1399 			  const char *debug_file_directory,
   1400 			  bool include_dirs,
   1401 			  get_func_type get_func,
   1402 			  check_func_type check_func,
   1403 			  void *func_data)
   1404 {
   1405   char *base;
   1406   char *dir;
   1407   char *debugfile;
   1408   char *canon_dir;
   1409   size_t dirlen;
   1410   size_t canon_dirlen;
   1411 
   1412   BFD_ASSERT (abfd);
   1413   if (debug_file_directory == NULL)
   1414     debug_file_directory = ".";
   1415 
   1416   /* BFD may have been opened from a stream.  */
   1417   if (bfd_get_filename (abfd) == NULL)
   1418     {
   1419       bfd_set_error (bfd_error_invalid_operation);
   1420       return NULL;
   1421     }
   1422 
   1423   base = get_func (abfd, func_data);
   1424 
   1425   if (base == NULL)
   1426     return NULL;
   1427 
   1428   if (base[0] == '\0')
   1429     {
   1430       free (base);
   1431       bfd_set_error (bfd_error_no_debug_section);
   1432       return NULL;
   1433     }
   1434 
   1435   if (include_dirs)
   1436     {
   1437       const char *fname = bfd_get_filename (abfd);
   1438       for (dirlen = strlen (fname); dirlen > 0; dirlen--)
   1439 	if (IS_DIR_SEPARATOR (fname[dirlen - 1]))
   1440 	  break;
   1441 
   1442       dir = (char *) bfd_malloc (dirlen + 1);
   1443       if (dir == NULL)
   1444 	{
   1445 	  free (base);
   1446 	  return NULL;
   1447 	}
   1448       memcpy (dir, fname, dirlen);
   1449       dir[dirlen] = '\0';
   1450     }
   1451   else
   1452     {
   1453       dir = (char *) bfd_malloc (1);
   1454       * dir = 0;
   1455       dirlen = 0;
   1456     }
   1457 
   1458   /* Compute the canonical name of the bfd object with all symbolic links
   1459      resolved, for use in the global debugfile directory.  */
   1460   canon_dir = lrealpath (bfd_get_filename (abfd));
   1461   for (canon_dirlen = strlen (canon_dir); canon_dirlen > 0; canon_dirlen--)
   1462     if (IS_DIR_SEPARATOR (canon_dir[canon_dirlen - 1]))
   1463       break;
   1464   canon_dir[canon_dirlen] = '\0';
   1465 
   1466 #ifndef EXTRA_DEBUG_ROOT1
   1467 #define EXTRA_DEBUG_ROOT1 "/usr/lib/debug"
   1468 #endif
   1469 #ifndef EXTRA_DEBUG_ROOT2
   1470 #define EXTRA_DEBUG_ROOT2 "/usr/lib/debug/usr"
   1471 #endif
   1472 
   1473   debugfile = (char *)
   1474       bfd_malloc (strlen (debug_file_directory) + 1
   1475 		  + (canon_dirlen > dirlen ? canon_dirlen : dirlen)
   1476 		  + strlen (".debug/")
   1477 #ifdef EXTRA_DEBUG_ROOT1
   1478 		  + strlen (EXTRA_DEBUG_ROOT1)
   1479 #endif
   1480 #ifdef EXTRA_DEBUG_ROOT2
   1481 		  + strlen (EXTRA_DEBUG_ROOT2)
   1482 #endif
   1483 		  + strlen (base)
   1484 		  + 1);
   1485   if (debugfile == NULL)
   1486     goto found; /* Actually this returns NULL.  */
   1487 
   1488   /* First try in the same directory as the original file.
   1489 
   1490      FIXME: Strictly speaking if we are using the build-id method,
   1491      (ie include_dirs == FALSE) then we should only check absolute
   1492      paths, not relative ones like this one (and the next one).
   1493      The check is left in however as this allows the binutils
   1494      testsuite to exercise this feature without having to install
   1495      a file into the root filesystem.  (See binutils/testsuite/
   1496      binutils-all/objdump.exp for the test).  */
   1497   sprintf (debugfile, "%s%s", dir, base);
   1498   if (check_func (debugfile, func_data))
   1499     goto found;
   1500 
   1501   /* Then try in a subdirectory called .debug.  */
   1502   sprintf (debugfile, "%s.debug/%s", dir, base);
   1503   if (check_func (debugfile, func_data))
   1504     goto found;
   1505 
   1506 #ifdef EXTRA_DEBUG_ROOT1
   1507   /* Try the first extra debug file root.  */
   1508   sprintf (debugfile, "%s%s%s", EXTRA_DEBUG_ROOT1,
   1509 	   include_dirs ? canon_dir : "/", base);
   1510   if (check_func (debugfile, func_data))
   1511     goto found;
   1512 #endif
   1513 
   1514 #ifdef EXTRA_DEBUG_ROOT2
   1515   /* Try the second extra debug file root.  */
   1516   sprintf (debugfile, "%s%s%s", EXTRA_DEBUG_ROOT2,
   1517 	   include_dirs ? canon_dir : "/", base);
   1518   if (check_func (debugfile, func_data))
   1519     goto found;
   1520 #endif
   1521 
   1522   /* Then try in the global debugfile directory.  */
   1523   strcpy (debugfile, debug_file_directory);
   1524   dirlen = strlen (debug_file_directory) - 1;
   1525   if (include_dirs)
   1526     {
   1527       if (dirlen > 0
   1528 	  && debug_file_directory[dirlen] != '/'
   1529 	  && canon_dir[0] != '/')
   1530 	strcat (debugfile, "/");
   1531       strcat (debugfile, canon_dir);
   1532     }
   1533   else
   1534     {
   1535       if (dirlen > 0 && debug_file_directory[dirlen] != '/')
   1536 	strcat (debugfile, "/");
   1537     }
   1538   strcat (debugfile, base);
   1539 
   1540   if (check_func (debugfile, func_data))
   1541     goto found;
   1542 
   1543   /* Failed to find the file.  */
   1544   free (debugfile);
   1545   debugfile = NULL;
   1546 
   1547  found:
   1548   free (base);
   1549   free (dir);
   1550   free (canon_dir);
   1551   return debugfile;
   1552 }
   1553 
   1554 /*
   1555 FUNCTION
   1556 	bfd_follow_gnu_debuglink
   1557 
   1558 SYNOPSIS
   1559 	char *bfd_follow_gnu_debuglink (bfd *abfd, const char *dir);
   1560 
   1561 DESCRIPTION
   1562 	Takes a BFD and searches it for a .gnu_debuglink section.  If this
   1563 	section is found, it examines the section for the name and checksum
   1564 	of a '.debug' file containing auxiliary debugging information.  It
   1565 	then searches the filesystem for this .debug file in some standard
   1566 	locations, including the directory tree rooted at @var{dir}, and if
   1567 	found returns the full filename.
   1568 
   1569 	If @var{dir} is NULL, the search will take place starting at
   1570 	the current directory.
   1571 
   1572 	Returns <<NULL>> on any errors or failure to locate the .debug
   1573 	file, otherwise a pointer to a heap-allocated string
   1574 	containing the filename.  The caller is responsible for
   1575 	freeing this string.
   1576 */
   1577 
   1578 char *
   1579 bfd_follow_gnu_debuglink (bfd *abfd, const char *dir)
   1580 {
   1581   uint32_t crc32;
   1582 
   1583   return find_separate_debug_file (abfd, dir, true,
   1584 				   bfd_get_debug_link_info_1,
   1585 				   separate_debug_file_exists, &crc32);
   1586 }
   1587 
   1588 /* Helper for bfd_follow_gnu_debugaltlink.  It just returns the name
   1589    of the separate debug file.  */
   1590 
   1591 static char *
   1592 get_alt_debug_link_info_shim (bfd * abfd, void *unused ATTRIBUTE_UNUSED)
   1593 {
   1594   bfd_size_type len;
   1595   bfd_byte *buildid = NULL;
   1596   char *result = bfd_get_alt_debug_link_info (abfd, &len, &buildid);
   1597 
   1598   free (buildid);
   1599 
   1600   return result;
   1601 }
   1602 
   1603 /*
   1604 FUNCTION
   1605 	bfd_follow_gnu_debugaltlink
   1606 
   1607 SYNOPSIS
   1608 	char *bfd_follow_gnu_debugaltlink (bfd *abfd, const char *dir);
   1609 
   1610 DESCRIPTION
   1611 	Takes a BFD and searches it for a .gnu_debugaltlink section.  If this
   1612 	section is found, it examines the section for the name of a file
   1613 	containing auxiliary debugging information.  It then searches the
   1614 	filesystem for this file in a set of standard locations, including
   1615 	the directory tree rooted at @var{dir}, and if found returns the
   1616 	full filename.
   1617 
   1618 	If @var{dir} is NULL, the search will take place starting at
   1619 	the current directory.
   1620 
   1621 	Returns <<NULL>> on any errors or failure to locate the debug
   1622 	file, otherwise a pointer to a heap-allocated string
   1623 	containing the filename.  The caller is responsible for
   1624 	freeing this string.
   1625 */
   1626 
   1627 char *
   1628 bfd_follow_gnu_debugaltlink (bfd *abfd, const char *dir)
   1629 {
   1630   return find_separate_debug_file (abfd, dir, true,
   1631 				   get_alt_debug_link_info_shim,
   1632 				   separate_alt_debug_file_exists,
   1633 				   NULL);
   1634 }
   1635 
   1636 /*
   1637 FUNCTION
   1638 	bfd_create_gnu_debuglink_section
   1639 
   1640 SYNOPSIS
   1641 	struct bfd_section *bfd_create_gnu_debuglink_section
   1642 	  (bfd *abfd, const char *filename);
   1643 
   1644 DESCRIPTION
   1645 	Takes a @var{BFD} and adds a .gnu_debuglink section to it.  The
   1646 	section is sized to be big enough to contain a link to the specified
   1647 	@var{filename}.
   1648 
   1649 	A pointer to the new section is returned if all is ok.  Otherwise
   1650 	<<NULL>> is returned and bfd_error is set.
   1651 */
   1652 
   1653 asection *
   1654 bfd_create_gnu_debuglink_section (bfd *abfd, const char *filename)
   1655 {
   1656   asection *sect;
   1657   bfd_size_type debuglink_size;
   1658   flagword flags;
   1659 
   1660   if (abfd == NULL || filename == NULL)
   1661     {
   1662       bfd_set_error (bfd_error_invalid_operation);
   1663       return NULL;
   1664     }
   1665 
   1666   /* Strip off any path components in filename.  */
   1667   filename = lbasename (filename);
   1668 
   1669   sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
   1670   if (sect)
   1671     {
   1672       /* Section already exists.  */
   1673       bfd_set_error (bfd_error_invalid_operation);
   1674       return NULL;
   1675     }
   1676 
   1677   flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
   1678   sect = bfd_make_section_with_flags (abfd, GNU_DEBUGLINK, flags);
   1679   if (sect == NULL)
   1680     return NULL;
   1681 
   1682   /* Compute the size of the section.  Allow for the CRC after the filename,
   1683      and padding so that it will start on a 4-byte boundary.  */
   1684   debuglink_size = strlen (filename) + 1;
   1685   debuglink_size += 3;
   1686   debuglink_size &= ~3;
   1687   debuglink_size += 4;
   1688 
   1689   if (!bfd_set_section_size (sect, debuglink_size))
   1690     /* XXX Should we delete the section from the bfd ?  */
   1691     return NULL;
   1692 
   1693   /* PR 21193: Ensure that the section has 4-byte alignment for the CRC.
   1694      Note - despite the name of the function being called, we are
   1695      setting an alignment power, not a byte alignment value.  */
   1696   bfd_set_section_alignment (sect, 2);
   1697 
   1698   return sect;
   1699 }
   1700 
   1701 
   1702 /*
   1703 FUNCTION
   1704 	bfd_fill_in_gnu_debuglink_section
   1705 
   1706 SYNOPSIS
   1707 	bool bfd_fill_in_gnu_debuglink_section
   1708 	  (bfd *abfd, struct bfd_section *sect, const char *filename);
   1709 
   1710 DESCRIPTION
   1711 	Takes a @var{BFD} and containing a .gnu_debuglink section @var{SECT}
   1712 	and fills in the contents of the section to contain a link to the
   1713 	specified @var{filename}.  The filename should be absolute or
   1714 	relative to the current directory.
   1715 
   1716 	<<TRUE>> is returned if all is ok.  Otherwise <<FALSE>> is returned
   1717 	and bfd_error is set.
   1718 */
   1719 
   1720 bool
   1721 bfd_fill_in_gnu_debuglink_section (bfd *abfd,
   1722 				   struct bfd_section *sect,
   1723 				   const char *filename)
   1724 {
   1725   bfd_size_type debuglink_size;
   1726   uint32_t crc32;
   1727   char * contents;
   1728   bfd_size_type crc_offset;
   1729   FILE * handle;
   1730   unsigned char buffer[8 * 1024];
   1731   size_t count;
   1732   size_t filelen;
   1733 
   1734   if (abfd == NULL || sect == NULL || filename == NULL)
   1735     {
   1736       bfd_set_error (bfd_error_invalid_operation);
   1737       return false;
   1738     }
   1739 
   1740   /* Open the linked file so that we can compute a CRC.  */
   1741   handle = _bfd_real_fopen (filename, FOPEN_RB);
   1742   if (handle == NULL)
   1743     {
   1744       bfd_set_error (bfd_error_system_call);
   1745       return false;
   1746     }
   1747 
   1748   crc32 = 0;
   1749   while ((count = fread (buffer, 1, sizeof buffer, handle)) > 0)
   1750     crc32 = bfd_calc_gnu_debuglink_crc32 (crc32, buffer, count);
   1751   fclose (handle);
   1752 
   1753   /* Strip off any path components in filename,
   1754      now that we no longer need them.  */
   1755   filename = lbasename (filename);
   1756 
   1757   filelen = strlen (filename);
   1758   debuglink_size = filelen + 1;
   1759   debuglink_size += 3;
   1760   debuglink_size &= ~3;
   1761   debuglink_size += 4;
   1762 
   1763   contents = (char *) bfd_malloc (debuglink_size);
   1764   if (contents == NULL)
   1765     {
   1766       /* XXX Should we delete the section from the bfd ?  */
   1767       return false;
   1768     }
   1769 
   1770   crc_offset = debuglink_size - 4;
   1771   memcpy (contents, filename, filelen);
   1772   memset (contents + filelen, 0, crc_offset - filelen);
   1773 
   1774   bfd_put_32 (abfd, crc32, contents + crc_offset);
   1775 
   1776   if (! bfd_set_section_contents (abfd, sect, contents, 0, debuglink_size))
   1777     {
   1778       /* XXX Should we delete the section from the bfd ?  */
   1779       free (contents);
   1780       return false;
   1781     }
   1782 
   1783   return true;
   1784 }
   1785 
   1786 /* Finds the build-id associated with @var{abfd}.  If the build-id is
   1787    extracted from the note section then a build-id structure is built
   1788    for it, using memory allocated to @var{abfd}, and this is then
   1789    attached to the @var{abfd}.
   1790 
   1791    Returns a pointer to the build-id structure if a build-id could be
   1792    found.  If no build-id is found NULL is returned and error code is
   1793    set.  */
   1794 
   1795 static struct bfd_build_id *
   1796 get_build_id (bfd *abfd)
   1797 {
   1798   struct bfd_build_id *build_id;
   1799   Elf_Internal_Note inote;
   1800   Elf_External_Note *enote;
   1801   bfd_byte *contents;
   1802   asection *sect;
   1803   bfd_size_type size;
   1804 
   1805   BFD_ASSERT (abfd);
   1806 
   1807   if (abfd->build_id && abfd->build_id->size > 0)
   1808     /* Save some time by using the already computed build-id.  */
   1809     return (struct bfd_build_id *) abfd->build_id;
   1810 
   1811   sect = bfd_get_section_by_name (abfd, ".note.gnu.build-id");
   1812   if (sect == NULL
   1813       || (sect->flags & SEC_HAS_CONTENTS) == 0)
   1814     {
   1815       bfd_set_error (bfd_error_no_debug_section);
   1816       return NULL;
   1817     }
   1818 
   1819   size = bfd_section_size (sect);
   1820   /* FIXME: Should we support smaller build-id notes ?  */
   1821   if (size < 0x24)
   1822     {
   1823       bfd_set_error (bfd_error_invalid_operation);
   1824       return NULL;
   1825     }
   1826 
   1827   if (!bfd_malloc_and_get_section (abfd, sect, & contents))
   1828     return NULL;
   1829 
   1830   /* FIXME: Paranoia - allow for compressed build-id sections.
   1831      Maybe we should complain if this size is different from
   1832      the one obtained above...  */
   1833   size = bfd_section_size (sect);
   1834   if (size < sizeof (Elf_External_Note))
   1835     {
   1836       bfd_set_error (bfd_error_invalid_operation);
   1837       free (contents);
   1838       return NULL;
   1839     }
   1840 
   1841   enote = (Elf_External_Note *) contents;
   1842   inote.type = H_GET_32 (abfd, enote->type);
   1843   inote.namesz = H_GET_32 (abfd, enote->namesz);
   1844   inote.namedata = enote->name;
   1845   inote.descsz = H_GET_32 (abfd, enote->descsz);
   1846   inote.descdata = inote.namedata + BFD_ALIGN (inote.namesz, 4);
   1847   /* FIXME: Should we check for extra notes in this section ?  */
   1848 
   1849   if (inote.descsz <= 0
   1850       || inote.type != NT_GNU_BUILD_ID
   1851       || inote.namesz != 4 /* sizeof "GNU"  */
   1852       || !startswith (inote.namedata, "GNU")
   1853       || inote.descsz > 0x7ffffffe
   1854       || size < (12 + BFD_ALIGN (inote.namesz, 4) + inote.descsz))
   1855     {
   1856       free (contents);
   1857       bfd_set_error (bfd_error_invalid_operation);
   1858       return NULL;
   1859     }
   1860 
   1861   build_id = bfd_alloc (abfd, sizeof (struct bfd_build_id) + inote.descsz);
   1862   if (build_id == NULL)
   1863     {
   1864       free (contents);
   1865       return NULL;
   1866     }
   1867 
   1868   build_id->size = inote.descsz;
   1869   memcpy (build_id->data, inote.descdata, inote.descsz);
   1870   abfd->build_id = build_id;
   1871   free (contents);
   1872 
   1873   return build_id;
   1874 }
   1875 
   1876 /* Searches @var{abfd} for a build-id, and then constructs a pathname
   1877    from it.  The path is computed as .build-id/NN/NN+NN.debug where
   1878    NNNN+NN is the build-id value as a hexadecimal string.
   1879 
   1880    Returns the constructed filename or NULL upon error.  It is the
   1881    caller's responsibility to free the memory used to hold the
   1882    filename.  If a filename is returned then the @var{build_id_out_p}
   1883    parameter (which points to a @code{struct bfd_build_id} pointer) is
   1884    set to a pointer to the build_id structure.  */
   1885 
   1886 static char *
   1887 get_build_id_name (bfd *abfd, void *build_id_out_p)
   1888 {
   1889   struct bfd_build_id **build_id_out = build_id_out_p;
   1890   struct bfd_build_id *build_id;
   1891   char *name;
   1892   char *n;
   1893   bfd_size_type s;
   1894   bfd_byte *d;
   1895 
   1896   if (abfd == NULL || bfd_get_filename (abfd) == NULL || build_id_out == NULL)
   1897     {
   1898       bfd_set_error (bfd_error_invalid_operation);
   1899       return NULL;
   1900     }
   1901 
   1902   build_id = get_build_id (abfd);
   1903   if (build_id == NULL)
   1904     return NULL;
   1905 
   1906   /* Compute the debug pathname corresponding to the build-id.  */
   1907   name = bfd_malloc (strlen (".build-id/") + build_id->size * 2 + 2 + strlen (".debug"));
   1908   if (name == NULL)
   1909     {
   1910       bfd_set_error (bfd_error_no_memory);
   1911       return NULL;
   1912     }
   1913   n = name;
   1914   d = build_id->data;
   1915   s = build_id->size;
   1916 
   1917   n += sprintf (n, ".build-id/");
   1918   n += sprintf (n, "%02x", (unsigned) *d++); s--;
   1919   n += sprintf (n, "/");
   1920   while (s--)
   1921     n += sprintf (n, "%02x", (unsigned) *d++);
   1922   n += sprintf (n, ".debug");
   1923 
   1924   *build_id_out = build_id;
   1925   return name;
   1926 }
   1927 
   1928 /* Checks to see if @var{name} is a readable file and if its build-id
   1929    matches @var{buildid}.
   1930 
   1931    Returns TRUE if the file exists, is readable, and contains a
   1932    build-id which matches the build-id pointed at by @var{build_id_p}
   1933    (which is really a @code{struct bfd_build_id **}).  */
   1934 
   1935 static bool
   1936 check_build_id_file (const char *name, void *buildid_p)
   1937 {
   1938   struct bfd_build_id *orig_build_id;
   1939   struct bfd_build_id *build_id;
   1940   bfd * file;
   1941   bool result;
   1942 
   1943   BFD_ASSERT (name);
   1944   BFD_ASSERT (buildid_p);
   1945 
   1946   file = bfd_openr (name, NULL);
   1947   if (file == NULL)
   1948     return false;
   1949 
   1950   /* If the file is an archive, process all of its elements.  */
   1951   if (! bfd_check_format (file, bfd_object))
   1952     {
   1953       bfd_close (file);
   1954       return false;
   1955     }
   1956 
   1957   build_id = get_build_id (file);
   1958   if (build_id == NULL)
   1959     {
   1960       bfd_close (file);
   1961       return false;
   1962     }
   1963 
   1964   orig_build_id = *(struct bfd_build_id **) buildid_p;
   1965 
   1966   result = build_id->size == orig_build_id->size
   1967     && memcmp (build_id->data, orig_build_id->data, build_id->size) == 0;
   1968 
   1969   (void) bfd_close (file);
   1970 
   1971   return result;
   1972 }
   1973 
   1974 /*
   1975 FUNCTION
   1976 	bfd_follow_build_id_debuglink
   1977 
   1978 SYNOPSIS
   1979 	char *bfd_follow_build_id_debuglink (bfd *abfd, const char *dir);
   1980 
   1981 DESCRIPTION
   1982 	Takes @var{abfd} and searches it for a .note.gnu.build-id section.
   1983 	If this section is found, it extracts the value of the NT_GNU_BUILD_ID
   1984 	note, which should be a hexadecimal value @var{NNNN+NN} (for
   1985 	32+ hex digits).  It then searches the filesystem for a file named
   1986 	@var{.build-id/NN/NN+NN.debug} in a set of standard locations,
   1987 	including the directory tree rooted at @var{dir}.  The filename
   1988 	of the first matching file to be found is returned.  A matching
   1989 	file should contain a .note.gnu.build-id section with the same
   1990 	@var{NNNN+NN} note as @var{abfd}, although this check is currently
   1991 	not implemented.
   1992 
   1993 	If @var{dir} is NULL, the search will take place starting at
   1994 	the current directory.
   1995 
   1996 	Returns <<NULL>> on any errors or failure to locate the debug
   1997 	file, otherwise a pointer to a heap-allocated string
   1998 	containing the filename.  The caller is responsible for
   1999 	freeing this string.
   2000 */
   2001 
   2002 char *
   2003 bfd_follow_build_id_debuglink (bfd *abfd, const char *dir)
   2004 {
   2005   struct bfd_build_id *build_id;
   2006 
   2007   return find_separate_debug_file (abfd, dir, false,
   2008 				   get_build_id_name,
   2009 				   check_build_id_file, &build_id);
   2010 }
   2011 
   2012 /*
   2013 FUNCTION
   2014 	bfd_set_filename
   2015 
   2016 SYNOPSIS
   2017 	const char *bfd_set_filename (bfd *abfd, const char *filename);
   2018 
   2019 DESCRIPTION
   2020 	Set the filename of @var{abfd}, copying the FILENAME parameter to
   2021 	bfd_alloc'd memory owned by @var{abfd}.  Returns a pointer the
   2022 	newly allocated name, or NULL if the allocation failed.
   2023 */
   2024 
   2025 const char *
   2026 bfd_set_filename (bfd *abfd, const char *filename)
   2027 {
   2028   size_t len = strlen (filename) + 1;
   2029   char *n = bfd_alloc (abfd, len);
   2030 
   2031   if (n == NULL)
   2032     return NULL;
   2033 
   2034   if (abfd->filename != NULL)
   2035     {
   2036       /* PR 29389.  If we attempt to rename a file that has been closed due
   2037 	 to caching, then we will not be able to reopen it later on.  */
   2038       if (abfd->iostream == NULL && (abfd->flags & BFD_CLOSED_BY_CACHE))
   2039 	{
   2040 	  bfd_set_error (bfd_error_invalid_operation);
   2041 	  return NULL;
   2042 	}
   2043 
   2044       /* Similarly if we attempt to close a renamed file because the
   2045 	 cache is now full, we will not be able to reopen it later on.  */
   2046       if (abfd->iostream != NULL)
   2047 	abfd->cacheable = 0;
   2048     }
   2049 
   2050   memcpy (n, filename, len);
   2051   abfd->filename = n;
   2052 
   2053   return n;
   2054 }
   2055