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