Merge from vendor branch GCC:
[dragonfly.git] / contrib / binutils-2.14 / bfd / opncls.c
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
42 static 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
49 bfd *
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
98 bfd *
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
116 void
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 /*
126 SECTION
127         Opening and closing BFDs
128
129 */
130
131 /*
132 FUNCTION
133         bfd_openr
134
135 SYNOPSIS
136         bfd *bfd_openr(const char *filename, const char *target);
137
138 DESCRIPTION
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
150 bfd *
151 bfd_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 /*
191 FUNCTION
192         bfd_fdopenr
193
194 SYNOPSIS
195         bfd *bfd_fdopenr(const char *filename, const char *target, int fd);
196
197 DESCRIPTION
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
216 bfd *
217 bfd_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 /*
291 FUNCTION
292         bfd_openstreamr
293
294 SYNOPSIS
295         bfd *bfd_openstreamr(const char *, const char *, PTR);
296
297 DESCRIPTION
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
303 bfd *
304 bfd_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 \f
337 /* bfd_openw -- open for writing.
338    Returns a pointer to a freshly-allocated BFD on success, or NULL.
339
340    See comment by bfd_fdopenr before you try to modify this function.  */
341
342 /*
343 FUNCTION
344         bfd_openw
345
346 SYNOPSIS
347         bfd *bfd_openw(const char *filename, const char *target);
348
349 DESCRIPTION
350         Create a BFD, associated with file @var{filename}, using the
351         file format @var{target}, and return a pointer to it.
352
353         Possible errors are <<bfd_error_system_call>>, <<bfd_error_no_memory>>,
354         <<bfd_error_invalid_target>>.
355 */
356
357 bfd *
358 bfd_openw (filename, target)
359      const char *filename;
360      const char *target;
361 {
362   bfd *nbfd;
363   const bfd_target *target_vec;
364
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 ();
368   if (nbfd == NULL)
369     return NULL;
370
371   target_vec = bfd_find_target (target, nbfd);
372   if (target_vec == NULL)
373     {
374       _bfd_delete_bfd (nbfd);
375       return NULL;
376     }
377
378   nbfd->filename = filename;
379   nbfd->direction = write_direction;
380
381   if (bfd_open_file (nbfd) == NULL)
382     {
383       /* File not writeable, etc.  */
384       bfd_set_error (bfd_error_system_call);
385       _bfd_delete_bfd (nbfd);
386       return NULL;
387   }
388
389   return nbfd;
390 }
391
392 /*
393
394 FUNCTION
395         bfd_close
396
397 SYNOPSIS
398         bfd_boolean bfd_close (bfd *abfd);
399
400 DESCRIPTION
401
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
405         to mark it as such.
406
407         All memory attached to the BFD is released.
408
409         The file descriptor associated with the BFD is closed (even
410         if it was passed in to BFD by <<bfd_fdopenr>>).
411
412 RETURNS
413         <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
414 */
415
416
417 bfd_boolean
418 bfd_close (abfd)
419      bfd *abfd;
420 {
421   bfd_boolean ret;
422
423   if (bfd_write_p (abfd))
424     {
425       if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
426         return FALSE;
427     }
428
429   if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
430     return FALSE;
431
432   ret = bfd_cache_close (abfd);
433
434   /* If the file was open for writing and is now executable,
435      make it so.  */
436   if (ret
437       && abfd->direction == write_direction
438       && abfd->flags & EXEC_P)
439     {
440       struct stat buf;
441
442       if (stat (abfd->filename, &buf) == 0)
443         {
444           unsigned int mask = umask (0);
445
446           umask (mask);
447           chmod (abfd->filename,
448                  (0777
449                   & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
450         }
451     }
452
453   _bfd_delete_bfd (abfd);
454
455   return ret;
456 }
457
458 /*
459 FUNCTION
460         bfd_close_all_done
461
462 SYNOPSIS
463         bfd_boolean bfd_close_all_done (bfd *);
464
465 DESCRIPTION
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.
470
471         If the created file is executable, then <<chmod>> is called
472         to mark it as such.
473
474         All memory attached to the BFD is released.
475
476 RETURNS
477         <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
478 */
479
480 bfd_boolean
481 bfd_close_all_done (abfd)
482      bfd *abfd;
483 {
484   bfd_boolean ret;
485
486   ret = bfd_cache_close (abfd);
487
488   /* If the file was open for writing and is now executable,
489      make it so.  */
490   if (ret
491       && abfd->direction == write_direction
492       && abfd->flags & EXEC_P)
493     {
494       struct stat buf;
495
496       if (stat (abfd->filename, &buf) == 0)
497         {
498           unsigned int mask = umask (0);
499
500           umask (mask);
501           chmod (abfd->filename,
502                  (0777
503                   & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
504         }
505     }
506
507   _bfd_delete_bfd (abfd);
508
509   return ret;
510 }
511
512 /*
513 FUNCTION
514         bfd_create
515
516 SYNOPSIS
517         bfd *bfd_create(const char *filename, bfd *templ);
518
519 DESCRIPTION
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>>.
523 */
524
525 bfd *
526 bfd_create (filename, templ)
527      const char *filename;
528      bfd *templ;
529 {
530   bfd *nbfd;
531
532   nbfd = _bfd_new_bfd ();
533   if (nbfd == NULL)
534     return NULL;
535   nbfd->filename = filename;
536   if (templ)
537     nbfd->xvec = templ->xvec;
538   nbfd->direction = no_direction;
539   bfd_set_format (nbfd, bfd_object);
540
541   return nbfd;
542 }
543
544 /*
545 FUNCTION
546         bfd_make_writable
547
548 SYNOPSIS
549         bfd_boolean bfd_make_writable (bfd *abfd);
550
551 DESCRIPTION
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.
556
557 RETURNS
558         <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
559 */
560
561 bfd_boolean
562 bfd_make_writable(abfd)
563      bfd *abfd;
564 {
565   struct bfd_in_memory *bim;
566
567   if (abfd->direction != no_direction)
568     {
569       bfd_set_error (bfd_error_invalid_operation);
570       return FALSE;
571     }
572
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.  */
577   bim->size = 0;
578   bim->buffer = 0;
579
580   abfd->flags |= BFD_IN_MEMORY;
581   abfd->direction = write_direction;
582   abfd->where = 0;
583
584   return TRUE;
585 }
586
587 /*
588 FUNCTION
589         bfd_make_readable
590
591 SYNOPSIS
592         bfd_boolean bfd_make_readable (bfd *abfd);
593
594 DESCRIPTION
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
599         direction.
600
601 RETURNS
602         <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.  */
603
604 bfd_boolean
605 bfd_make_readable(abfd)
606      bfd *abfd;
607 {
608   if (abfd->direction != write_direction || !(abfd->flags & BFD_IN_MEMORY))
609     {
610       bfd_set_error (bfd_error_invalid_operation);
611       return FALSE;
612     }
613
614   if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
615     return FALSE;
616
617   if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
618     return FALSE;
619
620
621   abfd->arch_info = &bfd_default_arch_struct;
622
623   abfd->where = 0;
624   abfd->format = bfd_unknown;
625   abfd->my_archive = (bfd *) NULL;
626   abfd->origin = 0;
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;
634
635   abfd->target_defaulted = TRUE;
636   abfd->direction = read_direction;
637   abfd->sections = 0;
638   abfd->symcount = 0;
639   abfd->outsymbols = 0;
640   abfd->tdata.any = 0;
641
642   bfd_section_list_clear (abfd);
643   bfd_check_format (abfd, bfd_object);
644
645   return TRUE;
646 }
647
648 /*
649 INTERNAL_FUNCTION
650         bfd_alloc
651
652 SYNOPSIS
653         PTR bfd_alloc (bfd *abfd, size_t wanted);
654
655 DESCRIPTION
656         Allocate a block of @var{wanted} bytes of memory attached to
657         <<abfd>> and return a pointer to it.
658 */
659
660
661 PTR
662 bfd_alloc (abfd, size)
663      bfd *abfd;
664      bfd_size_type size;
665 {
666   PTR ret;
667
668   if (size != (unsigned long) size)
669     {
670       bfd_set_error (bfd_error_no_memory);
671       return NULL;
672     }
673
674   ret = objalloc_alloc (abfd->memory, (unsigned long) size);
675   if (ret == NULL)
676     bfd_set_error (bfd_error_no_memory);
677   return ret;
678 }
679
680 PTR
681 bfd_zalloc (abfd, size)
682      bfd *abfd;
683      bfd_size_type size;
684 {
685   PTR res;
686
687   res = bfd_alloc (abfd, size);
688   if (res)
689     memset (res, 0, (size_t) size);
690   return res;
691 }
692
693 /* Free a block allocated for a BFD.
694    Note:  Also frees all more recently allocated blocks!  */
695
696 void
697 bfd_release (abfd, block)
698      bfd *abfd;
699      PTR block;
700 {
701   objalloc_free_block ((struct objalloc *) abfd->memory, block);
702 }
703
704
705 /* 
706    GNU Extension: separate debug-info files 
707    
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,
712    if it exists.
713
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).
717 */
718
719 static unsigned long  calc_crc32                  PARAMS ((unsigned long, const unsigned char *, size_t));
720 static char *         get_debug_link_info         PARAMS ((bfd *, unsigned long *));
721 static bfd_boolean    separate_debug_file_exists  PARAMS ((const char *, const unsigned long));
722 static char *         find_separate_debug_file    PARAMS ((bfd *, const char *));
723
724 /*
725 INTERNAL_FUNCTION
726         calc_crc32
727
728 SYNOPSIS
729         unsigned long calc_crc32 (unsigned long crc, const unsigned char *buf, size_t len);
730
731 DESCRIPTION
732         Advance the CRC32 given by @var{crc} through @var{len}
733         bytes of @var{buf}. Return the updated CRC32 value.
734 */     
735
736 static unsigned long
737 calc_crc32 (crc, buf, len)
738      unsigned long crc;
739      const unsigned char *buf;
740      size_t len;
741 {
742   static const unsigned long crc32_table[256] =
743     {
744       0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
745       0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
746       0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
747       0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
748       0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
749       0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
750       0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
751       0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
752       0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
753       0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
754       0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
755       0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
756       0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
757       0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
758       0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
759       0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
760       0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
761       0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
762       0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
763       0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
764       0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
765       0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
766       0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
767       0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
768       0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
769       0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
770       0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
771       0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
772       0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
773       0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
774       0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
775       0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
776       0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
777       0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
778       0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
779       0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
780       0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
781       0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
782       0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
783       0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
784       0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
785       0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
786       0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
787       0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
788       0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
789       0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
790       0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
791       0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
792       0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
793       0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
794       0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
795       0x2d02ef8d
796     };
797   const unsigned char *end;
798
799   crc = ~crc & 0xffffffff;
800   for (end = buf + len; buf < end; ++ buf)
801     crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
802   return ~crc & 0xffffffff;;
803 }
804
805
806 /*
807 INTERNAL_FUNCTION
808         get_debug_link_info
809
810 SYNOPSIS
811         char *get_debug_link_info (bfd *abfd, unsigned long *crc32_out)
812
813 DESCRIPTION
814         fetch the filename and CRC32 value for any separate debuginfo
815         associated with @var{abfd}. Return NULL if no such info found,
816         otherwise return filename and update @var{crc32_out}.
817 */
818
819 static char *
820 get_debug_link_info (abfd, crc32_out)
821      bfd *abfd;
822      unsigned long *crc32_out;
823 {
824   asection * sect;
825   bfd_size_type debuglink_size;
826   unsigned long crc32;
827   char * contents;
828   int crc_offset;
829   bfd_boolean ret;
830
831   BFD_ASSERT (abfd);
832   BFD_ASSERT (crc32_out);
833
834   sect = bfd_get_section_by_name (abfd, ".gnu_debuglink");
835
836   if (sect == NULL)
837     return NULL;
838
839   debuglink_size = bfd_section_size (abfd, sect);  
840
841   contents = xmalloc (debuglink_size);
842   ret = bfd_get_section_contents (abfd, sect, contents,
843                                   (file_ptr)0, debuglink_size);
844   if (! ret)
845     {
846       free (contents);
847       return NULL;
848     }
849
850   /* Crc value is stored after the filename, aligned up to 4 bytes.  */
851   crc_offset = strlen (contents) + 1;
852   crc_offset = (crc_offset + 3) & ~3;
853
854   crc32 = bfd_get_32 (abfd, (bfd_byte *) (contents + crc_offset));
855
856   *crc32_out = crc32;
857   return contents;
858 }
859
860 /*
861 INTERNAL_FUNCTION
862         separate_debug_file_exists
863
864 SYNOPSIS
865         bfd_boolean separate_debug_file_exists (char * name, unsigned long crc32)
866
867 DESCRIPTION
868         Checks to see if @var{name} is a file and if its contents
869         match @var{crc32}.
870 */
871
872 static bfd_boolean
873 separate_debug_file_exists (name, crc)
874      const char *name;
875      const unsigned long crc;
876 {
877   static char buffer [8 * 1024];
878   unsigned long file_crc = 0;
879   int fd;
880   int count;
881
882   BFD_ASSERT (name);
883
884   fd = open (name, O_RDONLY);
885   if (fd < 0)
886     return FALSE;
887
888   while ((count = read (fd, buffer, sizeof (buffer))) > 0)
889     file_crc = calc_crc32 (file_crc, buffer, count);
890
891   close (fd);
892
893   return crc == file_crc;
894 }
895
896
897 /*
898 INTERNAL_FUNCTION
899         find_separate_debug_file
900
901 SYNOPSIS
902         char * find_separate_debug_file (bfd *abfd)
903
904 DESCRIPTION
905         Searches @var{abfd} for a reference to separate debugging
906         information, scans various locations in the filesystem, including
907         the file tree rooted at @var{debug_file_directory}, and returns a
908         filename of such debugging information if the file is found and has
909         matching CRC32.  Returns NULL if no reference to debugging file
910         exists, or file cannot be found.
911 */
912
913 static char *
914 find_separate_debug_file (abfd, debug_file_directory)
915      bfd *abfd;
916      const char *debug_file_directory;
917 {
918   char *basename;
919   char *dir;
920   char *debugfile;
921   unsigned long crc32;
922   int i;
923
924   BFD_ASSERT (abfd);
925   if (debug_file_directory == NULL)
926     debug_file_directory = ".";
927
928   /* BFD may have been opened from a stream.  */
929   if (! abfd->filename)
930     return NULL;
931
932   basename = get_debug_link_info (abfd, & crc32);
933
934   if (basename == NULL)
935     return NULL;
936   if (strlen (basename) < 1)
937     {
938       free (basename);
939       return NULL;
940     }
941
942   dir = xstrdup (abfd->filename);
943   BFD_ASSERT (strlen (dir) != 0);
944   
945   /* Strip off filename part.  */
946   for (i = strlen (dir) - 1; i >= 0; i--)
947     if (IS_DIR_SEPARATOR (dir[i]))
948       break;
949   
950   dir[i + 1] = '\0';
951   BFD_ASSERT (dir[i] == '/' || dir[0] == '\0')
952
953   debugfile = xmalloc (strlen (debug_file_directory) + 1
954                        + strlen (dir)
955                        + strlen (".debug/")
956                        + strlen (basename) 
957                        + 1);
958
959   /* First try in the same directory as the original file:  */
960   strcpy (debugfile, dir);
961   strcat (debugfile, basename);
962
963   if (separate_debug_file_exists (debugfile, crc32))
964     {
965       free (basename);
966       free (dir);
967       return debugfile;
968     }
969
970   /* Then try in a subdirectory called .debug.  */
971   strcpy (debugfile, dir);
972   strcat (debugfile, ".debug/");
973   strcat (debugfile, basename);
974
975   if (separate_debug_file_exists (debugfile, crc32))
976     {
977       free (basename);
978       free (dir);
979       return debugfile;
980     }
981
982   /* Then try in the global debugfile directory.  */
983   strcpy (debugfile, debug_file_directory);
984   i = strlen (debug_file_directory) - 1;
985   if (i > 0
986       && debug_file_directory[i] != '/'
987       && dir[0] != '/')
988     strcat (debugfile, "/");
989   strcat (debugfile, dir);
990   strcat (debugfile, basename);
991
992   if (separate_debug_file_exists (debugfile, crc32))
993     {
994       free (basename);
995       free (dir);
996       return debugfile;
997     }
998
999   free (debugfile);
1000   free (basename);
1001   free (dir);
1002   return NULL;
1003 }
1004
1005
1006 /*
1007 FUNCTION
1008         bfd_follow_gnu_debuglink
1009
1010 SYNOPSIS
1011         char * bfd_follow_gnu_debuglink(bfd *abfd, const char *dir);
1012
1013 DESCRIPTION
1014
1015         Takes a BFD and searches it for a .gnu_debuglink section.  If this
1016         section is found, examines the section for the name and checksum of
1017         a '.debug' file containing auxiliary debugging
1018         information. Searches filesystem for .debug file in some standard
1019         locations, including the directory tree rooted at @var{dir}, and if
1020         found returns the full filename. If @var{dir} is NULL, will search
1021         default path configured into libbfd at build time.
1022
1023 RETURNS
1024         <<NULL>> on any errors or failure to locate the .debug file,
1025         otherwise a pointer to a heap-allocated string containing the
1026         filename. The caller is responsible for freeing this string.
1027 */
1028
1029 char *
1030 bfd_follow_gnu_debuglink (abfd, dir)
1031      bfd *abfd;
1032      const char * dir;
1033 {
1034 #if 0 /* Disabled until DEBUGDIR can be defined by configure.in  */
1035   if (dir == NULL)
1036     dir = DEBUGDIR;
1037 #endif
1038   return find_separate_debug_file (abfd, dir);
1039 }