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