opncls.c revision 1.1.1.2 1 /* opncls.c -- open and close a BFD.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012
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 3 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., 51 Franklin Street - Fifth Floor, Boston,
23 MA 02110-1301, USA. */
24
25 #include "sysdep.h"
26 #include "bfd.h"
27 #include "objalloc.h"
28 #include "libbfd.h"
29 #include "libiberty.h"
30
31 #ifndef S_IXUSR
32 #define S_IXUSR 0100 /* Execute by owner. */
33 #endif
34 #ifndef S_IXGRP
35 #define S_IXGRP 0010 /* Execute by group. */
36 #endif
37 #ifndef S_IXOTH
38 #define S_IXOTH 0001 /* Execute by others. */
39 #endif
40
41 /* Counters used to initialize the bfd identifier. */
42
43 static unsigned int bfd_id_counter = 0;
44 static unsigned int bfd_reserved_id_counter = 0;
45
46 /*
47 CODE_FRAGMENT
48 .{* Set to N to open the next N BFDs using an alternate id space. *}
49 .extern unsigned int bfd_use_reserved_id;
50 */
51 unsigned int bfd_use_reserved_id = 0;
52
53 /* fdopen is a loser -- we should use stdio exclusively. Unfortunately
54 if we do that we can't use fcntl. */
55
56 /* Return a new BFD. All BFD's are allocated through this routine. */
57
58 bfd *
59 _bfd_new_bfd (void)
60 {
61 bfd *nbfd;
62
63 nbfd = (bfd *) bfd_zmalloc (sizeof (bfd));
64 if (nbfd == NULL)
65 return NULL;
66
67 if (bfd_use_reserved_id)
68 {
69 nbfd->id = --bfd_reserved_id_counter;
70 --bfd_use_reserved_id;
71 }
72 else
73 nbfd->id = bfd_id_counter++;
74
75 nbfd->memory = objalloc_create ();
76 if (nbfd->memory == NULL)
77 {
78 bfd_set_error (bfd_error_no_memory);
79 free (nbfd);
80 return NULL;
81 }
82
83 nbfd->arch_info = &bfd_default_arch_struct;
84
85 nbfd->direction = no_direction;
86 nbfd->iostream = NULL;
87 nbfd->where = 0;
88 if (!bfd_hash_table_init_n (& nbfd->section_htab, bfd_section_hash_newfunc,
89 sizeof (struct section_hash_entry), 13))
90 {
91 free (nbfd);
92 return NULL;
93 }
94 nbfd->sections = NULL;
95 nbfd->section_last = NULL;
96 nbfd->format = bfd_unknown;
97 nbfd->my_archive = NULL;
98 nbfd->origin = 0;
99 nbfd->opened_once = FALSE;
100 nbfd->output_has_begun = FALSE;
101 nbfd->section_count = 0;
102 nbfd->usrdata = NULL;
103 nbfd->cacheable = FALSE;
104 nbfd->flags = BFD_NO_FLAGS;
105 nbfd->mtime_set = FALSE;
106
107 return nbfd;
108 }
109
110 static const struct bfd_iovec opncls_iovec;
111
112 /* Allocate a new BFD as a member of archive OBFD. */
113
114 bfd *
115 _bfd_new_bfd_contained_in (bfd *obfd)
116 {
117 bfd *nbfd;
118
119 nbfd = _bfd_new_bfd ();
120 if (nbfd == NULL)
121 return NULL;
122 nbfd->xvec = obfd->xvec;
123 nbfd->iovec = obfd->iovec;
124 if (obfd->iovec == &opncls_iovec)
125 nbfd->iostream = obfd->iostream;
126 nbfd->my_archive = obfd;
127 nbfd->direction = read_direction;
128 nbfd->target_defaulted = obfd->target_defaulted;
129 return nbfd;
130 }
131
132 /* Delete a BFD. */
133
134 static void
135 _bfd_delete_bfd (bfd *abfd)
136 {
137 if (abfd->memory)
138 {
139 bfd_hash_table_free (&abfd->section_htab);
140 objalloc_free ((struct objalloc *) abfd->memory);
141 }
142
143 free (abfd->arelt_data);
144 free (abfd);
145 }
146
147 /* Free objalloc memory. */
148
149 bfd_boolean
150 _bfd_free_cached_info (bfd *abfd)
151 {
152 if (abfd->memory)
153 {
154 bfd_hash_table_free (&abfd->section_htab);
155 objalloc_free ((struct objalloc *) abfd->memory);
156
157 abfd->sections = NULL;
158 abfd->section_last = NULL;
159 abfd->outsymbols = NULL;
160 abfd->tdata.any = NULL;
161 abfd->usrdata = NULL;
162 abfd->memory = NULL;
163 }
164
165 return TRUE;
166 }
167
168 /*
169 SECTION
170 Opening and closing BFDs
171
172 SUBSECTION
173 Functions for opening and closing
174 */
175
176 /*
177 FUNCTION
178 bfd_fopen
179
180 SYNOPSIS
181 bfd *bfd_fopen (const char *filename, const char *target,
182 const char *mode, int fd);
183
184 DESCRIPTION
185 Open the file @var{filename} with the target @var{target}.
186 Return a pointer to the created BFD. If @var{fd} is not -1,
187 then <<fdopen>> is used to open the file; otherwise, <<fopen>>
188 is used. @var{mode} is passed directly to <<fopen>> or
189 <<fdopen>>.
190
191 Calls <<bfd_find_target>>, so @var{target} is interpreted as by
192 that function.
193
194 The new BFD is marked as cacheable iff @var{fd} is -1.
195
196 If <<NULL>> is returned then an error has occured. Possible errors
197 are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or
198 <<system_call>> error.
199
200 On error, @var{fd} is always closed.
201 */
202
203 bfd *
204 bfd_fopen (const char *filename, const char *target, const char *mode, int fd)
205 {
206 bfd *nbfd;
207 const bfd_target *target_vec;
208
209 nbfd = _bfd_new_bfd ();
210 if (nbfd == NULL)
211 {
212 if (fd != -1)
213 close (fd);
214 return NULL;
215 }
216
217 target_vec = bfd_find_target (target, nbfd);
218 if (target_vec == NULL)
219 {
220 if (fd != -1)
221 close (fd);
222 _bfd_delete_bfd (nbfd);
223 return NULL;
224 }
225
226 #ifdef HAVE_FDOPEN
227 if (fd != -1)
228 nbfd->iostream = fdopen (fd, mode);
229 else
230 #endif
231 nbfd->iostream = real_fopen (filename, mode);
232 if (nbfd->iostream == NULL)
233 {
234 bfd_set_error (bfd_error_system_call);
235 _bfd_delete_bfd (nbfd);
236 return NULL;
237 }
238
239 /* OK, put everything where it belongs. */
240 nbfd->filename = filename;
241
242 /* Figure out whether the user is opening the file for reading,
243 writing, or both, by looking at the MODE argument. */
244 if ((mode[0] == 'r' || mode[0] == 'w' || mode[0] == 'a')
245 && mode[1] == '+')
246 nbfd->direction = both_direction;
247 else if (mode[0] == 'r')
248 nbfd->direction = read_direction;
249 else
250 nbfd->direction = write_direction;
251
252 if (! bfd_cache_init (nbfd))
253 {
254 _bfd_delete_bfd (nbfd);
255 return NULL;
256 }
257 nbfd->opened_once = TRUE;
258 /* If we opened the file by name, mark it cacheable; we can close it
259 and reopen it later. However, if a file descriptor was provided,
260 then it may have been opened with special flags that make it
261 unsafe to close and reopen the file. */
262 if (fd == -1)
263 bfd_set_cacheable (nbfd, TRUE);
264
265 return nbfd;
266 }
267
268 /*
269 FUNCTION
270 bfd_openr
271
272 SYNOPSIS
273 bfd *bfd_openr (const char *filename, const char *target);
274
275 DESCRIPTION
276 Open the file @var{filename} (using <<fopen>>) with the target
277 @var{target}. Return a pointer to the created BFD.
278
279 Calls <<bfd_find_target>>, so @var{target} is interpreted as by
280 that function.
281
282 If <<NULL>> is returned then an error has occured. Possible errors
283 are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or
284 <<system_call>> error.
285 */
286
287 bfd *
288 bfd_openr (const char *filename, const char *target)
289 {
290 return bfd_fopen (filename, target, FOPEN_RB, -1);
291 }
292
293 /* Don't try to `optimize' this function:
294
295 o - We lock using stack space so that interrupting the locking
296 won't cause a storage leak.
297 o - We open the file stream last, since we don't want to have to
298 close it if anything goes wrong. Closing the stream means closing
299 the file descriptor too, even though we didn't open it. */
300 /*
301 FUNCTION
302 bfd_fdopenr
303
304 SYNOPSIS
305 bfd *bfd_fdopenr (const char *filename, const char *target, int fd);
306
307 DESCRIPTION
308 <<bfd_fdopenr>> is to <<bfd_fopenr>> much like <<fdopen>> is to
309 <<fopen>>. It opens a BFD on a file already described by the
310 @var{fd} supplied.
311
312 When the file is later <<bfd_close>>d, the file descriptor will
313 be closed. If the caller desires that this file descriptor be
314 cached by BFD (opened as needed, closed as needed to free
315 descriptors for other opens), with the supplied @var{fd} used as
316 an initial file descriptor (but subject to closure at any time),
317 call bfd_set_cacheable(bfd, 1) on the returned BFD. The default
318 is to assume no caching; the file descriptor will remain open
319 until <<bfd_close>>, and will not be affected by BFD operations
320 on other files.
321
322 Possible errors are <<bfd_error_no_memory>>,
323 <<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
324
325 On error, @var{fd} is closed.
326 */
327
328 bfd *
329 bfd_fdopenr (const char *filename, const char *target, int fd)
330 {
331 const char *mode;
332 #if defined(HAVE_FCNTL) && defined(F_GETFL)
333 int fdflags;
334 #endif
335
336 #if ! defined(HAVE_FCNTL) || ! defined(F_GETFL)
337 mode = FOPEN_RUB; /* Assume full access. */
338 #else
339 fdflags = fcntl (fd, F_GETFL, NULL);
340 if (fdflags == -1)
341 {
342 int save = errno;
343
344 close (fd);
345 errno = save;
346 bfd_set_error (bfd_error_system_call);
347 return NULL;
348 }
349
350 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
351 switch (fdflags & (O_ACCMODE))
352 {
353 case O_RDONLY: mode = FOPEN_RB; break;
354 case O_WRONLY: mode = FOPEN_RUB; break;
355 case O_RDWR: mode = FOPEN_RUB; break;
356 default: abort ();
357 }
358 #endif
359
360 return bfd_fopen (filename, target, mode, fd);
361 }
362
363 /*
364 FUNCTION
365 bfd_openstreamr
366
367 SYNOPSIS
368 bfd *bfd_openstreamr (const char *, const char *, void *);
369
370 DESCRIPTION
371
372 Open a BFD for read access on an existing stdio stream. When
373 the BFD is passed to <<bfd_close>>, the stream will be closed.
374 */
375
376 bfd *
377 bfd_openstreamr (const char *filename, const char *target, void *streamarg)
378 {
379 FILE *stream = (FILE *) streamarg;
380 bfd *nbfd;
381 const bfd_target *target_vec;
382
383 nbfd = _bfd_new_bfd ();
384 if (nbfd == NULL)
385 return NULL;
386
387 target_vec = bfd_find_target (target, nbfd);
388 if (target_vec == NULL)
389 {
390 _bfd_delete_bfd (nbfd);
391 return NULL;
392 }
393
394 nbfd->iostream = stream;
395 nbfd->filename = filename;
396 nbfd->direction = read_direction;
397
398 if (! bfd_cache_init (nbfd))
399 {
400 _bfd_delete_bfd (nbfd);
401 return NULL;
402 }
403
404 return nbfd;
405 }
406
407 /*
408 FUNCTION
409 bfd_openr_iovec
410
411 SYNOPSIS
412 bfd *bfd_openr_iovec (const char *filename, const char *target,
413 void *(*open_func) (struct bfd *nbfd,
414 void *open_closure),
415 void *open_closure,
416 file_ptr (*pread_func) (struct bfd *nbfd,
417 void *stream,
418 void *buf,
419 file_ptr nbytes,
420 file_ptr offset),
421 int (*close_func) (struct bfd *nbfd,
422 void *stream),
423 int (*stat_func) (struct bfd *abfd,
424 void *stream,
425 struct stat *sb));
426
427 DESCRIPTION
428
429 Create and return a BFD backed by a read-only @var{stream}.
430 The @var{stream} is created using @var{open_func}, accessed using
431 @var{pread_func} and destroyed using @var{close_func}.
432
433 Calls <<bfd_find_target>>, so @var{target} is interpreted as by
434 that function.
435
436 Calls @var{open_func} (which can call <<bfd_zalloc>> and
437 <<bfd_get_filename>>) to obtain the read-only stream backing
438 the BFD. @var{open_func} either succeeds returning the
439 non-<<NULL>> @var{stream}, or fails returning <<NULL>>
440 (setting <<bfd_error>>).
441
442 Calls @var{pread_func} to request @var{nbytes} of data from
443 @var{stream} starting at @var{offset} (e.g., via a call to
444 <<bfd_read>>). @var{pread_func} either succeeds returning the
445 number of bytes read (which can be less than @var{nbytes} when
446 end-of-file), or fails returning -1 (setting <<bfd_error>>).
447
448 Calls @var{close_func} when the BFD is later closed using
449 <<bfd_close>>. @var{close_func} either succeeds returning 0, or
450 fails returning -1 (setting <<bfd_error>>).
451
452 Calls @var{stat_func} to fill in a stat structure for bfd_stat,
453 bfd_get_size, and bfd_get_mtime calls. @var{stat_func} returns 0
454 on success, or returns -1 on failure (setting <<bfd_error>>).
455
456 If <<bfd_openr_iovec>> returns <<NULL>> then an error has
457 occurred. Possible errors are <<bfd_error_no_memory>>,
458 <<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
459
460 */
461
462 struct opncls
463 {
464 void *stream;
465 file_ptr (*pread) (struct bfd *abfd, void *stream, void *buf,
466 file_ptr nbytes, file_ptr offset);
467 int (*close) (struct bfd *abfd, void *stream);
468 int (*stat) (struct bfd *abfd, void *stream, struct stat *sb);
469 file_ptr where;
470 };
471
472 static file_ptr
473 opncls_btell (struct bfd *abfd)
474 {
475 struct opncls *vec = (struct opncls *) abfd->iostream;
476 return vec->where;
477 }
478
479 static int
480 opncls_bseek (struct bfd *abfd, file_ptr offset, int whence)
481 {
482 struct opncls *vec = (struct opncls *) abfd->iostream;
483 switch (whence)
484 {
485 case SEEK_SET: vec->where = offset; break;
486 case SEEK_CUR: vec->where += offset; break;
487 case SEEK_END: return -1;
488 }
489 return 0;
490 }
491
492 static file_ptr
493 opncls_bread (struct bfd *abfd, void *buf, file_ptr nbytes)
494 {
495 struct opncls *vec = (struct opncls *) abfd->iostream;
496 file_ptr nread = (vec->pread) (abfd, vec->stream, buf, nbytes, vec->where);
497 if (nread < 0)
498 return nread;
499 vec->where += nread;
500 return nread;
501 }
502
503 static file_ptr
504 opncls_bwrite (struct bfd *abfd ATTRIBUTE_UNUSED,
505 const void *where ATTRIBUTE_UNUSED,
506 file_ptr nbytes ATTRIBUTE_UNUSED)
507 {
508 return -1;
509 }
510
511 static int
512 opncls_bclose (struct bfd *abfd)
513 {
514 struct opncls *vec = (struct opncls *) abfd->iostream;
515 /* Since the VEC's memory is bound to the bfd deleting the bfd will
516 free it. */
517 int status = 0;
518 if (vec->close != NULL)
519 status = (vec->close) (abfd, vec->stream);
520 abfd->iostream = NULL;
521 return status;
522 }
523
524 static int
525 opncls_bflush (struct bfd *abfd ATTRIBUTE_UNUSED)
526 {
527 return 0;
528 }
529
530 static int
531 opncls_bstat (struct bfd *abfd, struct stat *sb)
532 {
533 struct opncls *vec = (struct opncls *) abfd->iostream;
534
535 memset (sb, 0, sizeof (*sb));
536 if (vec->stat == NULL)
537 return 0;
538
539 return (vec->stat) (abfd, vec->stream, sb);
540 }
541
542 static void *
543 opncls_bmmap (struct bfd *abfd ATTRIBUTE_UNUSED,
544 void *addr ATTRIBUTE_UNUSED,
545 bfd_size_type len ATTRIBUTE_UNUSED,
546 int prot ATTRIBUTE_UNUSED,
547 int flags ATTRIBUTE_UNUSED,
548 file_ptr offset ATTRIBUTE_UNUSED,
549 void **map_addr ATTRIBUTE_UNUSED,
550 bfd_size_type *map_len ATTRIBUTE_UNUSED)
551 {
552 return (void *) -1;
553 }
554
555 static const struct bfd_iovec opncls_iovec = {
556 &opncls_bread, &opncls_bwrite, &opncls_btell, &opncls_bseek,
557 &opncls_bclose, &opncls_bflush, &opncls_bstat, &opncls_bmmap
558 };
559
560 bfd *
561 bfd_openr_iovec (const char *filename, const char *target,
562 void *(*open_p) (struct bfd *, void *),
563 void *open_closure,
564 file_ptr (*pread_p) (struct bfd *, void *, void *,
565 file_ptr, file_ptr),
566 int (*close_p) (struct bfd *, void *),
567 int (*stat_p) (struct bfd *, void *, struct stat *))
568 {
569 bfd *nbfd;
570 const bfd_target *target_vec;
571 struct opncls *vec;
572 void *stream;
573
574 nbfd = _bfd_new_bfd ();
575 if (nbfd == NULL)
576 return NULL;
577
578 target_vec = bfd_find_target (target, nbfd);
579 if (target_vec == NULL)
580 {
581 _bfd_delete_bfd (nbfd);
582 return NULL;
583 }
584
585 nbfd->filename = filename;
586 nbfd->direction = read_direction;
587
588 /* `open_p (...)' would get expanded by an the open(2) syscall macro. */
589 stream = (*open_p) (nbfd, open_closure);
590 if (stream == NULL)
591 {
592 _bfd_delete_bfd (nbfd);
593 return NULL;
594 }
595
596 vec = (struct opncls *) bfd_zalloc (nbfd, sizeof (struct opncls));
597 vec->stream = stream;
598 vec->pread = pread_p;
599 vec->close = close_p;
600 vec->stat = stat_p;
601
602 nbfd->iovec = &opncls_iovec;
603 nbfd->iostream = vec;
604
605 return nbfd;
606 }
607
608 /* bfd_openw -- open for writing.
610 Returns a pointer to a freshly-allocated BFD on success, or NULL.
611
612 See comment by bfd_fdopenr before you try to modify this function. */
613
614 /*
615 FUNCTION
616 bfd_openw
617
618 SYNOPSIS
619 bfd *bfd_openw (const char *filename, const char *target);
620
621 DESCRIPTION
622 Create a BFD, associated with file @var{filename}, using the
623 file format @var{target}, and return a pointer to it.
624
625 Possible errors are <<bfd_error_system_call>>, <<bfd_error_no_memory>>,
626 <<bfd_error_invalid_target>>.
627 */
628
629 bfd *
630 bfd_openw (const char *filename, const char *target)
631 {
632 bfd *nbfd;
633 const bfd_target *target_vec;
634
635 /* nbfd has to point to head of malloc'ed block so that bfd_close may
636 reclaim it correctly. */
637 nbfd = _bfd_new_bfd ();
638 if (nbfd == NULL)
639 return NULL;
640
641 target_vec = bfd_find_target (target, nbfd);
642 if (target_vec == NULL)
643 {
644 _bfd_delete_bfd (nbfd);
645 return NULL;
646 }
647
648 nbfd->filename = filename;
649 nbfd->direction = write_direction;
650
651 if (bfd_open_file (nbfd) == NULL)
652 {
653 /* File not writeable, etc. */
654 bfd_set_error (bfd_error_system_call);
655 _bfd_delete_bfd (nbfd);
656 return NULL;
657 }
658
659 return nbfd;
660 }
661
662 static inline void
663 _maybe_make_executable (bfd * abfd)
664 {
665 /* If the file was open for writing and is now executable,
666 make it so. */
667 if (abfd->direction == write_direction
668 && (abfd->flags & (EXEC_P | DYNAMIC)) != 0)
669 {
670 struct stat buf;
671
672 if (stat (abfd->filename, &buf) == 0
673 /* Do not attempt to change non-regular files. This is
674 here especially for configure scripts and kernel builds
675 which run tests with "ld [...] -o /dev/null". */
676 && S_ISREG(buf.st_mode))
677 {
678 unsigned int mask = umask (0);
679
680 umask (mask);
681 chmod (abfd->filename,
682 (0777
683 & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
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 <<chmod>> 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 <<bfd_fdopenr>>).
707
708 RETURNS
709 <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
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 <<bfd_close>> 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 <<chmod>> is called
751 to mark it as such.
752
753 All memory attached to the BFD is released.
754
755 RETURNS
756 <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
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 <<bfd_openw>>, 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 <<bfd_object>>.
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 <<bfd_create>> and converts it
813 into one like as returned by <<bfd_openw>>. It does this
814 by converting the BFD to BFD_IN_MEMORY. It's assumed that
815 you will call <<bfd_make_readable>> on this bfd later.
816
817 RETURNS
818 <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
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 <<bfd_create>> and
858 <<bfd_make_writable>> and converts it into one like as
859 returned by <<bfd_openr>>. It does this by writing the
860 contents out to the memory buffer, then reversing the
861 direction.
862
863 RETURNS
864 <<TRUE>> is returned if all is ok, otherwise <<FALSE>>. */
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 <<abfd>> 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 <<abfd>> 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 <<abfd>> 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 <<abfd>> 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
1056 #define GNU_DEBUGLINK ".gnu_debuglink"
1057 /*
1058 FUNCTION
1059 bfd_calc_gnu_debuglink_crc32
1060
1061 SYNOPSIS
1062 unsigned long bfd_calc_gnu_debuglink_crc32
1063 (unsigned long crc, const unsigned char *buf, bfd_size_type len);
1064
1065 DESCRIPTION
1066 Computes a CRC value as used in the .gnu_debuglink section.
1067 Advances the previously computed @var{crc} value by computing
1068 and adding in the crc32 for @var{len} bytes of @var{buf}.
1069
1070 RETURNS
1071 Return the updated CRC32 value.
1072 */
1073
1074 unsigned long
1075 bfd_calc_gnu_debuglink_crc32 (unsigned long crc,
1076 const unsigned char *buf,
1077 bfd_size_type len)
1078 {
1079 static const unsigned long crc32_table[256] =
1080 {
1081 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
1082 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
1083 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
1084 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
1085 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
1086 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
1087 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
1088 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
1089 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
1090 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
1091 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
1092 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
1093 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
1094 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
1095 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
1096 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
1097 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
1098 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
1099 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
1100 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
1101 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
1102 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
1103 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
1104 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
1105 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
1106 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
1107 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
1108 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
1109 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
1110 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
1111 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
1112 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
1113 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
1114 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
1115 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
1116 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
1117 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
1118 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
1119 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
1120 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
1121 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
1122 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
1123 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
1124 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
1125 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
1126 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
1127 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
1128 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
1129 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
1130 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
1131 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
1132 0x2d02ef8d
1133 };
1134 const unsigned char *end;
1135
1136 crc = ~crc & 0xffffffff;
1137 for (end = buf + len; buf < end; ++ buf)
1138 crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
1139 return ~crc & 0xffffffff;
1140 }
1141
1142
1143 /*
1144 INTERNAL_FUNCTION
1145 get_debug_link_info
1146
1147 SYNOPSIS
1148 char *get_debug_link_info (bfd *abfd, unsigned long *crc32_out);
1149
1150 DESCRIPTION
1151 fetch the filename and CRC32 value for any separate debuginfo
1152 associated with @var{abfd}. Return NULL if no such info found,
1153 otherwise return filename and update @var{crc32_out}.
1154 */
1155
1156 static char *
1157 get_debug_link_info (bfd *abfd, unsigned long *crc32_out)
1158 {
1159 asection *sect;
1160 unsigned long crc32;
1161 bfd_byte *contents;
1162 int crc_offset;
1163 char *name;
1164
1165 BFD_ASSERT (abfd);
1166 BFD_ASSERT (crc32_out);
1167
1168 sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
1169
1170 if (sect == NULL)
1171 return NULL;
1172
1173 if (!bfd_malloc_and_get_section (abfd, sect, &contents))
1174 {
1175 if (contents != NULL)
1176 free (contents);
1177 return NULL;
1178 }
1179
1180 /* Crc value is stored after the filename, aligned up to 4 bytes. */
1181 name = (char *) contents;
1182 crc_offset = strlen (name) + 1;
1183 crc_offset = (crc_offset + 3) & ~3;
1184
1185 crc32 = bfd_get_32 (abfd, contents + crc_offset);
1186
1187 *crc32_out = crc32;
1188 return name;
1189 }
1190
1191 /*
1192 INTERNAL_FUNCTION
1193 separate_debug_file_exists
1194
1195 SYNOPSIS
1196 bfd_boolean separate_debug_file_exists
1197 (char *name, unsigned long crc32);
1198
1199 DESCRIPTION
1200 Checks to see if @var{name} is a file and if its contents
1201 match @var{crc32}.
1202 */
1203
1204 static bfd_boolean
1205 separate_debug_file_exists (const char *name, const unsigned long crc)
1206 {
1207 static unsigned char buffer [8 * 1024];
1208 unsigned long file_crc = 0;
1209 FILE *f;
1210 bfd_size_type count;
1211
1212 BFD_ASSERT (name);
1213
1214 f = real_fopen (name, FOPEN_RB);
1215 if (f == NULL)
1216 return FALSE;
1217
1218 while ((count = fread (buffer, 1, sizeof (buffer), f)) > 0)
1219 file_crc = bfd_calc_gnu_debuglink_crc32 (file_crc, buffer, count);
1220
1221 fclose (f);
1222
1223 return crc == file_crc;
1224 }
1225
1226
1227 /*
1228 INTERNAL_FUNCTION
1229 find_separate_debug_file
1230
1231 SYNOPSIS
1232 char *find_separate_debug_file (bfd *abfd);
1233
1234 DESCRIPTION
1235 Searches @var{abfd} for a reference to separate debugging
1236 information, scans various locations in the filesystem, including
1237 the file tree rooted at @var{debug_file_directory}, and returns a
1238 filename of such debugging information if the file is found and has
1239 matching CRC32. Returns NULL if no reference to debugging file
1240 exists, or file cannot be found.
1241 */
1242
1243 static char *
1244 find_separate_debug_file (bfd *abfd, const char *debug_file_directory)
1245 {
1246 char *base;
1247 char *dir;
1248 char *debugfile;
1249 char *canon_dir;
1250 unsigned long crc32;
1251 size_t dirlen;
1252 size_t canon_dirlen;
1253
1254 BFD_ASSERT (abfd);
1255 if (debug_file_directory == NULL)
1256 debug_file_directory = ".";
1257
1258 /* BFD may have been opened from a stream. */
1259 if (abfd->filename == NULL)
1260 {
1261 bfd_set_error (bfd_error_invalid_operation);
1262 return NULL;
1263 }
1264
1265 base = get_debug_link_info (abfd, & crc32);
1266 if (base == NULL)
1267 return NULL;
1268
1269 if (base[0] == '\0')
1270 {
1271 free (base);
1272 bfd_set_error (bfd_error_no_debug_section);
1273 return NULL;
1274 }
1275
1276 for (dirlen = strlen (abfd->filename); dirlen > 0; dirlen--)
1277 if (IS_DIR_SEPARATOR (abfd->filename[dirlen - 1]))
1278 break;
1279
1280 dir = (char *) bfd_malloc (dirlen + 1);
1281 if (dir == NULL)
1282 {
1283 free (base);
1284 return NULL;
1285 }
1286 memcpy (dir, abfd->filename, dirlen);
1287 dir[dirlen] = '\0';
1288
1289 /* Compute the canonical name of the bfd object with all symbolic links
1290 resolved, for use in the global debugfile directory. */
1291 canon_dir = lrealpath (abfd->filename);
1292 for (canon_dirlen = strlen (canon_dir); canon_dirlen > 0; canon_dirlen--)
1293 if (IS_DIR_SEPARATOR (canon_dir[canon_dirlen - 1]))
1294 break;
1295 canon_dir[canon_dirlen] = '\0';
1296
1297 debugfile = (char *)
1298 bfd_malloc (strlen (debug_file_directory) + 1
1299 + (canon_dirlen > dirlen ? canon_dirlen : dirlen)
1300 + strlen (".debug/")
1301 + strlen (base)
1302 + 1);
1303 if (debugfile == NULL)
1304 {
1305 free (base);
1306 free (dir);
1307 free (canon_dir);
1308 return NULL;
1309 }
1310
1311 /* First try in the same directory as the original file: */
1312 strcpy (debugfile, dir);
1313 strcat (debugfile, base);
1314
1315 if (separate_debug_file_exists (debugfile, crc32))
1316 {
1317 free (base);
1318 free (dir);
1319 free (canon_dir);
1320 return debugfile;
1321 }
1322
1323 /* Then try in a subdirectory called .debug. */
1324 strcpy (debugfile, dir);
1325 strcat (debugfile, ".debug/");
1326 strcat (debugfile, base);
1327
1328 if (separate_debug_file_exists (debugfile, crc32))
1329 {
1330 free (base);
1331 free (dir);
1332 free (canon_dir);
1333 return debugfile;
1334 }
1335
1336 /* Then try in the global debugfile directory. */
1337 strcpy (debugfile, debug_file_directory);
1338 dirlen = strlen (debug_file_directory) - 1;
1339 if (dirlen > 0
1340 && debug_file_directory[dirlen] != '/'
1341 && canon_dir[0] != '/')
1342 strcat (debugfile, "/");
1343 strcat (debugfile, canon_dir);
1344 strcat (debugfile, base);
1345
1346 if (separate_debug_file_exists (debugfile, crc32))
1347 {
1348 free (base);
1349 free (dir);
1350 free (canon_dir);
1351 return debugfile;
1352 }
1353
1354 free (debugfile);
1355 free (base);
1356 free (dir);
1357 free (canon_dir);
1358 return NULL;
1359 }
1360
1361
1362 /*
1363 FUNCTION
1364 bfd_follow_gnu_debuglink
1365
1366 SYNOPSIS
1367 char *bfd_follow_gnu_debuglink (bfd *abfd, const char *dir);
1368
1369 DESCRIPTION
1370
1371 Takes a BFD and searches it for a .gnu_debuglink section. If this
1372 section is found, it examines the section for the name and checksum
1373 of a '.debug' file containing auxiliary debugging information. It
1374 then searches the filesystem for this .debug file in some standard
1375 locations, including the directory tree rooted at @var{dir}, and if
1376 found returns the full filename.
1377
1378 If @var{dir} is NULL, it will search a default path configured into
1379 libbfd at build time. [XXX this feature is not currently
1380 implemented].
1381
1382 RETURNS
1383 <<NULL>> on any errors or failure to locate the .debug file,
1384 otherwise a pointer to a heap-allocated string containing the
1385 filename. The caller is responsible for freeing this string.
1386 */
1387
1388 char *
1389 bfd_follow_gnu_debuglink (bfd *abfd, const char *dir)
1390 {
1391 return find_separate_debug_file (abfd, dir);
1392 }
1393
1394 /*
1395 FUNCTION
1396 bfd_create_gnu_debuglink_section
1397
1398 SYNOPSIS
1399 struct bfd_section *bfd_create_gnu_debuglink_section
1400 (bfd *abfd, const char *filename);
1401
1402 DESCRIPTION
1403
1404 Takes a @var{BFD} and adds a .gnu_debuglink section to it. The section is sized
1405 to be big enough to contain a link to the specified @var{filename}.
1406
1407 RETURNS
1408 A pointer to the new section is returned if all is ok. Otherwise <<NULL>> is
1409 returned and bfd_error is set.
1410 */
1411
1412 asection *
1413 bfd_create_gnu_debuglink_section (bfd *abfd, const char *filename)
1414 {
1415 asection *sect;
1416 bfd_size_type debuglink_size;
1417 flagword flags;
1418
1419 if (abfd == NULL || filename == NULL)
1420 {
1421 bfd_set_error (bfd_error_invalid_operation);
1422 return NULL;
1423 }
1424
1425 /* Strip off any path components in filename. */
1426 filename = lbasename (filename);
1427
1428 sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
1429 if (sect)
1430 {
1431 /* Section already exists. */
1432 bfd_set_error (bfd_error_invalid_operation);
1433 return NULL;
1434 }
1435
1436 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
1437 sect = bfd_make_section_with_flags (abfd, GNU_DEBUGLINK, flags);
1438 if (sect == NULL)
1439 return NULL;
1440
1441 debuglink_size = strlen (filename) + 1;
1442 debuglink_size += 3;
1443 debuglink_size &= ~3;
1444 debuglink_size += 4;
1445
1446 if (! bfd_set_section_size (abfd, sect, debuglink_size))
1447 /* XXX Should we delete the section from the bfd ? */
1448 return NULL;
1449
1450 return sect;
1451 }
1452
1453
1454 /*
1455 FUNCTION
1456 bfd_fill_in_gnu_debuglink_section
1457
1458 SYNOPSIS
1459 bfd_boolean bfd_fill_in_gnu_debuglink_section
1460 (bfd *abfd, struct bfd_section *sect, const char *filename);
1461
1462 DESCRIPTION
1463
1464 Takes a @var{BFD} and containing a .gnu_debuglink section @var{SECT}
1465 and fills in the contents of the section to contain a link to the
1466 specified @var{filename}. The filename should be relative to the
1467 current directory.
1468
1469 RETURNS
1470 <<TRUE>> is returned if all is ok. Otherwise <<FALSE>> is returned
1471 and bfd_error is set.
1472 */
1473
1474 bfd_boolean
1475 bfd_fill_in_gnu_debuglink_section (bfd *abfd,
1476 struct bfd_section *sect,
1477 const char *filename)
1478 {
1479 bfd_size_type debuglink_size;
1480 unsigned long crc32;
1481 char * contents;
1482 bfd_size_type crc_offset;
1483 FILE * handle;
1484 static unsigned char buffer[8 * 1024];
1485 size_t count;
1486 size_t filelen;
1487
1488 if (abfd == NULL || sect == NULL || filename == NULL)
1489 {
1490 bfd_set_error (bfd_error_invalid_operation);
1491 return FALSE;
1492 }
1493
1494 /* Make sure that we can read the file.
1495 XXX - Should we attempt to locate the debug info file using the same
1496 algorithm as gdb ? At the moment, since we are creating the
1497 .gnu_debuglink section, we insist upon the user providing us with a
1498 correct-for-section-creation-time path, but this need not conform to
1499 the gdb location algorithm. */
1500 handle = real_fopen (filename, FOPEN_RB);
1501 if (handle == NULL)
1502 {
1503 bfd_set_error (bfd_error_system_call);
1504 return FALSE;
1505 }
1506
1507 crc32 = 0;
1508 while ((count = fread (buffer, 1, sizeof buffer, handle)) > 0)
1509 crc32 = bfd_calc_gnu_debuglink_crc32 (crc32, buffer, count);
1510 fclose (handle);
1511
1512 /* Strip off any path components in filename,
1513 now that we no longer need them. */
1514 filename = lbasename (filename);
1515
1516 filelen = strlen (filename);
1517 debuglink_size = filelen + 1;
1518 debuglink_size += 3;
1519 debuglink_size &= ~3;
1520 debuglink_size += 4;
1521
1522 contents = (char *) bfd_malloc (debuglink_size);
1523 if (contents == NULL)
1524 {
1525 /* XXX Should we delete the section from the bfd ? */
1526 return FALSE;
1527 }
1528
1529 crc_offset = debuglink_size - 4;
1530 memcpy (contents, filename, filelen);
1531 memset (contents + filelen, 0, crc_offset - filelen);
1532
1533 bfd_put_32 (abfd, crc32, contents + crc_offset);
1534
1535 if (! bfd_set_section_contents (abfd, sect, contents, 0, debuglink_size))
1536 {
1537 /* XXX Should we delete the section from the bfd ? */
1538 free (contents);
1539 return FALSE;
1540 }
1541
1542 return TRUE;
1543 }
1544