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