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