OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [opncls.c] - Blame information for rev 161

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.