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