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