1 /* opncls.c -- open and close a BFD.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
4 Free Software Foundation, Inc.
6 Written by Cygnus Support.
8 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
28 #include "libiberty.h"
31 #define S_IXUSR 0100 /* Execute by owner. */
34 #define S_IXGRP 0010 /* Execute by group. */
37 #define S_IXOTH 0001 /* Execute by others. */
40 /* Counter used to initialize the bfd identifier. */
42 static unsigned int _bfd_id_counter
= 0;
44 /* fdopen is a loser -- we should use stdio exclusively. Unfortunately
45 if we do that we can't use fcntl. */
47 /* Return a new BFD. All BFD's are allocated through this routine. */
54 nbfd
= (bfd
*) bfd_zmalloc ((bfd_size_type
) sizeof (bfd
));
58 nbfd
->id
= _bfd_id_counter
++;
60 nbfd
->memory
= (PTR
) objalloc_create ();
61 if (nbfd
->memory
== NULL
)
63 bfd_set_error (bfd_error_no_memory
);
68 nbfd
->arch_info
= &bfd_default_arch_struct
;
70 nbfd
->direction
= no_direction
;
71 nbfd
->iostream
= NULL
;
73 if (!bfd_hash_table_init_n (&nbfd
->section_htab
,
74 bfd_section_hash_newfunc
,
80 nbfd
->sections
= (asection
*) NULL
;
81 nbfd
->section_tail
= &nbfd
->sections
;
82 nbfd
->format
= bfd_unknown
;
83 nbfd
->my_archive
= (bfd
*) NULL
;
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
;
96 /* Allocate a new BFD as a member of archive OBFD. */
99 _bfd_new_bfd_contained_in (obfd
)
104 nbfd
= _bfd_new_bfd ();
107 nbfd
->xvec
= obfd
->xvec
;
108 nbfd
->my_archive
= obfd
;
109 nbfd
->direction
= read_direction
;
110 nbfd
->target_defaulted
= obfd
->target_defaulted
;
117 _bfd_delete_bfd (abfd
)
120 bfd_hash_table_free (&abfd
->section_htab
);
121 objalloc_free ((struct objalloc
*) abfd
->memory
);
127 Opening and closing BFDs
136 bfd *bfd_openr(const char *filename, const char *target);
139 Open the file @var{filename} (using <<fopen>>) with the target
140 @var{target}. Return a pointer to the created BFD.
142 Calls <<bfd_find_target>>, so @var{target} is interpreted as by
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.
151 bfd_openr (filename
, target
)
152 const char *filename
;
156 const bfd_target
*target_vec
;
158 nbfd
= _bfd_new_bfd ();
162 target_vec
= bfd_find_target (target
, nbfd
);
163 if (target_vec
== NULL
)
165 _bfd_delete_bfd (nbfd
);
169 nbfd
->filename
= filename
;
170 nbfd
->direction
= read_direction
;
172 if (bfd_open_file (nbfd
) == NULL
)
174 /* File didn't exist, or some such. */
175 bfd_set_error (bfd_error_system_call
);
176 _bfd_delete_bfd (nbfd
);
183 /* Don't try to `optimize' this function:
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. */
195 bfd *bfd_fdopenr(const char *filename, const char *target, int fd);
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
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
212 Possible errors are <<bfd_error_no_memory>>,
213 <<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
217 bfd_fdopenr (filename
, target
, fd
)
218 const char *filename
;
223 const bfd_target
*target_vec
;
226 bfd_set_error (bfd_error_system_call
);
227 #if ! defined(HAVE_FCNTL) || ! defined(F_GETFL)
228 fdflags
= O_RDWR
; /* Assume full access. */
230 fdflags
= fcntl (fd
, F_GETFL
, NULL
);
235 nbfd
= _bfd_new_bfd ();
239 target_vec
= bfd_find_target (target
, nbfd
);
240 if (target_vec
== NULL
)
242 _bfd_delete_bfd (nbfd
);
247 nbfd
->iostream
= (PTR
) fopen (filename
, FOPEN_RB
);
249 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
250 switch (fdflags
& (O_ACCMODE
))
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;
259 if (nbfd
->iostream
== NULL
)
261 _bfd_delete_bfd (nbfd
);
265 /* OK, put everything where it belongs. */
266 nbfd
->filename
= filename
;
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
))
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;
280 if (! bfd_cache_init (nbfd
))
282 _bfd_delete_bfd (nbfd
);
285 nbfd
->opened_once
= TRUE
;
295 bfd *bfd_openstreamr(const char *, const char *, PTR);
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.
304 bfd_openstreamr (filename
, target
, streamarg
)
305 const char *filename
;
309 FILE *stream
= (FILE *) streamarg
;
311 const bfd_target
*target_vec
;
313 nbfd
= _bfd_new_bfd ();
317 target_vec
= bfd_find_target (target
, nbfd
);
318 if (target_vec
== NULL
)
320 _bfd_delete_bfd (nbfd
);
324 nbfd
->iostream
= (PTR
) stream
;
325 nbfd
->filename
= filename
;
326 nbfd
->direction
= read_direction
;
328 if (! bfd_cache_init (nbfd
))
330 _bfd_delete_bfd (nbfd
);
337 /* bfd_openw -- open for writing.
338 Returns a pointer to a freshly-allocated BFD on success, or NULL.
340 See comment by bfd_fdopenr before you try to modify this function. */
347 bfd *bfd_openw(const char *filename, const char *target);
350 Create a BFD, associated with file @var{filename}, using the
351 file format @var{target}, and return a pointer to it.
353 Possible errors are <<bfd_error_system_call>>, <<bfd_error_no_memory>>,
354 <<bfd_error_invalid_target>>.
358 bfd_openw (filename
, target
)
359 const char *filename
;
363 const bfd_target
*target_vec
;
365 /* nbfd has to point to head of malloc'ed block so that bfd_close may
366 reclaim it correctly. */
367 nbfd
= _bfd_new_bfd ();
371 target_vec
= bfd_find_target (target
, nbfd
);
372 if (target_vec
== NULL
)
374 _bfd_delete_bfd (nbfd
);
378 nbfd
->filename
= filename
;
379 nbfd
->direction
= write_direction
;
381 if (bfd_open_file (nbfd
) == NULL
)
383 /* File not writeable, etc. */
384 bfd_set_error (bfd_error_system_call
);
385 _bfd_delete_bfd (nbfd
);
398 bfd_boolean bfd_close (bfd *abfd);
402 Close a BFD. If the BFD was open for writing, then pending
403 operations are completed and the file written out and closed.
404 If the created file is executable, then <<chmod>> is called
407 All memory attached to the BFD is released.
409 The file descriptor associated with the BFD is closed (even
410 if it was passed in to BFD by <<bfd_fdopenr>>).
413 <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
423 if (bfd_write_p (abfd
))
425 if (! BFD_SEND_FMT (abfd
, _bfd_write_contents
, (abfd
)))
429 if (! BFD_SEND (abfd
, _close_and_cleanup
, (abfd
)))
432 ret
= bfd_cache_close (abfd
);
434 /* If the file was open for writing and is now executable,
437 && abfd
->direction
== write_direction
438 && abfd
->flags
& EXEC_P
)
442 if (stat (abfd
->filename
, &buf
) == 0)
444 unsigned int mask
= umask (0);
447 chmod (abfd
->filename
,
449 & (buf
.st_mode
| ((S_IXUSR
| S_IXGRP
| S_IXOTH
) &~ mask
))));
453 _bfd_delete_bfd (abfd
);
463 bfd_boolean bfd_close_all_done (bfd *);
466 Close a BFD. Differs from <<bfd_close>> since it does not
467 complete any pending operations. This routine would be used
468 if the application had just used BFD for swapping and didn't
469 want to use any of the writing code.
471 If the created file is executable, then <<chmod>> is called
474 All memory attached to the BFD is released.
477 <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
481 bfd_close_all_done (abfd
)
486 ret
= bfd_cache_close (abfd
);
488 /* If the file was open for writing and is now executable,
491 && abfd
->direction
== write_direction
492 && abfd
->flags
& EXEC_P
)
496 if (stat (abfd
->filename
, &buf
) == 0)
498 unsigned int mask
= umask (0);
501 chmod (abfd
->filename
,
503 & (buf
.st_mode
| ((S_IXUSR
| S_IXGRP
| S_IXOTH
) &~ mask
))));
507 _bfd_delete_bfd (abfd
);
517 bfd *bfd_create(const char *filename, bfd *templ);
520 Create a new BFD in the manner of <<bfd_openw>>, but without
521 opening a file. The new BFD takes the target from the target
522 used by @var{template}. The format is always set to <<bfd_object>>.
526 bfd_create (filename
, templ
)
527 const char *filename
;
532 nbfd
= _bfd_new_bfd ();
535 nbfd
->filename
= filename
;
537 nbfd
->xvec
= templ
->xvec
;
538 nbfd
->direction
= no_direction
;
539 bfd_set_format (nbfd
, bfd_object
);
549 bfd_boolean bfd_make_writable (bfd *abfd);
552 Takes a BFD as created by <<bfd_create>> and converts it
553 into one like as returned by <<bfd_openw>>. It does this
554 by converting the BFD to BFD_IN_MEMORY. It's assumed that
555 you will call <<bfd_make_readable>> on this bfd later.
558 <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
562 bfd_make_writable(abfd
)
565 struct bfd_in_memory
*bim
;
567 if (abfd
->direction
!= no_direction
)
569 bfd_set_error (bfd_error_invalid_operation
);
573 bim
= ((struct bfd_in_memory
*)
574 bfd_malloc ((bfd_size_type
) sizeof (struct bfd_in_memory
)));
575 abfd
->iostream
= (PTR
) bim
;
576 /* bfd_bwrite will grow these as needed. */
580 abfd
->flags
|= BFD_IN_MEMORY
;
581 abfd
->direction
= write_direction
;
592 bfd_boolean bfd_make_readable (bfd *abfd);
595 Takes a BFD as created by <<bfd_create>> and
596 <<bfd_make_writable>> and converts it into one like as
597 returned by <<bfd_openr>>. It does this by writing the
598 contents out to the memory buffer, then reversing the
602 <<TRUE>> is returned if all is ok, otherwise <<FALSE>>. */
605 bfd_make_readable(abfd
)
608 if (abfd
->direction
!= write_direction
|| !(abfd
->flags
& BFD_IN_MEMORY
))
610 bfd_set_error (bfd_error_invalid_operation
);
614 if (! BFD_SEND_FMT (abfd
, _bfd_write_contents
, (abfd
)))
617 if (! BFD_SEND (abfd
, _close_and_cleanup
, (abfd
)))
621 abfd
->arch_info
= &bfd_default_arch_struct
;
624 abfd
->format
= bfd_unknown
;
625 abfd
->my_archive
= (bfd
*) NULL
;
627 abfd
->opened_once
= FALSE
;
628 abfd
->output_has_begun
= FALSE
;
629 abfd
->section_count
= 0;
630 abfd
->usrdata
= (PTR
) NULL
;
631 abfd
->cacheable
= FALSE
;
632 abfd
->flags
= BFD_IN_MEMORY
;
633 abfd
->mtime_set
= FALSE
;
635 abfd
->target_defaulted
= TRUE
;
636 abfd
->direction
= read_direction
;
639 abfd
->outsymbols
= 0;
642 bfd_section_list_clear (abfd
);
643 bfd_check_format (abfd
, bfd_object
);
653 PTR bfd_alloc (bfd *abfd, size_t wanted);
656 Allocate a block of @var{wanted} bytes of memory attached to
657 <<abfd>> and return a pointer to it.
662 bfd_alloc (abfd
, size
)
668 if (size
!= (unsigned long) size
)
670 bfd_set_error (bfd_error_no_memory
);
674 ret
= objalloc_alloc (abfd
->memory
, (unsigned long) size
);
676 bfd_set_error (bfd_error_no_memory
);
681 bfd_zalloc (abfd
, size
)
687 res
= bfd_alloc (abfd
, size
);
689 memset (res
, 0, (size_t) size
);
693 /* Free a block allocated for a BFD.
694 Note: Also frees all more recently allocated blocks! */
697 bfd_release (abfd
, block
)
701 objalloc_free_block ((struct objalloc
*) abfd
->memory
, block
);
706 GNU Extension: separate debug-info files
708 The idea here is that a special section called .gnu_debuglink might be
709 embedded in a binary file, which indicates that some *other* file
710 contains the real debugging information. This special section contains a
711 filename and CRC32 checksum, which we read and resolve to another file,
714 This facilitates "optional" provision of debugging information, without
715 having to provide two complete copies of every binary object (with and
716 without debug symbols).
719 static char * get_debug_link_info
PARAMS ((bfd
*, unsigned long *));
720 static bfd_boolean separate_debug_file_exists
PARAMS ((const char *, const unsigned long));
721 static char * find_separate_debug_file
PARAMS ((bfd
*, const char *));
723 #define GNU_DEBUGLINK ".gnu_debuglink"
726 bfd_calc_gnu_debuglink_crc32
729 unsigned long bfd_calc_gnu_debuglink_crc32 (unsigned long crc, const unsigned char *buf, bfd_size_type len);
732 Computes a CRC value as used in the .gnu_debuglink section.
733 Advances the previously computed @var{crc} value by computing
734 and adding in the crc32 for @var{len} bytes of @var{buf}.
737 Return the updated CRC32 value.
741 bfd_calc_gnu_debuglink_crc32 (crc
, buf
, len
)
743 const unsigned char *buf
;
746 static const unsigned long crc32_table
[256] =
748 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
749 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
750 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
751 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
752 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
753 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
754 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
755 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
756 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
757 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
758 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
759 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
760 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
761 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
762 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
763 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
764 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
765 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
766 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
767 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
768 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
769 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
770 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
771 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
772 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
773 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
774 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
775 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
776 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
777 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
778 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
779 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
780 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
781 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
782 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
783 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
784 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
785 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
786 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
787 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
788 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
789 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
790 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
791 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
792 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
793 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
794 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
795 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
796 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
797 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
798 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
801 const unsigned char *end
;
803 crc
= ~crc
& 0xffffffff;
804 for (end
= buf
+ len
; buf
< end
; ++ buf
)
805 crc
= crc32_table
[(crc
^ *buf
) & 0xff] ^ (crc
>> 8);
806 return ~crc
& 0xffffffff;;
815 char * get_debug_link_info (bfd * abfd, unsigned long * crc32_out)
818 fetch the filename and CRC32 value for any separate debuginfo
819 associated with @var{abfd}. Return NULL if no such info found,
820 otherwise return filename and update @var{crc32_out}.
824 get_debug_link_info (abfd
, crc32_out
)
826 unsigned long * crc32_out
;
829 bfd_size_type debuglink_size
;
836 BFD_ASSERT (crc32_out
);
838 sect
= bfd_get_section_by_name (abfd
, GNU_DEBUGLINK
);
843 debuglink_size
= bfd_section_size (abfd
, sect
);
845 contents
= malloc (debuglink_size
);
846 if (contents
== NULL
)
849 ret
= bfd_get_section_contents (abfd
, sect
, contents
,
850 (file_ptr
)0, debuglink_size
);
857 /* Crc value is stored after the filename, aligned up to 4 bytes. */
858 crc_offset
= strlen (contents
) + 1;
859 crc_offset
= (crc_offset
+ 3) & ~3;
861 crc32
= bfd_get_32 (abfd
, (bfd_byte
*) (contents
+ crc_offset
));
869 separate_debug_file_exists
872 bfd_boolean separate_debug_file_exists (char * name, unsigned long crc32)
875 Checks to see if @var{name} is a file and if its contents
880 separate_debug_file_exists (name
, crc
)
882 const unsigned long crc
;
884 static char buffer
[8 * 1024];
885 unsigned long file_crc
= 0;
891 fd
= open (name
, O_RDONLY
);
895 while ((count
= read (fd
, buffer
, sizeof (buffer
))) > 0)
896 file_crc
= bfd_calc_gnu_debuglink_crc32 (file_crc
, buffer
, count
);
900 return crc
== file_crc
;
906 find_separate_debug_file
909 char * find_separate_debug_file (bfd *abfd)
912 Searches @var{abfd} for a reference to separate debugging
913 information, scans various locations in the filesystem, including
914 the file tree rooted at @var{debug_file_directory}, and returns a
915 filename of such debugging information if the file is found and has
916 matching CRC32. Returns NULL if no reference to debugging file
917 exists, or file cannot be found.
921 find_separate_debug_file (abfd
, debug_file_directory
)
923 const char *debug_file_directory
;
932 if (debug_file_directory
== NULL
)
933 debug_file_directory
= ".";
935 /* BFD may have been opened from a stream. */
936 if (! abfd
->filename
)
939 basename
= get_debug_link_info (abfd
, & crc32
);
940 if (basename
== NULL
)
943 if (strlen (basename
) < 1)
949 dir
= strdup (abfd
->filename
);
955 BFD_ASSERT (strlen (dir
) != 0);
957 /* Strip off filename part. */
958 for (i
= strlen (dir
) - 1; i
>= 0; i
--)
959 if (IS_DIR_SEPARATOR (dir
[i
]))
963 BFD_ASSERT (dir
[i
] == '/' || dir
[0] == '\0')
965 debugfile
= malloc (strlen (debug_file_directory
) + 1
970 if (debugfile
== NULL
)
977 /* First try in the same directory as the original file: */
978 strcpy (debugfile
, dir
);
979 strcat (debugfile
, basename
);
981 if (separate_debug_file_exists (debugfile
, crc32
))
988 /* Then try in a subdirectory called .debug. */
989 strcpy (debugfile
, dir
);
990 strcat (debugfile
, ".debug/");
991 strcat (debugfile
, basename
);
993 if (separate_debug_file_exists (debugfile
, crc32
))
1000 /* Then try in the global debugfile directory. */
1001 strcpy (debugfile
, debug_file_directory
);
1002 i
= strlen (debug_file_directory
) - 1;
1004 && debug_file_directory
[i
] != '/'
1006 strcat (debugfile
, "/");
1007 strcat (debugfile
, dir
);
1008 strcat (debugfile
, basename
);
1010 if (separate_debug_file_exists (debugfile
, crc32
))
1026 bfd_follow_gnu_debuglink
1029 char * bfd_follow_gnu_debuglink(bfd *abfd, const char *dir);
1033 Takes a BFD and searches it for a .gnu_debuglink section. If this
1034 section is found, examines the section for the name and checksum of
1035 a '.debug' file containing auxiliary debugging
1036 information. Searches filesystem for .debug file in some standard
1037 locations, including the directory tree rooted at @var{dir}, and if
1038 found returns the full filename. If @var{dir} is NULL, will search
1039 default path configured into libbfd at build time.
1042 <<NULL>> on any errors or failure to locate the .debug file,
1043 otherwise a pointer to a heap-allocated string containing the
1044 filename. The caller is responsible for freeing this string.
1048 bfd_follow_gnu_debuglink (abfd
, dir
)
1052 #if 0 /* Disabled until DEBUGDIR can be defined by configure.in */
1056 return find_separate_debug_file (abfd
, dir
);
1061 bfd_create_gnu_debuglink_section
1064 struct sec * bfd_create_gnu_debuglink_section (bfd * abfd, const char * filename);
1068 Takes a @var{BFD} and adds a .gnu_debuglink section to it. The section is sized
1069 to be big enough to contain a link to the specified @var{filename}.
1072 A pointer to the new section is returned if all is ok. Otherwise <<NULL>> is
1073 returned and bfd_error is set.
1077 bfd_create_gnu_debuglink_section
1079 const char * filename
)
1082 bfd_size_type debuglink_size
;
1084 if (abfd
== NULL
|| filename
== NULL
)
1086 bfd_set_error (bfd_error_invalid_operation
);
1090 /* Strip off any path components in filename. */
1091 filename
= lbasename (filename
);
1093 sect
= bfd_get_section_by_name (abfd
, GNU_DEBUGLINK
);
1096 /* Section already exists. */
1097 bfd_set_error (bfd_error_invalid_operation
);
1101 sect
= bfd_make_section (abfd
, GNU_DEBUGLINK
);
1105 if (! bfd_set_section_flags (abfd
, sect
,
1106 SEC_HAS_CONTENTS
| SEC_READONLY
| SEC_DEBUGGING
))
1107 /* XXX Should we delete the section from the bfd ? */
1111 debuglink_size
= strlen (filename
) + 1;
1112 debuglink_size
+= 3;
1113 debuglink_size
&= ~3;
1114 debuglink_size
+= 4;
1116 if (! bfd_set_section_size (abfd
, sect
, debuglink_size
))
1117 /* XXX Should we delete the section from the bfd ? */
1126 bfd_fill_in_gnu_debuglink_section
1129 bfd_boolean bfd_fill_in_gnu_debuglink_section (bfd * abfd, struct sec * sect, const char * filename);
1133 Takes a @var{BFD} and containing a .gnu_debuglink section @var{SECT}
1134 and fills in the contents of the section to contain a link to the
1135 specified @var{filename}. The filename should be relative to the
1139 <<TRUE>> is returned if all is ok. Otherwise <<FALSE>> is returned
1140 and bfd_error is set.
1144 bfd_fill_in_gnu_debuglink_section
1147 const char * filename
)
1149 bfd_size_type debuglink_size
;
1150 unsigned long crc32
;
1152 bfd_size_type crc_offset
;
1154 static char buffer
[8 * 1024];
1157 if (abfd
== NULL
|| sect
== NULL
|| filename
== NULL
)
1159 bfd_set_error (bfd_error_invalid_operation
);
1163 /* Make sure that we can read the file.
1164 XXX - Should we attempt to locate the debug info file using the same
1165 algorithm as gdb ? At the moment, since we are creating the
1166 .gnu_debuglink section, we insist upon the user providing us with a
1167 correct-for-section-creation-time path, but this need not conform to
1168 the gdb location algorithm. */
1169 handle
= fopen (filename
, FOPEN_RB
);
1172 bfd_set_error (bfd_error_system_call
);
1177 while ((count
= fread (buffer
, 1, sizeof buffer
, handle
)) > 0)
1178 crc32
= bfd_calc_gnu_debuglink_crc32 (crc32
, buffer
, count
);
1181 /* Strip off any path components in filename,
1182 now that we no longer need them. */
1183 filename
= lbasename (filename
);
1185 debuglink_size
= strlen (filename
) + 1;
1186 debuglink_size
+= 3;
1187 debuglink_size
&= ~3;
1188 debuglink_size
+= 4;
1190 contents
= malloc (debuglink_size
);
1191 if (contents
== NULL
)
1193 /* XXX Should we delete the section from the bfd ? */
1194 bfd_set_error (bfd_error_no_memory
);
1198 strcpy (contents
, filename
);
1199 crc_offset
= debuglink_size
- 4;
1201 bfd_put_32 (abfd
, crc32
, (bfd_byte
*) (contents
+ crc_offset
));
1203 if (! bfd_set_section_contents (abfd
, sect
, contents
,
1204 (file_ptr
)0, debuglink_size
))
1206 /* XXX Should we delete the section from the bfd ? */