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