Subversion Repositories Kolibri OS

Rev

Rev 5199 | Details | Compare with Previous | Last modification | View Log | RSS feed

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