Subversion Repositories Kolibri OS

Rev

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