source: trunk/src/binutils/bfd/opncls.c@ 610

Last change on this file since 610 was 610, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r609,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 25.3 KB
Line 
1/* opncls.c -- open and close a BFD.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
3 2001, 2002, 2003
4 Free Software Foundation, Inc.
5
6 Written by Cygnus Support.
7
8 This file is part of BFD, the Binary File Descriptor library.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
23
24#include "bfd.h"
25#include "sysdep.h"
26#include "objalloc.h"
27#include "libbfd.h"
28#include "libiberty.h"
29
30#ifndef S_IXUSR
31#define S_IXUSR 0100 /* Execute by owner. */
32#endif
33#ifndef S_IXGRP
34#define S_IXGRP 0010 /* Execute by group. */
35#endif
36#ifndef S_IXOTH
37#define S_IXOTH 0001 /* Execute by others. */
38#endif
39
40/* Counter used to initialize the bfd identifier. */
41
42static unsigned int _bfd_id_counter = 0;
43
44/* fdopen is a loser -- we should use stdio exclusively. Unfortunately
45 if we do that we can't use fcntl. */
46
47/* Return a new BFD. All BFD's are allocated through this routine. */
48
49bfd *
50_bfd_new_bfd ()
51{
52 bfd *nbfd;
53
54 nbfd = (bfd *) bfd_zmalloc ((bfd_size_type) sizeof (bfd));
55 if (nbfd == NULL)
56 return NULL;
57
58 nbfd->id = _bfd_id_counter++;
59
60 nbfd->memory = (PTR) objalloc_create ();
61 if (nbfd->memory == NULL)
62 {
63 bfd_set_error (bfd_error_no_memory);
64 free (nbfd);
65 return NULL;
66 }
67
68 nbfd->arch_info = &bfd_default_arch_struct;
69
70 nbfd->direction = no_direction;
71 nbfd->iostream = NULL;
72 nbfd->where = 0;
73 if (!bfd_hash_table_init_n (&nbfd->section_htab,
74 bfd_section_hash_newfunc,
75 251))
76 {
77 free (nbfd);
78 return NULL;
79 }
80 nbfd->sections = (asection *) NULL;
81 nbfd->section_tail = &nbfd->sections;
82 nbfd->format = bfd_unknown;
83 nbfd->my_archive = (bfd *) NULL;
84 nbfd->origin = 0;
85 nbfd->opened_once = FALSE;
86 nbfd->output_has_begun = FALSE;
87 nbfd->section_count = 0;
88 nbfd->usrdata = (PTR) NULL;
89 nbfd->cacheable = FALSE;
90 nbfd->flags = BFD_NO_FLAGS;
91 nbfd->mtime_set = FALSE;
92
93 return nbfd;
94}
95
96/* Allocate a new BFD as a member of archive OBFD. */
97
98bfd *
99_bfd_new_bfd_contained_in (obfd)
100 bfd *obfd;
101{
102 bfd *nbfd;
103
104 nbfd = _bfd_new_bfd ();
105 if (nbfd == NULL)
106 return NULL;
107 nbfd->xvec = obfd->xvec;
108 nbfd->my_archive = obfd;
109 nbfd->direction = read_direction;
110 nbfd->target_defaulted = obfd->target_defaulted;
111 return nbfd;
112}
113
114/* Delete a BFD. */
115
116void
117_bfd_delete_bfd (abfd)
118 bfd *abfd;
119{
120 bfd_hash_table_free (&abfd->section_htab);
121 objalloc_free ((struct objalloc *) abfd->memory);
122 free (abfd);
123}
124
125/*
126SECTION
127 Opening and closing BFDs
128
129*/
130
131/*
132FUNCTION
133 bfd_openr
134
135SYNOPSIS
136 bfd *bfd_openr(const char *filename, const char *target);
137
138DESCRIPTION
139 Open the file @var{filename} (using <<fopen>>) with the target
140 @var{target}. Return a pointer to the created BFD.
141
142 Calls <<bfd_find_target>>, so @var{target} is interpreted as by
143 that function.
144
145 If <<NULL>> is returned then an error has occured. Possible errors
146 are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or
147 <<system_call>> error.
148*/
149
150bfd *
151bfd_openr (filename, target)
152 const char *filename;
153 const char *target;
154{
155 bfd *nbfd;
156 const bfd_target *target_vec;
157
158 nbfd = _bfd_new_bfd ();
159 if (nbfd == NULL)
160 return NULL;
161
162 target_vec = bfd_find_target (target, nbfd);
163 if (target_vec == NULL)
164 {
165 _bfd_delete_bfd (nbfd);
166 return NULL;
167 }
168
169 nbfd->filename = filename;
170 nbfd->direction = read_direction;
171
172 if (bfd_open_file (nbfd) == NULL)
173 {
174 /* File didn't exist, or some such. */
175 bfd_set_error (bfd_error_system_call);
176 _bfd_delete_bfd (nbfd);
177 return NULL;
178 }
179
180 return nbfd;
181}
182
183/* Don't try to `optimize' this function:
184
185 o - We lock using stack space so that interrupting the locking
186 won't cause a storage leak.
187 o - We open the file stream last, since we don't want to have to
188 close it if anything goes wrong. Closing the stream means closing
189 the file descriptor too, even though we didn't open it. */
190/*
191FUNCTION
192 bfd_fdopenr
193
194SYNOPSIS
195 bfd *bfd_fdopenr(const char *filename, const char *target, int fd);
196
197DESCRIPTION
198 <<bfd_fdopenr>> is to <<bfd_fopenr>> much like <<fdopen>> is to
199 <<fopen>>. It opens a BFD on a file already described by the
200 @var{fd} supplied.
201
202 When the file is later <<bfd_close>>d, the file descriptor will
203 be closed. If the caller desires that this file descriptor be
204 cached by BFD (opened as needed, closed as needed to free
205 descriptors for other opens), with the supplied @var{fd} used as
206 an initial file descriptor (but subject to closure at any time),
207 call bfd_set_cacheable(bfd, 1) on the returned BFD. The default
208 is to assume no cacheing; the file descriptor will remain open
209 until <<bfd_close>>, and will not be affected by BFD operations
210 on other files.
211
212 Possible errors are <<bfd_error_no_memory>>,
213 <<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
214*/
215
216bfd *
217bfd_fdopenr (filename, target, fd)
218 const char *filename;
219 const char *target;
220 int fd;
221{
222 bfd *nbfd;
223 const bfd_target *target_vec;
224 int fdflags;
225
226 bfd_set_error (bfd_error_system_call);
227#if ! defined(HAVE_FCNTL) || ! defined(F_GETFL)
228 fdflags = O_RDWR; /* Assume full access. */
229#else
230 fdflags = fcntl (fd, F_GETFL, NULL);
231#endif
232 if (fdflags == -1)
233 return NULL;
234
235 nbfd = _bfd_new_bfd ();
236 if (nbfd == NULL)
237 return NULL;
238
239 target_vec = bfd_find_target (target, nbfd);
240 if (target_vec == NULL)
241 {
242 _bfd_delete_bfd (nbfd);
243 return NULL;
244 }
245
246#ifndef HAVE_FDOPEN
247 nbfd->iostream = (PTR) fopen (filename, FOPEN_RB);
248#else
249 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
250 switch (fdflags & (O_ACCMODE))
251 {
252 case O_RDONLY: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RB); break;
253 case O_WRONLY: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RUB); break;
254 case O_RDWR: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RUB); break;
255 default: abort ();
256 }
257#endif
258
259 if (nbfd->iostream == NULL)
260 {
261 _bfd_delete_bfd (nbfd);
262 return NULL;
263 }
264
265 /* OK, put everything where it belongs. */
266 nbfd->filename = filename;
267
268 /* As a special case we allow a FD open for read/write to
269 be written through, although doing so requires that we end
270 the previous clause with a preposition. */
271 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
272 switch (fdflags & (O_ACCMODE))
273 {
274 case O_RDONLY: nbfd->direction = read_direction; break;
275 case O_WRONLY: nbfd->direction = write_direction; break;
276 case O_RDWR: nbfd->direction = both_direction; break;
277 default: abort ();
278 }
279
280 if (! bfd_cache_init (nbfd))
281 {
282 _bfd_delete_bfd (nbfd);
283 return NULL;
284 }
285 nbfd->opened_once = TRUE;
286
287 return nbfd;
288}
289
290/*
291FUNCTION
292 bfd_openstreamr
293
294SYNOPSIS
295 bfd *bfd_openstreamr(const char *, const char *, PTR);
296
297DESCRIPTION
298
299 Open a BFD for read access on an existing stdio stream. When
300 the BFD is passed to <<bfd_close>>, the stream will be closed.
301*/
302
303bfd *
304bfd_openstreamr (filename, target, streamarg)
305 const char *filename;
306 const char *target;
307 PTR streamarg;
308{
309 FILE *stream = (FILE *) streamarg;
310 bfd *nbfd;
311 const bfd_target *target_vec;
312
313 nbfd = _bfd_new_bfd ();
314 if (nbfd == NULL)
315 return NULL;
316
317 target_vec = bfd_find_target (target, nbfd);
318 if (target_vec == NULL)
319 {
320 _bfd_delete_bfd (nbfd);
321 return NULL;
322 }
323
324 nbfd->iostream = (PTR) stream;
325 nbfd->filename = filename;
326 nbfd->direction = read_direction;
327
328 if (! bfd_cache_init (nbfd))
329 {
330 _bfd_delete_bfd (nbfd);
331 return NULL;
332 }
333
334 return nbfd;
335}
336
337
338/* bfd_openw -- open for writing.
339 Returns a pointer to a freshly-allocated BFD on success, or NULL.
340
341 See comment by bfd_fdopenr before you try to modify this function. */
342
343/*
344FUNCTION
345 bfd_openw
346
347SYNOPSIS
348 bfd *bfd_openw(const char *filename, const char *target);
349
350DESCRIPTION
351 Create a BFD, associated with file @var{filename}, using the
352 file format @var{target}, and return a pointer to it.
353
354 Possible errors are <<bfd_error_system_call>>, <<bfd_error_no_memory>>,
355 <<bfd_error_invalid_target>>.
356*/
357
358bfd *
359bfd_openw (filename, target)
360 const char *filename;
361 const char *target;
362{
363 bfd *nbfd;
364 const bfd_target *target_vec;
365
366 /* nbfd has to point to head of malloc'ed block so that bfd_close may
367 reclaim it correctly. */
368 nbfd = _bfd_new_bfd ();
369 if (nbfd == NULL)
370 return NULL;
371
372 target_vec = bfd_find_target (target, nbfd);
373 if (target_vec == NULL)
374 {
375 _bfd_delete_bfd (nbfd);
376 return NULL;
377 }
378
379 nbfd->filename = filename;
380 nbfd->direction = write_direction;
381
382 if (bfd_open_file (nbfd) == NULL)
383 {
384 /* File not writeable, etc. */
385 bfd_set_error (bfd_error_system_call);
386 _bfd_delete_bfd (nbfd);
387 return NULL;
388 }
389
390 return nbfd;
391}
392
393/*
394
395FUNCTION
396 bfd_close
397
398SYNOPSIS
399 bfd_boolean bfd_close (bfd *abfd);
400
401DESCRIPTION
402
403 Close a BFD. If the BFD was open for writing, then pending
404 operations are completed and the file written out and closed.
405 If the created file is executable, then <<chmod>> is called
406 to mark it as such.
407
408 All memory attached to the BFD is released.
409
410 The file descriptor associated with the BFD is closed (even
411 if it was passed in to BFD by <<bfd_fdopenr>>).
412
413RETURNS
414 <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
415*/
416
417
418bfd_boolean
419bfd_close (abfd)
420 bfd *abfd;
421{
422 bfd_boolean ret;
423
424 if (bfd_write_p (abfd))
425 {
426 if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
427 return FALSE;
428 }
429
430 if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
431 return FALSE;
432
433 ret = bfd_cache_close (abfd);
434
435 /* If the file was open for writing and is now executable,
436 make it so. */
437 if (ret
438 && abfd->direction == write_direction
439 && abfd->flags & EXEC_P)
440 {
441 struct stat buf;
442
443 if (stat (abfd->filename, &buf) == 0)
444 {
445 unsigned int mask = umask (0);
446
447 umask (mask);
448 chmod (abfd->filename,
449 (0777
450 & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
451 }
452 }
453
454 _bfd_delete_bfd (abfd);
455
456 return ret;
457}
458
459/*
460FUNCTION
461 bfd_close_all_done
462
463SYNOPSIS
464 bfd_boolean bfd_close_all_done (bfd *);
465
466DESCRIPTION
467 Close a BFD. Differs from <<bfd_close>> since it does not
468 complete any pending operations. This routine would be used
469 if the application had just used BFD for swapping and didn't
470 want to use any of the writing code.
471
472 If the created file is executable, then <<chmod>> is called
473 to mark it as such.
474
475 All memory attached to the BFD is released.
476
477RETURNS
478 <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
479*/
480
481bfd_boolean
482bfd_close_all_done (abfd)
483 bfd *abfd;
484{
485 bfd_boolean ret;
486
487 ret = bfd_cache_close (abfd);
488
489 /* If the file was open for writing and is now executable,
490 make it so. */
491 if (ret
492 && abfd->direction == write_direction
493 && abfd->flags & EXEC_P)
494 {
495 struct stat buf;
496
497 if (stat (abfd->filename, &buf) == 0)
498 {
499 unsigned int mask = umask (0);
500
501 umask (mask);
502 chmod (abfd->filename,
503 (0777
504 & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
505 }
506 }
507
508 _bfd_delete_bfd (abfd);
509
510 return ret;
511}
512
513/*
514FUNCTION
515 bfd_create
516
517SYNOPSIS
518 bfd *bfd_create(const char *filename, bfd *templ);
519
520DESCRIPTION
521 Create a new BFD in the manner of <<bfd_openw>>, but without
522 opening a file. The new BFD takes the target from the target
523 used by @var{template}. The format is always set to <<bfd_object>>.
524*/
525
526bfd *
527bfd_create (filename, templ)
528 const char *filename;
529 bfd *templ;
530{
531 bfd *nbfd;
532
533 nbfd = _bfd_new_bfd ();
534 if (nbfd == NULL)
535 return NULL;
536 nbfd->filename = filename;
537 if (templ)
538 nbfd->xvec = templ->xvec;
539 nbfd->direction = no_direction;
540 bfd_set_format (nbfd, bfd_object);
541
542 return nbfd;
543}
544
545/*
546FUNCTION
547 bfd_make_writable
548
549SYNOPSIS
550 bfd_boolean bfd_make_writable (bfd *abfd);
551
552DESCRIPTION
553 Takes a BFD as created by <<bfd_create>> and converts it
554 into one like as returned by <<bfd_openw>>. It does this
555 by converting the BFD to BFD_IN_MEMORY. It's assumed that
556 you will call <<bfd_make_readable>> on this bfd later.
557
558RETURNS
559 <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
560*/
561
562bfd_boolean
563bfd_make_writable(abfd)
564 bfd *abfd;
565{
566 struct bfd_in_memory *bim;
567
568 if (abfd->direction != no_direction)
569 {
570 bfd_set_error (bfd_error_invalid_operation);
571 return FALSE;
572 }
573
574 bim = ((struct bfd_in_memory *)
575 bfd_malloc ((bfd_size_type) sizeof (struct bfd_in_memory)));
576 abfd->iostream = (PTR) bim;
577 /* bfd_bwrite will grow these as needed. */
578 bim->size = 0;
579 bim->buffer = 0;
580
581 abfd->flags |= BFD_IN_MEMORY;
582 abfd->direction = write_direction;
583 abfd->where = 0;
584
585 return TRUE;
586}
587
588/*
589FUNCTION
590 bfd_make_readable
591
592SYNOPSIS
593 bfd_boolean bfd_make_readable (bfd *abfd);
594
595DESCRIPTION
596 Takes a BFD as created by <<bfd_create>> and
597 <<bfd_make_writable>> and converts it into one like as
598 returned by <<bfd_openr>>. It does this by writing the
599 contents out to the memory buffer, then reversing the
600 direction.
601
602RETURNS
603 <<TRUE>> is returned if all is ok, otherwise <<FALSE>>. */
604
605bfd_boolean
606bfd_make_readable(abfd)
607 bfd *abfd;
608{
609 if (abfd->direction != write_direction || !(abfd->flags & BFD_IN_MEMORY))
610 {
611 bfd_set_error (bfd_error_invalid_operation);
612 return FALSE;
613 }
614
615 if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
616 return FALSE;
617
618 if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
619 return FALSE;
620
621
622 abfd->arch_info = &bfd_default_arch_struct;
623
624 abfd->where = 0;
625 abfd->format = bfd_unknown;
626 abfd->my_archive = (bfd *) NULL;
627 abfd->origin = 0;
628 abfd->opened_once = FALSE;
629 abfd->output_has_begun = FALSE;
630 abfd->section_count = 0;
631 abfd->usrdata = (PTR) NULL;
632 abfd->cacheable = FALSE;
633 abfd->flags = BFD_IN_MEMORY;
634 abfd->mtime_set = FALSE;
635
636 abfd->target_defaulted = TRUE;
637 abfd->direction = read_direction;
638 abfd->sections = 0;
639 abfd->symcount = 0;
640 abfd->outsymbols = 0;
641 abfd->tdata.any = 0;
642
643 bfd_section_list_clear (abfd);
644 bfd_check_format (abfd, bfd_object);
645
646 return TRUE;
647}
648
649/*
650INTERNAL_FUNCTION
651 bfd_alloc
652
653SYNOPSIS
654 PTR bfd_alloc (bfd *abfd, size_t wanted);
655
656DESCRIPTION
657 Allocate a block of @var{wanted} bytes of memory attached to
658 <<abfd>> and return a pointer to it.
659*/
660
661
662PTR
663bfd_alloc (abfd, size)
664 bfd *abfd;
665 bfd_size_type size;
666{
667 PTR ret;
668
669 if (size != (unsigned long) size)
670 {
671 bfd_set_error (bfd_error_no_memory);
672 return NULL;
673 }
674
675 ret = objalloc_alloc (abfd->memory, (unsigned long) size);
676 if (ret == NULL)
677 bfd_set_error (bfd_error_no_memory);
678 return ret;
679}
680
681PTR
682bfd_zalloc (abfd, size)
683 bfd *abfd;
684 bfd_size_type size;
685{
686 PTR res;
687
688 res = bfd_alloc (abfd, size);
689 if (res)
690 memset (res, 0, (size_t) size);
691 return res;
692}
693
694/* Free a block allocated for a BFD.
695 Note: Also frees all more recently allocated blocks! */
696
697void
698bfd_release (abfd, block)
699 bfd *abfd;
700 PTR block;
701{
702 objalloc_free_block ((struct objalloc *) abfd->memory, block);
703}
704
705
706/*
707 GNU Extension: separate debug-info files
708
709 The idea here is that a special section called .gnu_debuglink might be
710 embedded in a binary file, which indicates that some *other* file
711 contains the real debugging information. This special section contains a
712 filename and CRC32 checksum, which we read and resolve to another file,
713 if it exists.
714
715 This facilitates "optional" provision of debugging information, without
716 having to provide two complete copies of every binary object (with and
717 without debug symbols).
718*/
719
720static unsigned long calc_crc32 PARAMS ((unsigned long, const unsigned char *, size_t));
721static char * get_debug_link_info PARAMS ((bfd *, unsigned long *));
722static bfd_boolean separate_debug_file_exists PARAMS ((const char *, const unsigned long));
723static char * find_separate_debug_file PARAMS ((bfd *, const char *));
724
725/*
726INTERNAL_FUNCTION
727 calc_crc32
728
729SYNOPSIS
730 unsigned long calc_crc32 (unsigned long crc, const unsigned char *buf, size_t len);
731
732DESCRIPTION
733 Advance the CRC32 given by @var{crc} through @var{len}
734 bytes of @var{buf}. Return the updated CRC32 value.
735*/
736
737static unsigned long
738calc_crc32 (crc, buf, len)
739 unsigned long crc;
740 const unsigned char *buf;
741 size_t len;
742{
743 static const unsigned long crc32_table[256] =
744 {
745 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
746 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
747 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
748 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
749 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
750 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
751 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
752 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
753 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
754 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
755 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
756 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
757 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
758 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
759 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
760 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
761 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
762 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
763 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
764 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
765 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
766 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
767 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
768 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
769 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
770 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
771 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
772 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
773 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
774 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
775 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
776 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
777 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
778 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
779 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
780 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
781 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
782 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
783 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
784 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
785 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
786 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
787 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
788 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
789 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
790 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
791 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
792 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
793 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
794 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
795 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
796 0x2d02ef8d
797 };
798 const unsigned char *end;
799
800 crc = ~crc & 0xffffffff;
801 for (end = buf + len; buf < end; ++ buf)
802 crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
803 return ~crc & 0xffffffff;;
804}
805
806
807/*
808INTERNAL_FUNCTION
809 get_debug_link_info
810
811SYNOPSIS
812 char *get_debug_link_info (bfd *abfd, unsigned long *crc32_out)
813
814DESCRIPTION
815 fetch the filename and CRC32 value for any separate debuginfo
816 associated with @var{abfd}. Return NULL if no such info found,
817 otherwise return filename and update @var{crc32_out}.
818*/
819
820static char *
821get_debug_link_info (abfd, crc32_out)
822 bfd *abfd;
823 unsigned long *crc32_out;
824{
825 asection * sect;
826 bfd_size_type debuglink_size;
827 unsigned long crc32;
828 char * contents;
829 int crc_offset;
830 bfd_boolean ret;
831
832 BFD_ASSERT (abfd);
833 BFD_ASSERT (crc32_out);
834
835 sect = bfd_get_section_by_name (abfd, ".gnu_debuglink");
836
837 if (sect == NULL)
838 return NULL;
839
840 debuglink_size = bfd_section_size (abfd, sect);
841
842 contents = xmalloc (debuglink_size);
843 ret = bfd_get_section_contents (abfd, sect, contents,
844 (file_ptr)0, debuglink_size);
845 if (! ret)
846 {
847 free (contents);
848 return NULL;
849 }
850
851 /* Crc value is stored after the filename, aligned up to 4 bytes. */
852 crc_offset = strlen (contents) + 1;
853 crc_offset = (crc_offset + 3) & ~3;
854
855 crc32 = bfd_get_32 (abfd, (bfd_byte *) (contents + crc_offset));
856
857 *crc32_out = crc32;
858 return contents;
859}
860
861/*
862INTERNAL_FUNCTION
863 separate_debug_file_exists
864
865SYNOPSIS
866 bfd_boolean separate_debug_file_exists (char * name, unsigned long crc32)
867
868DESCRIPTION
869 Checks to see if @var{name} is a file and if its contents
870 match @var{crc32}.
871*/
872
873static bfd_boolean
874separate_debug_file_exists (name, crc)
875 const char *name;
876 const unsigned long crc;
877{
878 static char buffer [8 * 1024];
879 unsigned long file_crc = 0;
880 int fd;
881 int count;
882
883 BFD_ASSERT (name);
884
885 fd = open (name, O_RDONLY);
886 if (fd < 0)
887 return FALSE;
888
889 while ((count = read (fd, buffer, sizeof (buffer))) > 0)
890 file_crc = calc_crc32 (file_crc, buffer, count);
891
892 close (fd);
893
894 return crc == file_crc;
895}
896
897
898/*
899INTERNAL_FUNCTION
900 find_separate_debug_file
901
902SYNOPSIS
903 char * find_separate_debug_file (bfd *abfd)
904
905DESCRIPTION
906 Searches @var{abfd} for a reference to separate debugging
907 information, scans various locations in the filesystem, including
908 the file tree rooted at @var{debug_file_directory}, and returns a
909 filename of such debugging information if the file is found and has
910 matching CRC32. Returns NULL if no reference to debugging file
911 exists, or file cannot be found.
912*/
913
914static char *
915find_separate_debug_file (abfd, debug_file_directory)
916 bfd *abfd;
917 const char *debug_file_directory;
918{
919 char *basename;
920 char *dir;
921 char *debugfile;
922 unsigned long crc32;
923 int i;
924
925 BFD_ASSERT (abfd);
926 if (debug_file_directory == NULL)
927 debug_file_directory = ".";
928
929 /* BFD may have been opened from a stream. */
930 if (! abfd->filename)
931 return NULL;
932
933 basename = get_debug_link_info (abfd, & crc32);
934
935 if (basename == NULL)
936 return NULL;
937 if (strlen (basename) < 1)
938 {
939 free (basename);
940 return NULL;
941 }
942
943 dir = xstrdup (abfd->filename);
944 BFD_ASSERT (strlen (dir) != 0);
945
946 /* Strip off filename part. */
947 for (i = strlen (dir) - 1; i >= 0; i--)
948 if (IS_DIR_SEPARATOR (dir[i]))
949 break;
950
951 dir[i + 1] = '\0';
952 BFD_ASSERT (dir[i] == '/' || dir[0] == '\0')
953
954 debugfile = xmalloc (strlen (debug_file_directory) + 1
955 + strlen (dir)
956 + strlen (".debug/")
957 + strlen (basename)
958 + 1);
959
960 /* First try in the same directory as the original file: */
961 strcpy (debugfile, dir);
962 strcat (debugfile, basename);
963
964 if (separate_debug_file_exists (debugfile, crc32))
965 {
966 free (basename);
967 free (dir);
968 return debugfile;
969 }
970
971 /* Then try in a subdirectory called .debug. */
972 strcpy (debugfile, dir);
973 strcat (debugfile, ".debug/");
974 strcat (debugfile, basename);
975
976 if (separate_debug_file_exists (debugfile, crc32))
977 {
978 free (basename);
979 free (dir);
980 return debugfile;
981 }
982
983 /* Then try in the global debugfile directory. */
984 strcpy (debugfile, debug_file_directory);
985 i = strlen (debug_file_directory) - 1;
986 if (i > 0
987 && debug_file_directory[i] != '/'
988 && dir[0] != '/')
989 strcat (debugfile, "/");
990 strcat (debugfile, dir);
991 strcat (debugfile, basename);
992
993 if (separate_debug_file_exists (debugfile, crc32))
994 {
995 free (basename);
996 free (dir);
997 return debugfile;
998 }
999
1000 free (debugfile);
1001 free (basename);
1002 free (dir);
1003 return NULL;
1004}
1005
1006
1007/*
1008FUNCTION
1009 bfd_follow_gnu_debuglink
1010
1011SYNOPSIS
1012 char * bfd_follow_gnu_debuglink(bfd *abfd, const char *dir);
1013
1014DESCRIPTION
1015
1016 Takes a BFD and searches it for a .gnu_debuglink section. If this
1017 section is found, examines the section for the name and checksum of
1018 a '.debug' file containing auxiliary debugging
1019 information. Searches filesystem for .debug file in some standard
1020 locations, including the directory tree rooted at @var{dir}, and if
1021 found returns the full filename. If @var{dir} is NULL, will search
1022 default path configured into libbfd at build time.
1023
1024RETURNS
1025 <<NULL>> on any errors or failure to locate the .debug file,
1026 otherwise a pointer to a heap-allocated string containing the
1027 filename. The caller is responsible for freeing this string.
1028*/
1029
1030char *
1031bfd_follow_gnu_debuglink (abfd, dir)
1032 bfd *abfd;
1033 const char * dir;
1034{
1035#if 0 /* Disabled until DEBUGDIR can be defined by configure.in */
1036 if (dir == NULL)
1037 dir = DEBUGDIR;
1038#endif
1039 return find_separate_debug_file (abfd, dir);
1040}
Note: See TracBrowser for help on using the repository browser.