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