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