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