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