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