Ignore:
Timestamp:
Aug 16, 2003, 6:59:22 PM (22 years ago)
Author:
bird
Message:

binutils v2.14 - offical sources.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/GNU/src/binutils/bfd/opncls.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r608 r609  
    11/* opncls.c -- open and close a BFD.
    22   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
    3    2001
     3   2001, 2002, 2003
    44   Free Software Foundation, Inc.
    55
    66   Written by Cygnus Support.
    77
    8 This file is part of BFD, the Binary File Descriptor library.
    9 
    10 This program is free software; you can redistribute it and/or modify
    11 it under the terms of the GNU General Public License as published by
    12 the Free Software Foundation; either version 2 of the License, or
    13 (at your option) any later version.
    14 
    15 This program is distributed in the hope that it will be useful,
    16 but WITHOUT ANY WARRANTY; without even the implied warranty of
    17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    18 GNU General Public License for more details.
    19 
    20 You should have received a copy of the GNU General Public License
    21 along with this program; if not, write to the Free Software
    22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
     8   This file is part of BFD, the Binary File Descriptor library.
     9
     10   This program is free software; you can redistribute it and/or modify
     11   it under the terms of the GNU General Public License as published by
     12   the Free Software Foundation; either version 2 of the License, or
     13   (at your option) any later version.
     14
     15   This program is distributed in the hope that it will be useful,
     16   but WITHOUT ANY WARRANTY; without even the implied warranty of
     17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18   GNU General Public License for more details.
     19
     20   You should have received a copy of the GNU General Public License
     21   along with this program; if not, write to the Free Software
     22   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
    2323
    2424#include "bfd.h"
     
    2626#include "objalloc.h"
    2727#include "libbfd.h"
     28#include "libiberty.h"
    2829
    2930#ifndef S_IXUSR
     
    3738#endif
    3839
     40/* Counter used to initialize the bfd identifier.  */
     41
     42static unsigned int _bfd_id_counter = 0;
     43
    3944/* fdopen is a loser -- we should use stdio exclusively.  Unfortunately
    4045   if we do that we can't use fcntl.  */
    4146
    42 /* FIXME: This is no longer used.  */
    43 long _bfd_chunksize = -1;
    44 
    4547/* Return a new BFD.  All BFD's are allocated through this routine.  */
    4648
     
    5052  bfd *nbfd;
    5153
    52   nbfd = (bfd *) bfd_zmalloc (sizeof (bfd));
     54  nbfd = (bfd *) bfd_zmalloc ((bfd_size_type) sizeof (bfd));
    5355  if (nbfd == NULL)
    5456    return NULL;
    5557
     58  nbfd->id = _bfd_id_counter++;
     59
    5660  nbfd->memory = (PTR) objalloc_create ();
    5761  if (nbfd->memory == NULL)
    5862    {
    5963      bfd_set_error (bfd_error_no_memory);
     64      free (nbfd);
    6065      return NULL;
    6166    }
     
    6671  nbfd->iostream = NULL;
    6772  nbfd->where = 0;
     73  if (!bfd_hash_table_init_n (&nbfd->section_htab,
     74                              bfd_section_hash_newfunc,
     75                              251))
     76    {
     77      free (nbfd);
     78      return NULL;
     79    }
    6880  nbfd->sections = (asection *) NULL;
     81  nbfd->section_tail = &nbfd->sections;
    6982  nbfd->format = bfd_unknown;
    7083  nbfd->my_archive = (bfd *) NULL;
    71   nbfd->origin = 0;                             
    72   nbfd->opened_once = false;
    73   nbfd->output_has_begun = false;
     84  nbfd->origin = 0;
     85  nbfd->opened_once = FALSE;
     86  nbfd->output_has_begun = FALSE;
    7487  nbfd->section_count = 0;
    7588  nbfd->usrdata = (PTR) NULL;
    76   nbfd->cacheable = false;
     89  nbfd->cacheable = FALSE;
    7790  nbfd->flags = BFD_NO_FLAGS;
    78   nbfd->mtime_set = false;
     91  nbfd->mtime_set = FALSE;
    7992
    8093  return nbfd;
     
    90103
    91104  nbfd = _bfd_new_bfd ();
     105  if (nbfd == NULL)
     106    return NULL;
    92107  nbfd->xvec = obfd->xvec;
    93108  nbfd->my_archive = obfd;
     
    97112}
    98113
     114/* Delete a BFD.  */
     115
     116void
     117_bfd_delete_bfd (abfd)
     118     bfd *abfd;
     119{
     120  bfd_hash_table_free (&abfd->section_htab);
     121  objalloc_free ((struct objalloc *) abfd->memory);
     122  free (abfd);
     123}
     124
    99125/*
    100126SECTION
     
    108134
    109135SYNOPSIS
    110         bfd *bfd_openr(CONST char *filename, CONST char *target);
     136        bfd *bfd_openr(const char *filename, const char *target);
    111137
    112138DESCRIPTION
     
    118144
    119145        If <<NULL>> is returned then an error has occured.   Possible errors
    120         are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or <<system_call>> error.
     146        are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or
     147        <<system_call>> error.
    121148*/
    122149
    123150bfd *
    124151bfd_openr (filename, target)
    125      CONST char *filename;
    126      CONST char *target;
     152     const char *filename;
     153     const char *target;
    127154{
    128155  bfd *nbfd;
     
    136163  if (target_vec == NULL)
    137164    {
    138       objalloc_free ((struct objalloc *) nbfd->memory);
    139       free (nbfd);
    140       bfd_set_error (bfd_error_invalid_target);
     165      _bfd_delete_bfd (nbfd);
    141166      return NULL;
    142167    }
     
    147172  if (bfd_open_file (nbfd) == NULL)
    148173    {
    149       /* File didn't exist, or some such */
     174      /* File didn't exist, or some such. */
    150175      bfd_set_error (bfd_error_system_call);
    151       objalloc_free ((struct objalloc *) nbfd->memory);
    152       free (nbfd);
     176      _bfd_delete_bfd (nbfd);
    153177      return NULL;
    154178    }
     
    163187   o - We open the file stream last, since we don't want to have to
    164188       close it if anything goes wrong.  Closing the stream means closing
    165        the file descriptor too, even though we didn't open it.
    166  */
     189       the file descriptor too, even though we didn't open it.  */
    167190/*
    168191FUNCTION
    169          bfd_fdopenr
    170 
    171 SYNOPSIS
    172          bfd *bfd_fdopenr(CONST char *filename, CONST char *target, int fd);
    173 
    174 DESCRIPTION
    175          <<bfd_fdopenr>> is to <<bfd_fopenr>> much like <<fdopen>> is to <<fopen>>.
    176          It opens a BFD on a file already described by the @var{fd}
    177         supplied.
    178 
    179          When the file is later <<bfd_close>>d, the file descriptor will be closed.
    180 
    181          If the caller desires that this file descriptor be cached by BFD
    182          (opened as needed, closed as needed to free descriptors for
    183          other opens), with the supplied @var{fd} used as an initial
    184          file descriptor (but subject to closure at any time), call
    185          bfd_set_cacheable(bfd, 1) on the returned BFD.  The default is to
    186          assume no cacheing; the file descriptor will remain open until
    187          <<bfd_close>>, and will not be affected by BFD operations on other
    188          files.
    189 
    190          Possible errors are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
     192        bfd_fdopenr
     193
     194SYNOPSIS
     195        bfd *bfd_fdopenr(const char *filename, const char *target, int fd);
     196
     197DESCRIPTION
     198        <<bfd_fdopenr>> is to <<bfd_fopenr>> much like <<fdopen>> is to
     199        <<fopen>>.  It opens a BFD on a file already described by the
     200        @var{fd} supplied.
     201
     202        When the file is later <<bfd_close>>d, the file descriptor will
     203        be closed.  If the caller desires that this file descriptor be
     204        cached by BFD (opened as needed, closed as needed to free
     205        descriptors for other opens), with the supplied @var{fd} used as
     206        an initial file descriptor (but subject to closure at any time),
     207        call bfd_set_cacheable(bfd, 1) on the returned BFD.  The default
     208        is to assume no cacheing; the file descriptor will remain open
     209        until <<bfd_close>>, and will not be affected by BFD operations
     210        on other files.
     211
     212        Possible errors are <<bfd_error_no_memory>>,
     213        <<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
    191214*/
    192215
    193216bfd *
    194217bfd_fdopenr (filename, target, fd)
    195      CONST char *filename;
    196      CONST char *target;
     218     const char *filename;
     219     const char *target;
    197220     int fd;
    198221{
     
    203226  bfd_set_error (bfd_error_system_call);
    204227#if ! defined(HAVE_FCNTL) || ! defined(F_GETFL)
    205   fdflags = O_RDWR;                     /* Assume full access */
     228  fdflags = O_RDWR;                     /* Assume full access. */
    206229#else
    207230  fdflags = fcntl (fd, F_GETFL, NULL);
    208231#endif
    209   if (fdflags == -1) return NULL;
     232  if (fdflags == -1)
     233    return NULL;
    210234
    211235  nbfd = _bfd_new_bfd ();
     
    216240  if (target_vec == NULL)
    217241    {
    218       bfd_set_error (bfd_error_invalid_target);
    219       objalloc_free ((struct objalloc *) nbfd->memory);
    220       free (nbfd);
     242      _bfd_delete_bfd (nbfd);
    221243      return NULL;
    222244    }
     
    225247  nbfd->iostream = (PTR) fopen (filename, FOPEN_RB);
    226248#else
    227   /* (O_ACCMODE) parens are to avoid Ultrix header file bug */
     249  /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
    228250  switch (fdflags & (O_ACCMODE))
    229251    {
     
    237259  if (nbfd->iostream == NULL)
    238260    {
    239       objalloc_free ((struct objalloc *) nbfd->memory);
    240       free (nbfd);
    241       return NULL;
    242     }
    243 
    244   /* OK, put everything where it belongs */
    245 
     261      _bfd_delete_bfd (nbfd);
     262      return NULL;
     263    }
     264
     265  /* OK, put everything where it belongs.  */
    246266  nbfd->filename = filename;
    247267
     
    249269     be written through, although doing so requires that we end
    250270     the previous clause with a preposition.  */
    251   /* (O_ACCMODE) parens are to avoid Ultrix header file bug */
     271  /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
    252272  switch (fdflags & (O_ACCMODE))
    253273    {
     
    260280  if (! bfd_cache_init (nbfd))
    261281    {
    262       objalloc_free ((struct objalloc *) nbfd->memory);
    263       free (nbfd);
    264       return NULL;
    265     }
    266   nbfd->opened_once = true;
     282      _bfd_delete_bfd (nbfd);
     283      return NULL;
     284    }
     285  nbfd->opened_once = TRUE;
    267286
    268287  return nbfd;
     
    299318  if (target_vec == NULL)
    300319    {
    301       bfd_set_error (bfd_error_invalid_target);
    302       objalloc_free ((struct objalloc *) nbfd->memory);
    303       free (nbfd);
     320      _bfd_delete_bfd (nbfd);
    304321      return NULL;
    305322    }
     
    308325  nbfd->filename = filename;
    309326  nbfd->direction = read_direction;
    310                                
     327
    311328  if (! bfd_cache_init (nbfd))
    312329    {
    313       objalloc_free ((struct objalloc *) nbfd->memory);
    314       free (nbfd);
     330      _bfd_delete_bfd (nbfd);
    315331      return NULL;
    316332    }
     
    320336
    321337
    322 /** bfd_openw -- open for writing.
    323   Returns a pointer to a freshly-allocated BFD on success, or NULL.
    324 
    325   See comment by bfd_fdopenr before you try to modify this function. */
     338/* bfd_openw -- open for writing.
     339   Returns a pointer to a freshly-allocated BFD on success, or NULL.
     340
     341   See comment by bfd_fdopenr before you try to modify this function. */
    326342
    327343/*
     
    330346
    331347SYNOPSIS
    332         bfd *bfd_openw(CONST char *filename, CONST char *target);
     348        bfd *bfd_openw(const char *filename, const char *target);
    333349
    334350DESCRIPTION
     
    342358bfd *
    343359bfd_openw (filename, target)
    344      CONST char *filename;
    345      CONST char *target;
     360     const char *filename;
     361     const char *target;
    346362{
    347363  bfd *nbfd;
    348364  const bfd_target *target_vec;
    349365
    350   bfd_set_error (bfd_error_system_call);
    351 
    352366  /* nbfd has to point to head of malloc'ed block so that bfd_close may
    353      reclaim it correctly. */
    354 
     367     reclaim it correctly.  */
    355368  nbfd = _bfd_new_bfd ();
    356369  if (nbfd == NULL)
     
    360373  if (target_vec == NULL)
    361374    {
    362       objalloc_free ((struct objalloc *) nbfd->memory);
    363       free (nbfd);
     375      _bfd_delete_bfd (nbfd);
    364376      return NULL;
    365377    }
     
    370382  if (bfd_open_file (nbfd) == NULL)
    371383    {
    372       bfd_set_error (bfd_error_system_call);    /* File not writeable, etc */
    373       objalloc_free ((struct objalloc *) nbfd->memory);
    374       free (nbfd);
     384      /* File not writeable, etc. */
     385      bfd_set_error (bfd_error_system_call);
     386      _bfd_delete_bfd (nbfd);
    375387      return NULL;
    376388  }
     
    385397
    386398SYNOPSIS
    387         boolean bfd_close(bfd *abfd);
    388 
    389 DESCRIPTION
    390 
    391         Close a BFD. If the BFD was open for writing,
    392         then pending operations are completed and the file written out
    393         and closed. If the created file is executable, then
    394         <<chmod>> is called to mark it as such.
     399        bfd_boolean bfd_close (bfd *abfd);
     400
     401DESCRIPTION
     402
     403        Close a BFD. If the BFD was open for writing, then pending
     404        operations are completed and the file written out and closed.
     405        If the created file is executable, then <<chmod>> is called
     406        to mark it as such.
    395407
    396408        All memory attached to the BFD is released.
     
    400412
    401413RETURNS
    402         <<true>> is returned if all is ok, otherwise <<false>>.
    403 */
    404 
    405 
    406 boolean
     414        <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
     415*/
     416
     417
     418bfd_boolean
    407419bfd_close (abfd)
    408420     bfd *abfd;
    409421{
    410   boolean ret;
    411 
    412   if (!bfd_read_p (abfd))
     422  bfd_boolean ret;
     423
     424  if (bfd_write_p (abfd))
    413425    {
    414426      if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
    415         return false;
     427        return FALSE;
    416428    }
    417429
    418430  if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
    419     return false;
     431    return FALSE;
    420432
    421433  ret = bfd_cache_close (abfd);
    422434
    423435  /* If the file was open for writing and is now executable,
    424      make it so */
     436     make it so. */
    425437  if (ret
    426438      && abfd->direction == write_direction
     
    431443      if (stat (abfd->filename, &buf) == 0)
    432444        {
    433           int mask = umask (0);
     445          unsigned int mask = umask (0);
     446
    434447          umask (mask);
    435448          chmod (abfd->filename,
     
    439452    }
    440453
    441   objalloc_free ((struct objalloc *) abfd->memory);
    442   free (abfd);
     454  _bfd_delete_bfd (abfd);
    443455
    444456  return ret;
     
    450462
    451463SYNOPSIS
    452         boolean bfd_close_all_done(bfd *);
    453 
    454 DESCRIPTION
    455         Close a BFD.  Differs from <<bfd_close>>
    456         since it does not complete any pending operations.  This
    457         routine would be used if the application had just used BFD for
    458         swapping and didn't want to use any of the writing code.
     464        bfd_boolean bfd_close_all_done (bfd *);
     465
     466DESCRIPTION
     467        Close a BFD.  Differs from <<bfd_close>> since it does not
     468        complete any pending operations.  This routine would be used
     469        if the application had just used BFD for swapping and didn't
     470        want to use any of the writing code.
    459471
    460472        If the created file is executable, then <<chmod>> is called
     
    464476
    465477RETURNS
    466         <<true>> is returned if all is ok, otherwise <<false>>.
    467 
    468 */
    469 
    470 boolean
     478        <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
     479*/
     480
     481bfd_boolean
    471482bfd_close_all_done (abfd)
    472483     bfd *abfd;
    473484{
    474   boolean ret;
     485  bfd_boolean ret;
    475486
    476487  ret = bfd_cache_close (abfd);
    477488
    478489  /* If the file was open for writing and is now executable,
    479      make it so */
     490     make it so. */
    480491  if (ret
    481492      && abfd->direction == write_direction
     
    486497      if (stat (abfd->filename, &buf) == 0)
    487498        {
    488           int mask = umask (0);
     499          unsigned int mask = umask (0);
     500
    489501          umask (mask);
    490502          chmod (abfd->filename,
     
    494506    }
    495507
    496   objalloc_free ((struct objalloc *) abfd->memory);
    497   free (abfd);
     508  _bfd_delete_bfd (abfd);
    498509
    499510  return ret;
     
    505516
    506517SYNOPSIS
    507         bfd *bfd_create(CONST char *filename, bfd *templ);
    508 
    509 DESCRIPTION
    510         Create a new BFD in the manner of
    511         <<bfd_openw>>, but without opening a file. The new BFD
    512         takes the target from the target used by @var{template}. The
    513         format is always set to <<bfd_object>>.
    514 
     518        bfd *bfd_create(const char *filename, bfd *templ);
     519
     520DESCRIPTION
     521        Create a new BFD in the manner of <<bfd_openw>>, but without
     522        opening a file. The new BFD takes the target from the target
     523        used by @var{template}. The format is always set to <<bfd_object>>.
    515524*/
    516525
    517526bfd *
    518527bfd_create (filename, templ)
    519      CONST char *filename;
     528     const char *filename;
    520529     bfd *templ;
    521530{
     
    530539  nbfd->direction = no_direction;
    531540  bfd_set_format (nbfd, bfd_object);
     541
    532542  return nbfd;
    533543}
     
    538548
    539549SYNOPSIS
    540         boolean bfd_make_writable(bfd *abfd);
     550        bfd_boolean bfd_make_writable (bfd *abfd);
    541551
    542552DESCRIPTION
     
    547557
    548558RETURNS
    549         <<true>> is returned if all is ok, otherwise <<false>>.
    550 */
    551 
    552 boolean
     559        <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
     560*/
     561
     562bfd_boolean
    553563bfd_make_writable(abfd)
    554564     bfd *abfd;
     
    559569    {
    560570      bfd_set_error (bfd_error_invalid_operation);
    561       return false;
    562     }
    563 
    564   bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory));
     571      return FALSE;
     572    }
     573
     574  bim = ((struct bfd_in_memory *)
     575         bfd_malloc ((bfd_size_type) sizeof (struct bfd_in_memory)));
    565576  abfd->iostream = (PTR) bim;
    566   /* bfd_write will grow these as needed */
     577  /* bfd_bwrite will grow these as needed. */
    567578  bim->size = 0;
    568579  bim->buffer = 0;
     
    572583  abfd->where = 0;
    573584
    574   return true;
     585  return TRUE;
    575586}
    576587
     
    580591
    581592SYNOPSIS
    582         boolean bfd_make_readable(bfd *abfd);
     593        bfd_boolean bfd_make_readable (bfd *abfd);
    583594
    584595DESCRIPTION
     
    590601
    591602RETURNS
    592         <<true>> is returned if all is ok, otherwise <<false>>.  */
    593 
    594 boolean
     603        <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.  */
     604
     605bfd_boolean
    595606bfd_make_readable(abfd)
    596607     bfd *abfd;
     
    599610    {
    600611      bfd_set_error (bfd_error_invalid_operation);
    601       return false;
     612      return FALSE;
    602613    }
    603614
    604615  if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
    605     return false;
     616    return FALSE;
    606617
    607618  if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
    608     return false;
     619    return FALSE;
    609620
    610621
     
    612623
    613624  abfd->where = 0;
    614   abfd->sections = (asection *) NULL;
    615625  abfd->format = bfd_unknown;
    616626  abfd->my_archive = (bfd *) NULL;
    617   abfd->origin = 0;                             
    618   abfd->opened_once = false;
    619   abfd->output_has_begun = false;
     627  abfd->origin = 0;
     628  abfd->opened_once = FALSE;
     629  abfd->output_has_begun = FALSE;
    620630  abfd->section_count = 0;
    621631  abfd->usrdata = (PTR) NULL;
    622   abfd->cacheable = false;
     632  abfd->cacheable = FALSE;
    623633  abfd->flags = BFD_IN_MEMORY;
    624   abfd->mtime_set = false;
    625 
    626   abfd->target_defaulted = true;
     634  abfd->mtime_set = FALSE;
     635
     636  abfd->target_defaulted = TRUE;
    627637  abfd->direction = read_direction;
    628638  abfd->sections = 0;
     
    631641  abfd->tdata.any = 0;
    632642
    633   bfd_check_format(abfd, bfd_object);
    634 
    635   return true;
     643  bfd_section_list_clear (abfd);
     644  bfd_check_format (abfd, bfd_object);
     645
     646  return TRUE;
    636647}
    637648
     
    652663bfd_alloc (abfd, size)
    653664     bfd *abfd;
    654      size_t size;
     665     bfd_size_type size;
    655666{
    656667  PTR ret;
     668
     669  if (size != (unsigned long) size)
     670    {
     671      bfd_set_error (bfd_error_no_memory);
     672      return NULL;
     673    }
    657674
    658675  ret = objalloc_alloc (abfd->memory, (unsigned long) size);
     
    665682bfd_zalloc (abfd, size)
    666683     bfd *abfd;
    667      size_t size;
     684     bfd_size_type size;
    668685{
    669686  PTR res;
     
    671688  res = bfd_alloc (abfd, size);
    672689  if (res)
    673     memset (res, 0, size);
     690    memset (res, 0, (size_t) size);
    674691  return res;
    675692}
    676693
    677 /* Free a block allocated for a BFD.  */
     694/* Free a block allocated for a BFD.
     695   Note:  Also frees all more recently allocated blocks!  */
    678696
    679697void
     
    684702  objalloc_free_block ((struct objalloc *) abfd->memory, block);
    685703}
     704
     705
     706/*
     707   GNU Extension: separate debug-info files
     708   
     709   The idea here is that a special section called .gnu_debuglink might be
     710   embedded in a binary file, which indicates that some *other* file
     711   contains the real debugging information. This special section contains a
     712   filename and CRC32 checksum, which we read and resolve to another file,
     713   if it exists.
     714
     715   This facilitates "optional" provision of debugging information, without
     716   having to provide two complete copies of every binary object (with and
     717   without debug symbols).
     718*/
     719
     720static unsigned long  calc_crc32                  PARAMS ((unsigned long, const unsigned char *, size_t));
     721static char *         get_debug_link_info         PARAMS ((bfd *, unsigned long *));
     722static bfd_boolean    separate_debug_file_exists  PARAMS ((const char *, const unsigned long));
     723static char *         find_separate_debug_file    PARAMS ((bfd *, const char *));
     724
     725/*
     726INTERNAL_FUNCTION
     727        calc_crc32
     728
     729SYNOPSIS
     730        unsigned long calc_crc32 (unsigned long crc, const unsigned char *buf, size_t len);
     731
     732DESCRIPTION
     733        Advance the CRC32 given by @var{crc} through @var{len}
     734        bytes of @var{buf}. Return the updated CRC32 value.
     735*/     
     736
     737static unsigned long
     738calc_crc32 (crc, buf, len)
     739     unsigned long crc;
     740     const unsigned char *buf;
     741     size_t len;
     742{
     743  static const unsigned long crc32_table[256] =
     744    {
     745      0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
     746      0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
     747      0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
     748      0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
     749      0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
     750      0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
     751      0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
     752      0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
     753      0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
     754      0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
     755      0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
     756      0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
     757      0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
     758      0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
     759      0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
     760      0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
     761      0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
     762      0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
     763      0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
     764      0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
     765      0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
     766      0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
     767      0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
     768      0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
     769      0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
     770      0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
     771      0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
     772      0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
     773      0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
     774      0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
     775      0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
     776      0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
     777      0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
     778      0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
     779      0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
     780      0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
     781      0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
     782      0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
     783      0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
     784      0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
     785      0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
     786      0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
     787      0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
     788      0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
     789      0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
     790      0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
     791      0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
     792      0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
     793      0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
     794      0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
     795      0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
     796      0x2d02ef8d
     797    };
     798  const unsigned char *end;
     799
     800  crc = ~crc & 0xffffffff;
     801  for (end = buf + len; buf < end; ++ buf)
     802    crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
     803  return ~crc & 0xffffffff;;
     804}
     805
     806
     807/*
     808INTERNAL_FUNCTION
     809        get_debug_link_info
     810
     811SYNOPSIS
     812        char *get_debug_link_info (bfd *abfd, unsigned long *crc32_out)
     813
     814DESCRIPTION
     815        fetch the filename and CRC32 value for any separate debuginfo
     816        associated with @var{abfd}. Return NULL if no such info found,
     817        otherwise return filename and update @var{crc32_out}.
     818*/
     819
     820static char *
     821get_debug_link_info (abfd, crc32_out)
     822     bfd *abfd;
     823     unsigned long *crc32_out;
     824{
     825  asection * sect;
     826  bfd_size_type debuglink_size;
     827  unsigned long crc32;
     828  char * contents;
     829  int crc_offset;
     830  bfd_boolean ret;
     831
     832  BFD_ASSERT (abfd);
     833  BFD_ASSERT (crc32_out);
     834
     835  sect = bfd_get_section_by_name (abfd, ".gnu_debuglink");
     836
     837  if (sect == NULL)
     838    return NULL;
     839
     840  debuglink_size = bfd_section_size (abfd, sect); 
     841
     842  contents = xmalloc (debuglink_size);
     843  ret = bfd_get_section_contents (abfd, sect, contents,
     844                                  (file_ptr)0, debuglink_size);
     845  if (! ret)
     846    {
     847      free (contents);
     848      return NULL;
     849    }
     850
     851  /* Crc value is stored after the filename, aligned up to 4 bytes.  */
     852  crc_offset = strlen (contents) + 1;
     853  crc_offset = (crc_offset + 3) & ~3;
     854
     855  crc32 = bfd_get_32 (abfd, (bfd_byte *) (contents + crc_offset));
     856
     857  *crc32_out = crc32;
     858  return contents;
     859}
     860
     861/*
     862INTERNAL_FUNCTION
     863        separate_debug_file_exists
     864
     865SYNOPSIS
     866        bfd_boolean separate_debug_file_exists (char * name, unsigned long crc32)
     867
     868DESCRIPTION
     869        Checks to see if @var{name} is a file and if its contents
     870        match @var{crc32}.
     871*/
     872
     873static bfd_boolean
     874separate_debug_file_exists (name, crc)
     875     const char *name;
     876     const unsigned long crc;
     877{
     878  static char buffer [8 * 1024];
     879  unsigned long file_crc = 0;
     880  int fd;
     881  int count;
     882
     883  BFD_ASSERT (name);
     884
     885  fd = open (name, O_RDONLY);
     886  if (fd < 0)
     887    return FALSE;
     888
     889  while ((count = read (fd, buffer, sizeof (buffer))) > 0)
     890    file_crc = calc_crc32 (file_crc, buffer, count);
     891
     892  close (fd);
     893
     894  return crc == file_crc;
     895}
     896
     897
     898/*
     899INTERNAL_FUNCTION
     900        find_separate_debug_file
     901
     902SYNOPSIS
     903        char * find_separate_debug_file (bfd *abfd)
     904
     905DESCRIPTION
     906        Searches @var{abfd} for a reference to separate debugging
     907        information, scans various locations in the filesystem, including
     908        the file tree rooted at @var{debug_file_directory}, and returns a
     909        filename of such debugging information if the file is found and has
     910        matching CRC32.  Returns NULL if no reference to debugging file
     911        exists, or file cannot be found.
     912*/
     913
     914static char *
     915find_separate_debug_file (abfd, debug_file_directory)
     916     bfd *abfd;
     917     const char *debug_file_directory;
     918{
     919  char *basename;
     920  char *dir;
     921  char *debugfile;
     922  unsigned long crc32;
     923  int i;
     924
     925  BFD_ASSERT (abfd);
     926  if (debug_file_directory == NULL)
     927    debug_file_directory = ".";
     928
     929  /* BFD may have been opened from a stream.  */
     930  if (! abfd->filename)
     931    return NULL;
     932
     933  basename = get_debug_link_info (abfd, & crc32);
     934
     935  if (basename == NULL)
     936    return NULL;
     937  if (strlen (basename) < 1)
     938    {
     939      free (basename);
     940      return NULL;
     941    }
     942
     943  dir = xstrdup (abfd->filename);
     944  BFD_ASSERT (strlen (dir) != 0);
     945 
     946  /* Strip off filename part.  */
     947  for (i = strlen (dir) - 1; i >= 0; i--)
     948    if (IS_DIR_SEPARATOR (dir[i]))
     949      break;
     950 
     951  dir[i + 1] = '\0';
     952  BFD_ASSERT (dir[i] == '/' || dir[0] == '\0')
     953
     954  debugfile = xmalloc (strlen (debug_file_directory) + 1
     955                       + strlen (dir)
     956                       + strlen (".debug/")
     957                       + strlen (basename)
     958                       + 1);
     959
     960  /* First try in the same directory as the original file:  */
     961  strcpy (debugfile, dir);
     962  strcat (debugfile, basename);
     963
     964  if (separate_debug_file_exists (debugfile, crc32))
     965    {
     966      free (basename);
     967      free (dir);
     968      return debugfile;
     969    }
     970
     971  /* Then try in a subdirectory called .debug.  */
     972  strcpy (debugfile, dir);
     973  strcat (debugfile, ".debug/");
     974  strcat (debugfile, basename);
     975
     976  if (separate_debug_file_exists (debugfile, crc32))
     977    {
     978      free (basename);
     979      free (dir);
     980      return debugfile;
     981    }
     982
     983  /* Then try in the global debugfile directory.  */
     984  strcpy (debugfile, debug_file_directory);
     985  i = strlen (debug_file_directory) - 1;
     986  if (i > 0
     987      && debug_file_directory[i] != '/'
     988      && dir[0] != '/')
     989    strcat (debugfile, "/");
     990  strcat (debugfile, dir);
     991  strcat (debugfile, basename);
     992
     993  if (separate_debug_file_exists (debugfile, crc32))
     994    {
     995      free (basename);
     996      free (dir);
     997      return debugfile;
     998    }
     999
     1000  free (debugfile);
     1001  free (basename);
     1002  free (dir);
     1003  return NULL;
     1004}
     1005
     1006
     1007/*
     1008FUNCTION
     1009        bfd_follow_gnu_debuglink
     1010
     1011SYNOPSIS
     1012        char * bfd_follow_gnu_debuglink(bfd *abfd, const char *dir);
     1013
     1014DESCRIPTION
     1015
     1016        Takes a BFD and searches it for a .gnu_debuglink section.  If this
     1017        section is found, examines the section for the name and checksum of
     1018        a '.debug' file containing auxiliary debugging
     1019        information. Searches filesystem for .debug file in some standard
     1020        locations, including the directory tree rooted at @var{dir}, and if
     1021        found returns the full filename. If @var{dir} is NULL, will search
     1022        default path configured into libbfd at build time.
     1023
     1024RETURNS
     1025        <<NULL>> on any errors or failure to locate the .debug file,
     1026        otherwise a pointer to a heap-allocated string containing the
     1027        filename. The caller is responsible for freeing this string.
     1028*/
     1029
     1030char *
     1031bfd_follow_gnu_debuglink (abfd, dir)
     1032     bfd *abfd;
     1033     const char * dir;
     1034{
     1035#if 0 /* Disabled until DEBUGDIR can be defined by configure.in  */
     1036  if (dir == NULL)
     1037    dir = DEBUGDIR;
     1038#endif
     1039  return find_separate_debug_file (abfd, dir);
     1040}
Note: See TracChangeset for help on using the changeset viewer.