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