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