opncls.c revision 1.5 1 1.1 christos /* opncls.c -- open and close a BFD.
2 1.3 christos Copyright (C) 1990-2015 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 christos
29 1.1 christos #ifndef S_IXUSR
30 1.1 christos #define S_IXUSR 0100 /* Execute by owner. */
31 1.1 christos #endif
32 1.1 christos #ifndef S_IXGRP
33 1.1 christos #define S_IXGRP 0010 /* Execute by group. */
34 1.1 christos #endif
35 1.1 christos #ifndef S_IXOTH
36 1.1 christos #define S_IXOTH 0001 /* Execute by others. */
37 1.1 christos #endif
38 1.1 christos
39 1.1 christos /* Counters used to initialize the bfd identifier. */
40 1.1 christos
41 1.1 christos static unsigned int bfd_id_counter = 0;
42 1.1 christos static unsigned int bfd_reserved_id_counter = 0;
43 1.1 christos
44 1.1 christos /*
45 1.1 christos CODE_FRAGMENT
46 1.1 christos .{* Set to N to open the next N BFDs using an alternate id space. *}
47 1.1 christos .extern unsigned int bfd_use_reserved_id;
48 1.1 christos */
49 1.1 christos unsigned int bfd_use_reserved_id = 0;
50 1.1 christos
51 1.1 christos /* fdopen is a loser -- we should use stdio exclusively. Unfortunately
52 1.1 christos if we do that we can't use fcntl. */
53 1.1 christos
54 1.1 christos /* Return a new BFD. All BFD's are allocated through this routine. */
55 1.1 christos
56 1.1 christos bfd *
57 1.1 christos _bfd_new_bfd (void)
58 1.1 christos {
59 1.1 christos bfd *nbfd;
60 1.1 christos
61 1.1 christos nbfd = (bfd *) bfd_zmalloc (sizeof (bfd));
62 1.1 christos if (nbfd == NULL)
63 1.1 christos return NULL;
64 1.1 christos
65 1.1 christos if (bfd_use_reserved_id)
66 1.1 christos {
67 1.1 christos nbfd->id = --bfd_reserved_id_counter;
68 1.1 christos --bfd_use_reserved_id;
69 1.1 christos }
70 1.1 christos else
71 1.1 christos nbfd->id = bfd_id_counter++;
72 1.1 christos
73 1.1 christos nbfd->memory = objalloc_create ();
74 1.1 christos if (nbfd->memory == NULL)
75 1.1 christos {
76 1.1 christos bfd_set_error (bfd_error_no_memory);
77 1.1 christos free (nbfd);
78 1.1 christos return NULL;
79 1.1 christos }
80 1.1 christos
81 1.1 christos nbfd->arch_info = &bfd_default_arch_struct;
82 1.1 christos
83 1.1 christos if (!bfd_hash_table_init_n (& nbfd->section_htab, bfd_section_hash_newfunc,
84 1.1 christos sizeof (struct section_hash_entry), 13))
85 1.1 christos {
86 1.1 christos free (nbfd);
87 1.1 christos return NULL;
88 1.1 christos }
89 1.1 christos
90 1.1 christos return nbfd;
91 1.1 christos }
92 1.1 christos
93 1.1 christos static const struct bfd_iovec opncls_iovec;
94 1.1 christos
95 1.1 christos /* Allocate a new BFD as a member of archive OBFD. */
96 1.1 christos
97 1.1 christos bfd *
98 1.1 christos _bfd_new_bfd_contained_in (bfd *obfd)
99 1.1 christos {
100 1.1 christos bfd *nbfd;
101 1.1 christos
102 1.1 christos nbfd = _bfd_new_bfd ();
103 1.1 christos if (nbfd == NULL)
104 1.1 christos return NULL;
105 1.1 christos nbfd->xvec = obfd->xvec;
106 1.1 christos nbfd->iovec = obfd->iovec;
107 1.1 christos if (obfd->iovec == &opncls_iovec)
108 1.1 christos nbfd->iostream = obfd->iostream;
109 1.1 christos nbfd->my_archive = obfd;
110 1.1 christos nbfd->direction = read_direction;
111 1.1 christos nbfd->target_defaulted = obfd->target_defaulted;
112 1.5 christos nbfd->lto_output = obfd->lto_output;
113 1.5 christos nbfd->no_export = obfd->no_export;
114 1.1 christos return nbfd;
115 1.1 christos }
116 1.1 christos
117 1.1 christos /* Delete a BFD. */
118 1.1 christos
119 1.1 christos static void
120 1.1 christos _bfd_delete_bfd (bfd *abfd)
121 1.1 christos {
122 1.1 christos if (abfd->memory)
123 1.1 christos {
124 1.1 christos bfd_hash_table_free (&abfd->section_htab);
125 1.1 christos objalloc_free ((struct objalloc *) abfd->memory);
126 1.1 christos }
127 1.1 christos
128 1.1 christos if (abfd->filename)
129 1.1 christos free ((char *) abfd->filename);
130 1.1 christos free (abfd->arelt_data);
131 1.1 christos free (abfd);
132 1.1 christos }
133 1.1 christos
134 1.1 christos /* Free objalloc memory. */
135 1.1 christos
136 1.1 christos bfd_boolean
137 1.1 christos _bfd_free_cached_info (bfd *abfd)
138 1.1 christos {
139 1.1 christos if (abfd->memory)
140 1.1 christos {
141 1.1 christos bfd_hash_table_free (&abfd->section_htab);
142 1.1 christos objalloc_free ((struct objalloc *) abfd->memory);
143 1.1 christos
144 1.1 christos abfd->sections = NULL;
145 1.1 christos abfd->section_last = NULL;
146 1.1 christos abfd->outsymbols = NULL;
147 1.1 christos abfd->tdata.any = NULL;
148 1.1 christos abfd->usrdata = NULL;
149 1.1 christos abfd->memory = NULL;
150 1.1 christos }
151 1.1 christos
152 1.1 christos return TRUE;
153 1.1 christos }
154 1.1 christos
155 1.1 christos /*
156 1.1 christos SECTION
157 1.1 christos Opening and closing BFDs
158 1.1 christos
159 1.1 christos SUBSECTION
160 1.1 christos Functions for opening and closing
161 1.1 christos */
162 1.1 christos
163 1.1 christos /*
164 1.1 christos FUNCTION
165 1.1 christos bfd_fopen
166 1.1 christos
167 1.1 christos SYNOPSIS
168 1.1 christos bfd *bfd_fopen (const char *filename, const char *target,
169 1.1 christos const char *mode, int fd);
170 1.1 christos
171 1.1 christos DESCRIPTION
172 1.1 christos Open the file @var{filename} with the target @var{target}.
173 1.1 christos Return a pointer to the created BFD. If @var{fd} is not -1,
174 1.1 christos then <<fdopen>> is used to open the file; otherwise, <<fopen>>
175 1.1 christos is used. @var{mode} is passed directly to <<fopen>> or
176 1.1 christos <<fdopen>>.
177 1.1 christos
178 1.1 christos Calls <<bfd_find_target>>, so @var{target} is interpreted as by
179 1.1 christos that function.
180 1.1 christos
181 1.1 christos The new BFD is marked as cacheable iff @var{fd} is -1.
182 1.1 christos
183 1.1 christos If <<NULL>> is returned then an error has occured. Possible errors
184 1.1 christos are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or
185 1.1 christos <<system_call>> error.
186 1.1 christos
187 1.1 christos On error, @var{fd} is always closed.
188 1.1 christos
189 1.1 christos A copy of the @var{filename} argument is stored in the newly created
190 1.1 christos BFD. It can be accessed via the bfd_get_filename() macro.
191 1.1 christos */
192 1.1 christos
193 1.1 christos bfd *
194 1.1 christos bfd_fopen (const char *filename, const char *target, const char *mode, int fd)
195 1.1 christos {
196 1.1 christos bfd *nbfd;
197 1.1 christos const bfd_target *target_vec;
198 1.1 christos
199 1.1 christos nbfd = _bfd_new_bfd ();
200 1.1 christos if (nbfd == NULL)
201 1.1 christos {
202 1.1 christos if (fd != -1)
203 1.1 christos close (fd);
204 1.1 christos return NULL;
205 1.1 christos }
206 1.1 christos
207 1.1 christos target_vec = bfd_find_target (target, nbfd);
208 1.1 christos if (target_vec == NULL)
209 1.1 christos {
210 1.1 christos if (fd != -1)
211 1.1 christos close (fd);
212 1.1 christos _bfd_delete_bfd (nbfd);
213 1.1 christos return NULL;
214 1.1 christos }
215 1.1 christos
216 1.1 christos #ifdef HAVE_FDOPEN
217 1.1 christos if (fd != -1)
218 1.1 christos nbfd->iostream = fdopen (fd, mode);
219 1.1 christos else
220 1.1 christos #endif
221 1.1 christos nbfd->iostream = real_fopen (filename, mode);
222 1.1 christos if (nbfd->iostream == NULL)
223 1.1 christos {
224 1.1 christos bfd_set_error (bfd_error_system_call);
225 1.1 christos _bfd_delete_bfd (nbfd);
226 1.1 christos return NULL;
227 1.1 christos }
228 1.1 christos
229 1.1 christos /* OK, put everything where it belongs. */
230 1.1 christos
231 1.1 christos /* PR 11983: Do not cache the original filename, but
232 1.1 christos rather make a copy - the original might go away. */
233 1.1 christos nbfd->filename = xstrdup (filename);
234 1.1 christos
235 1.1 christos /* Figure out whether the user is opening the file for reading,
236 1.1 christos writing, or both, by looking at the MODE argument. */
237 1.1 christos if ((mode[0] == 'r' || mode[0] == 'w' || mode[0] == 'a')
238 1.1 christos && mode[1] == '+')
239 1.1 christos nbfd->direction = both_direction;
240 1.1 christos else if (mode[0] == 'r')
241 1.1 christos nbfd->direction = read_direction;
242 1.1 christos else
243 1.1 christos nbfd->direction = write_direction;
244 1.1 christos
245 1.1 christos if (! bfd_cache_init (nbfd))
246 1.1 christos {
247 1.1 christos _bfd_delete_bfd (nbfd);
248 1.1 christos return NULL;
249 1.1 christos }
250 1.1 christos nbfd->opened_once = TRUE;
251 1.1 christos
252 1.1 christos /* If we opened the file by name, mark it cacheable; we can close it
253 1.1 christos and reopen it later. However, if a file descriptor was provided,
254 1.1 christos then it may have been opened with special flags that make it
255 1.1 christos unsafe to close and reopen the file. */
256 1.1 christos if (fd == -1)
257 1.1 christos (void) bfd_set_cacheable (nbfd, TRUE);
258 1.1 christos
259 1.1 christos return nbfd;
260 1.1 christos }
261 1.1 christos
262 1.1 christos /*
263 1.1 christos FUNCTION
264 1.1 christos bfd_openr
265 1.1 christos
266 1.1 christos SYNOPSIS
267 1.1 christos bfd *bfd_openr (const char *filename, const char *target);
268 1.1 christos
269 1.1 christos DESCRIPTION
270 1.1 christos Open the file @var{filename} (using <<fopen>>) with the target
271 1.1 christos @var{target}. Return a pointer to the created BFD.
272 1.1 christos
273 1.1 christos Calls <<bfd_find_target>>, so @var{target} is interpreted as by
274 1.1 christos that function.
275 1.1 christos
276 1.1 christos If <<NULL>> is returned then an error has occured. Possible errors
277 1.1 christos are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or
278 1.1 christos <<system_call>> error.
279 1.1 christos
280 1.1 christos A copy of the @var{filename} argument is stored in the newly created
281 1.1 christos BFD. It can be accessed via the bfd_get_filename() macro.
282 1.1 christos */
283 1.1 christos
284 1.1 christos bfd *
285 1.1 christos bfd_openr (const char *filename, const char *target)
286 1.1 christos {
287 1.1 christos return bfd_fopen (filename, target, FOPEN_RB, -1);
288 1.1 christos }
289 1.1 christos
290 1.1 christos /* Don't try to `optimize' this function:
291 1.1 christos
292 1.1 christos o - We lock using stack space so that interrupting the locking
293 1.1 christos won't cause a storage leak.
294 1.1 christos o - We open the file stream last, since we don't want to have to
295 1.1 christos close it if anything goes wrong. Closing the stream means closing
296 1.1 christos the file descriptor too, even though we didn't open it. */
297 1.1 christos /*
298 1.1 christos FUNCTION
299 1.1 christos bfd_fdopenr
300 1.1 christos
301 1.1 christos SYNOPSIS
302 1.1 christos bfd *bfd_fdopenr (const char *filename, const char *target, int fd);
303 1.1 christos
304 1.1 christos DESCRIPTION
305 1.1 christos <<bfd_fdopenr>> is to <<bfd_fopenr>> much like <<fdopen>> is to
306 1.1 christos <<fopen>>. It opens a BFD on a file already described by the
307 1.1 christos @var{fd} supplied.
308 1.1 christos
309 1.1 christos When the file is later <<bfd_close>>d, the file descriptor will
310 1.1 christos be closed. If the caller desires that this file descriptor be
311 1.1 christos cached by BFD (opened as needed, closed as needed to free
312 1.1 christos descriptors for other opens), with the supplied @var{fd} used as
313 1.1 christos an initial file descriptor (but subject to closure at any time),
314 1.1 christos call bfd_set_cacheable(bfd, 1) on the returned BFD. The default
315 1.1 christos is to assume no caching; the file descriptor will remain open
316 1.1 christos until <<bfd_close>>, and will not be affected by BFD operations
317 1.1 christos on other files.
318 1.1 christos
319 1.1 christos Possible errors are <<bfd_error_no_memory>>,
320 1.1 christos <<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
321 1.1 christos
322 1.1 christos On error, @var{fd} is closed.
323 1.1 christos
324 1.1 christos A copy of the @var{filename} argument is stored in the newly created
325 1.1 christos BFD. It can be accessed via the bfd_get_filename() macro.
326 1.1 christos */
327 1.1 christos
328 1.1 christos bfd *
329 1.1 christos bfd_fdopenr (const char *filename, const char *target, int fd)
330 1.1 christos {
331 1.1 christos const char *mode;
332 1.1 christos #if defined(HAVE_FCNTL) && defined(F_GETFL)
333 1.1 christos int fdflags;
334 1.1 christos #endif
335 1.1 christos
336 1.1 christos #if ! defined(HAVE_FCNTL) || ! defined(F_GETFL)
337 1.1 christos mode = FOPEN_RUB; /* Assume full access. */
338 1.1 christos #else
339 1.1 christos fdflags = fcntl (fd, F_GETFL, NULL);
340 1.1 christos if (fdflags == -1)
341 1.1 christos {
342 1.1 christos int save = errno;
343 1.1 christos
344 1.1 christos close (fd);
345 1.1 christos errno = save;
346 1.1 christos bfd_set_error (bfd_error_system_call);
347 1.1 christos return NULL;
348 1.1 christos }
349 1.1 christos
350 1.1 christos /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
351 1.1 christos switch (fdflags & (O_ACCMODE))
352 1.1 christos {
353 1.1 christos case O_RDONLY: mode = FOPEN_RB; break;
354 1.1 christos case O_WRONLY: mode = FOPEN_RUB; break;
355 1.1 christos case O_RDWR: mode = FOPEN_RUB; break;
356 1.1 christos default: abort ();
357 1.1 christos }
358 1.1 christos #endif
359 1.1 christos
360 1.1 christos return bfd_fopen (filename, target, mode, fd);
361 1.1 christos }
362 1.1 christos
363 1.1 christos /*
364 1.1 christos FUNCTION
365 1.1 christos bfd_openstreamr
366 1.1 christos
367 1.1 christos SYNOPSIS
368 1.1 christos bfd *bfd_openstreamr (const char * filename, const char * target, void * stream);
369 1.1 christos
370 1.1 christos DESCRIPTION
371 1.1 christos
372 1.1 christos Open a BFD for read access on an existing stdio stream. When
373 1.1 christos the BFD is passed to <<bfd_close>>, the stream will be closed.
374 1.1 christos
375 1.1 christos A copy of the @var{filename} argument is stored in the newly created
376 1.1 christos BFD. It can be accessed via the bfd_get_filename() macro.
377 1.1 christos */
378 1.1 christos
379 1.1 christos bfd *
380 1.1 christos bfd_openstreamr (const char *filename, const char *target, void *streamarg)
381 1.1 christos {
382 1.1 christos FILE *stream = (FILE *) streamarg;
383 1.1 christos bfd *nbfd;
384 1.1 christos const bfd_target *target_vec;
385 1.1 christos
386 1.1 christos nbfd = _bfd_new_bfd ();
387 1.1 christos if (nbfd == NULL)
388 1.1 christos return NULL;
389 1.1 christos
390 1.1 christos target_vec = bfd_find_target (target, nbfd);
391 1.1 christos if (target_vec == NULL)
392 1.1 christos {
393 1.1 christos _bfd_delete_bfd (nbfd);
394 1.1 christos return NULL;
395 1.1 christos }
396 1.1 christos
397 1.1 christos nbfd->iostream = stream;
398 1.1 christos /* PR 11983: Do not cache the original filename, but
399 1.1 christos rather make a copy - the original might go away. */
400 1.1 christos nbfd->filename = xstrdup (filename);
401 1.1 christos nbfd->direction = read_direction;
402 1.1 christos
403 1.1 christos if (! bfd_cache_init (nbfd))
404 1.1 christos {
405 1.1 christos _bfd_delete_bfd (nbfd);
406 1.1 christos return NULL;
407 1.1 christos }
408 1.1 christos
409 1.1 christos return nbfd;
410 1.1 christos }
411 1.1 christos
412 1.1 christos /*
413 1.1 christos FUNCTION
414 1.1 christos bfd_openr_iovec
415 1.1 christos
416 1.1 christos SYNOPSIS
417 1.1 christos bfd *bfd_openr_iovec (const char *filename, const char *target,
418 1.1 christos void *(*open_func) (struct bfd *nbfd,
419 1.1 christos void *open_closure),
420 1.1 christos void *open_closure,
421 1.1 christos file_ptr (*pread_func) (struct bfd *nbfd,
422 1.1 christos void *stream,
423 1.1 christos void *buf,
424 1.1 christos file_ptr nbytes,
425 1.1 christos file_ptr offset),
426 1.1 christos int (*close_func) (struct bfd *nbfd,
427 1.1 christos void *stream),
428 1.1 christos int (*stat_func) (struct bfd *abfd,
429 1.1 christos void *stream,
430 1.1 christos struct stat *sb));
431 1.1 christos
432 1.1 christos DESCRIPTION
433 1.1 christos
434 1.1 christos Create and return a BFD backed by a read-only @var{stream}.
435 1.1 christos The @var{stream} is created using @var{open_func}, accessed using
436 1.1 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 christos A copy of the @var{filename} argument is stored in the newly created
466 1.1 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 christos if (nread < 0)
505 1.1 christos return nread;
506 1.1 christos vec->where += nread;
507 1.1 christos return nread;
508 1.1 christos }
509 1.1 christos
510 1.1 christos static file_ptr
511 1.1 christos opncls_bwrite (struct bfd *abfd ATTRIBUTE_UNUSED,
512 1.1 christos const void *where ATTRIBUTE_UNUSED,
513 1.1 christos file_ptr nbytes ATTRIBUTE_UNUSED)
514 1.1 christos {
515 1.1 christos return -1;
516 1.1 christos }
517 1.1 christos
518 1.1 christos static int
519 1.1 christos opncls_bclose (struct bfd *abfd)
520 1.1 christos {
521 1.1 christos struct opncls *vec = (struct opncls *) abfd->iostream;
522 1.1 christos /* Since the VEC's memory is bound to the bfd deleting the bfd will
523 1.1 christos free it. */
524 1.1 christos int status = 0;
525 1.1 christos if (vec->close != NULL)
526 1.1 christos status = (vec->close) (abfd, vec->stream);
527 1.1 christos abfd->iostream = NULL;
528 1.1 christos return status;
529 1.1 christos }
530 1.1 christos
531 1.1 christos static int
532 1.1 christos opncls_bflush (struct bfd *abfd ATTRIBUTE_UNUSED)
533 1.1 christos {
534 1.1 christos return 0;
535 1.1 christos }
536 1.1 christos
537 1.1 christos static int
538 1.1 christos opncls_bstat (struct bfd *abfd, struct stat *sb)
539 1.1 christos {
540 1.1 christos struct opncls *vec = (struct opncls *) abfd->iostream;
541 1.1 christos
542 1.1 christos memset (sb, 0, sizeof (*sb));
543 1.1 christos if (vec->stat == NULL)
544 1.1 christos return 0;
545 1.1 christos
546 1.1 christos return (vec->stat) (abfd, vec->stream, sb);
547 1.1 christos }
548 1.1 christos
549 1.1 christos static void *
550 1.1 christos opncls_bmmap (struct bfd *abfd ATTRIBUTE_UNUSED,
551 1.1 christos void *addr ATTRIBUTE_UNUSED,
552 1.1 christos bfd_size_type len ATTRIBUTE_UNUSED,
553 1.1 christos int prot ATTRIBUTE_UNUSED,
554 1.1 christos int flags ATTRIBUTE_UNUSED,
555 1.1 christos file_ptr offset ATTRIBUTE_UNUSED,
556 1.1 christos void **map_addr ATTRIBUTE_UNUSED,
557 1.1 christos bfd_size_type *map_len ATTRIBUTE_UNUSED)
558 1.1 christos {
559 1.1 christos return (void *) -1;
560 1.1 christos }
561 1.1 christos
562 1.1 christos static const struct bfd_iovec opncls_iovec = {
563 1.1 christos &opncls_bread, &opncls_bwrite, &opncls_btell, &opncls_bseek,
564 1.1 christos &opncls_bclose, &opncls_bflush, &opncls_bstat, &opncls_bmmap
565 1.1 christos };
566 1.1 christos
567 1.1 christos bfd *
568 1.1 christos bfd_openr_iovec (const char *filename, const char *target,
569 1.1 christos void *(*open_p) (struct bfd *, void *),
570 1.1 christos void *open_closure,
571 1.1 christos file_ptr (*pread_p) (struct bfd *, void *, void *,
572 1.1 christos file_ptr, file_ptr),
573 1.1 christos int (*close_p) (struct bfd *, void *),
574 1.1 christos int (*stat_p) (struct bfd *, void *, struct stat *))
575 1.1 christos {
576 1.1 christos bfd *nbfd;
577 1.1 christos const bfd_target *target_vec;
578 1.1 christos struct opncls *vec;
579 1.1 christos void *stream;
580 1.1 christos
581 1.1 christos nbfd = _bfd_new_bfd ();
582 1.1 christos if (nbfd == NULL)
583 1.1 christos return NULL;
584 1.1 christos
585 1.1 christos target_vec = bfd_find_target (target, nbfd);
586 1.1 christos if (target_vec == NULL)
587 1.1 christos {
588 1.1 christos _bfd_delete_bfd (nbfd);
589 1.1 christos return NULL;
590 1.1 christos }
591 1.1 christos
592 1.1 christos /* PR 11983: Do not cache the original filename, but
593 1.1 christos rather make a copy - the original might go away. */
594 1.1 christos nbfd->filename = xstrdup (filename);
595 1.1 christos nbfd->direction = read_direction;
596 1.1 christos
597 1.1 christos /* `open_p (...)' would get expanded by an the open(2) syscall macro. */
598 1.1 christos stream = (*open_p) (nbfd, open_closure);
599 1.1 christos if (stream == NULL)
600 1.1 christos {
601 1.1 christos _bfd_delete_bfd (nbfd);
602 1.1 christos return NULL;
603 1.1 christos }
604 1.1 christos
605 1.1 christos vec = (struct opncls *) bfd_zalloc (nbfd, sizeof (struct opncls));
606 1.1 christos vec->stream = stream;
607 1.1 christos vec->pread = pread_p;
608 1.1 christos vec->close = close_p;
609 1.1 christos vec->stat = stat_p;
610 1.1 christos
611 1.1 christos nbfd->iovec = &opncls_iovec;
612 1.1 christos nbfd->iostream = vec;
613 1.1 christos
614 1.1 christos return nbfd;
615 1.1 christos }
616 1.1 christos
617 1.1 christos /* bfd_openw -- open for writing.
619 1.1 christos Returns a pointer to a freshly-allocated BFD on success, or NULL.
620 1.1 christos
621 1.1 christos See comment by bfd_fdopenr before you try to modify this function. */
622 1.1 christos
623 1.1 christos /*
624 1.1 christos FUNCTION
625 1.1 christos bfd_openw
626 1.1 christos
627 1.1 christos SYNOPSIS
628 1.1 christos bfd *bfd_openw (const char *filename, const char *target);
629 1.1 christos
630 1.1 christos DESCRIPTION
631 1.1 christos Create a BFD, associated with file @var{filename}, using the
632 1.1 christos file format @var{target}, and return a pointer to it.
633 1.1 christos
634 1.1 christos Possible errors are <<bfd_error_system_call>>, <<bfd_error_no_memory>>,
635 1.1 christos <<bfd_error_invalid_target>>.
636 1.1 christos
637 1.1 christos A copy of the @var{filename} argument is stored in the newly created
638 1.1 christos BFD. It can be accessed via the bfd_get_filename() macro.
639 1.1 christos */
640 1.1 christos
641 1.1 christos bfd *
642 1.1 christos bfd_openw (const char *filename, const char *target)
643 1.1 christos {
644 1.1 christos bfd *nbfd;
645 1.1 christos const bfd_target *target_vec;
646 1.1 christos
647 1.1 christos /* nbfd has to point to head of malloc'ed block so that bfd_close may
648 1.1 christos reclaim it correctly. */
649 1.1 christos nbfd = _bfd_new_bfd ();
650 1.1 christos if (nbfd == NULL)
651 1.1 christos return NULL;
652 1.1 christos
653 1.1 christos target_vec = bfd_find_target (target, nbfd);
654 1.1 christos if (target_vec == NULL)
655 1.1 christos {
656 1.1 christos _bfd_delete_bfd (nbfd);
657 1.1 christos return NULL;
658 1.1 christos }
659 1.1 christos
660 1.1 christos /* PR 11983: Do not cache the original filename, but
661 1.1 christos rather make a copy - the original might go away. */
662 1.1 christos nbfd->filename = xstrdup (filename);
663 1.1 christos nbfd->direction = write_direction;
664 1.1 christos
665 1.1 christos if (bfd_open_file (nbfd) == NULL)
666 1.1 christos {
667 1.1 christos /* File not writeable, etc. */
668 1.1 christos bfd_set_error (bfd_error_system_call);
669 1.1 christos _bfd_delete_bfd (nbfd);
670 1.1 christos return NULL;
671 1.1 christos }
672 1.1 christos
673 1.1 christos return nbfd;
674 1.1 christos }
675 1.1 christos
676 1.1 christos static inline void
677 1.1 christos _maybe_make_executable (bfd * abfd)
678 1.1 christos {
679 1.1 christos /* If the file was open for writing and is now executable,
680 1.1 christos make it so. */
681 1.1 christos if (abfd->direction == write_direction
682 1.1 christos && (abfd->flags & (EXEC_P | DYNAMIC)) != 0)
683 1.1 christos {
684 1.1 christos struct stat buf;
685 1.1 christos
686 1.1 christos if (stat (abfd->filename, &buf) == 0
687 1.1 christos /* Do not attempt to change non-regular files. This is
688 1.1 christos here especially for configure scripts and kernel builds
689 1.1 christos which run tests with "ld [...] -o /dev/null". */
690 1.1 christos && S_ISREG(buf.st_mode))
691 1.1 christos {
692 1.1 christos unsigned int mask = umask (0);
693 1.1 christos
694 1.1 christos umask (mask);
695 1.1 christos chmod (abfd->filename,
696 1.1 christos (0777
697 1.1 christos & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
698 1.1 christos }
699 1.1 christos }
700 1.1 christos }
701 1.1 christos
702 1.1 christos /*
703 1.1 christos
704 1.1 christos FUNCTION
705 1.1 christos bfd_close
706 1.1 christos
707 1.1 christos SYNOPSIS
708 1.1 christos bfd_boolean bfd_close (bfd *abfd);
709 1.1 christos
710 1.1 christos DESCRIPTION
711 1.1 christos
712 1.1 christos Close a BFD. If the BFD was open for writing, then pending
713 1.1 christos operations are completed and the file written out and closed.
714 1.1 christos If the created file is executable, then <<chmod>> is called
715 1.1 christos to mark it as such.
716 1.1 christos
717 1.1 christos All memory attached to the BFD is released.
718 1.1 christos
719 1.1 christos The file descriptor associated with the BFD is closed (even
720 1.1 christos if it was passed in to BFD by <<bfd_fdopenr>>).
721 1.1 christos
722 1.1 christos RETURNS
723 1.1 christos <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
724 1.1 christos */
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 bfd_boolean ret;
731 1.1 christos
732 1.1 christos if (bfd_write_p (abfd))
733 1.1 christos {
734 1.1 christos if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
735 1.1 christos return FALSE;
736 1.1 christos }
737 1.1 christos
738 1.1 christos if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
739 1.1 christos return FALSE;
740 1.1 christos
741 1.1 christos ret = abfd->iovec->bclose (abfd) == 0;
742 1.1 christos
743 1.1 christos if (ret)
744 1.1 christos _maybe_make_executable (abfd);
745 1.1 christos
746 1.1 christos _bfd_delete_bfd (abfd);
747 1.1 christos
748 1.1 christos return ret;
749 1.1 christos }
750 1.1 christos
751 1.1 christos /*
752 1.1 christos FUNCTION
753 1.1 christos bfd_close_all_done
754 1.1 christos
755 1.1 christos SYNOPSIS
756 1.1 christos bfd_boolean bfd_close_all_done (bfd *);
757 1.1 christos
758 1.1 christos DESCRIPTION
759 1.1 christos Close a BFD. Differs from <<bfd_close>> since it does not
760 1.1 christos complete any pending operations. This routine would be used
761 1.1 christos if the application had just used BFD for swapping and didn't
762 1.1 christos want to use any of the writing code.
763 1.1 christos
764 1.1 christos If the created file is executable, then <<chmod>> is called
765 1.1 christos to mark it as such.
766 1.1 christos
767 1.1 christos All memory attached to the BFD is released.
768 1.1 christos
769 1.1 christos RETURNS
770 1.1 christos <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
771 1.1 christos */
772 1.1 christos
773 1.1 christos bfd_boolean
774 1.1 christos bfd_close_all_done (bfd *abfd)
775 1.1 christos {
776 1.1 christos bfd_boolean ret;
777 1.1 christos
778 1.1 christos ret = bfd_cache_close (abfd);
779 1.1 christos
780 1.1 christos if (ret)
781 1.1 christos _maybe_make_executable (abfd);
782 1.1 christos
783 1.1 christos _bfd_delete_bfd (abfd);
784 1.1 christos
785 1.1 christos return ret;
786 1.1 christos }
787 1.1 christos
788 1.1 christos /*
789 1.1 christos FUNCTION
790 1.1 christos bfd_create
791 1.1 christos
792 1.1 christos SYNOPSIS
793 1.1 christos bfd *bfd_create (const char *filename, bfd *templ);
794 1.1 christos
795 1.1 christos DESCRIPTION
796 1.1 christos Create a new BFD in the manner of <<bfd_openw>>, but without
797 1.1 christos opening a file. The new BFD takes the target from the target
798 1.1 christos used by @var{templ}. The format is always set to <<bfd_object>>.
799 1.1 christos
800 1.1 christos A copy of the @var{filename} argument is stored in the newly created
801 1.1 christos BFD. It can be accessed via the bfd_get_filename() macro.
802 1.1 christos */
803 1.1 christos
804 1.1 christos bfd *
805 1.1 christos bfd_create (const char *filename, bfd *templ)
806 1.1 christos {
807 1.1 christos bfd *nbfd;
808 1.1 christos
809 1.1 christos nbfd = _bfd_new_bfd ();
810 1.1 christos if (nbfd == NULL)
811 1.1 christos return NULL;
812 1.1 christos /* PR 11983: Do not cache the original filename, but
813 1.1 christos rather make a copy - the original might go away. */
814 1.1 christos nbfd->filename = xstrdup (filename);
815 1.1 christos if (templ)
816 1.1 christos nbfd->xvec = templ->xvec;
817 1.1 christos nbfd->direction = no_direction;
818 1.1 christos bfd_set_format (nbfd, bfd_object);
819 1.1 christos
820 1.1 christos return nbfd;
821 1.1 christos }
822 1.1 christos
823 1.1 christos /*
824 1.1 christos FUNCTION
825 1.1 christos bfd_make_writable
826 1.1 christos
827 1.1 christos SYNOPSIS
828 1.1 christos bfd_boolean bfd_make_writable (bfd *abfd);
829 1.1 christos
830 1.1 christos DESCRIPTION
831 1.1 christos Takes a BFD as created by <<bfd_create>> and converts it
832 1.1 christos into one like as returned by <<bfd_openw>>. It does this
833 1.1 christos by converting the BFD to BFD_IN_MEMORY. It's assumed that
834 1.1 christos you will call <<bfd_make_readable>> on this bfd later.
835 1.1 christos
836 1.1 christos RETURNS
837 1.1 christos <<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
838 1.1 christos */
839 1.1 christos
840 1.1 christos bfd_boolean
841 1.1 christos bfd_make_writable (bfd *abfd)
842 1.1 christos {
843 1.1 christos struct bfd_in_memory *bim;
844 1.1 christos
845 1.1 christos if (abfd->direction != no_direction)
846 1.1 christos {
847 1.1 christos bfd_set_error (bfd_error_invalid_operation);
848 1.1 christos return FALSE;
849 1.1 christos }
850 1.1 christos
851 1.1 christos bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory));
852 1.1 christos if (bim == NULL)
853 1.1 christos return FALSE; /* bfd_error already set. */
854 1.1 christos abfd->iostream = bim;
855 1.1 christos /* bfd_bwrite will grow these as needed. */
856 1.1 christos bim->size = 0;
857 1.1 christos bim->buffer = 0;
858 1.1 christos
859 1.1 christos abfd->flags |= BFD_IN_MEMORY;
860 1.1 christos abfd->iovec = &_bfd_memory_iovec;
861 1.1 christos abfd->origin = 0;
862 1.1 christos abfd->direction = write_direction;
863 1.1 christos abfd->where = 0;
864 1.1 christos
865 1.1 christos return TRUE;
866 1.1 christos }
867 1.1 christos
868 1.1 christos /*
869 1.1 christos FUNCTION
870 1.1 christos bfd_make_readable
871 1.1 christos
872 1.1 christos SYNOPSIS
873 1.1 christos bfd_boolean bfd_make_readable (bfd *abfd);
874 1.1 christos
875 1.1 christos DESCRIPTION
876 1.1 christos Takes a BFD as created by <<bfd_create>> and
877 1.1 christos <<bfd_make_writable>> and converts it into one like as
878 1.1 christos returned by <<bfd_openr>>. It does this by writing the
879 1.1 christos contents out to the memory buffer, then reversing the
880 1.1 christos direction.
881 1.1 christos
882 1.1 christos RETURNS
883 1.1 christos <<TRUE>> is returned if all is ok, otherwise <<FALSE>>. */
884 1.1 christos
885 1.1 christos bfd_boolean
886 1.1 christos bfd_make_readable (bfd *abfd)
887 1.1 christos {
888 1.1 christos if (abfd->direction != write_direction || !(abfd->flags & BFD_IN_MEMORY))
889 1.1 christos {
890 1.1 christos bfd_set_error (bfd_error_invalid_operation);
891 1.1 christos return FALSE;
892 1.1 christos }
893 1.1 christos
894 1.1 christos if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
895 1.1 christos return FALSE;
896 1.1 christos
897 1.1 christos if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
898 1.1 christos return FALSE;
899 1.1 christos
900 1.1 christos abfd->arch_info = &bfd_default_arch_struct;
901 1.1 christos
902 1.1 christos abfd->where = 0;
903 1.1 christos abfd->format = bfd_unknown;
904 1.1 christos abfd->my_archive = NULL;
905 1.1 christos abfd->origin = 0;
906 1.1 christos abfd->opened_once = FALSE;
907 1.1 christos abfd->output_has_begun = FALSE;
908 1.1 christos abfd->section_count = 0;
909 1.1 christos abfd->usrdata = NULL;
910 1.1 christos abfd->cacheable = FALSE;
911 1.1 christos abfd->flags |= BFD_IN_MEMORY;
912 1.1 christos abfd->mtime_set = FALSE;
913 1.1 christos
914 1.1 christos abfd->target_defaulted = TRUE;
915 1.1 christos abfd->direction = read_direction;
916 1.1 christos abfd->sections = 0;
917 1.1 christos abfd->symcount = 0;
918 1.1 christos abfd->outsymbols = 0;
919 1.1 christos abfd->tdata.any = 0;
920 1.1 christos
921 1.1 christos bfd_section_list_clear (abfd);
922 1.1 christos bfd_check_format (abfd, bfd_object);
923 1.1 christos
924 1.1 christos return TRUE;
925 1.1 christos }
926 1.1 christos
927 1.1 christos /*
928 1.1 christos FUNCTION
929 1.1 christos bfd_alloc
930 1.1 christos
931 1.1 christos SYNOPSIS
932 1.1 christos void *bfd_alloc (bfd *abfd, bfd_size_type wanted);
933 1.1 christos
934 1.1 christos DESCRIPTION
935 1.1 christos Allocate a block of @var{wanted} bytes of memory attached to
936 1.1 christos <<abfd>> and return a pointer to it.
937 1.1 christos */
938 1.1 christos
939 1.1 christos void *
940 1.1 christos bfd_alloc (bfd *abfd, bfd_size_type size)
941 1.1 christos {
942 1.3 christos void *ret;
943 1.1 christos unsigned long ul_size = (unsigned long) size;
944 1.3 christos
945 1.3 christos if (size != ul_size
946 1.3 christos /* Note - although objalloc_alloc takes an unsigned long as its
947 1.3 christos argument, internally the size is treated as a signed long. This can
948 1.3 christos lead to problems where, for example, a request to allocate -1 bytes
949 1.3 christos can result in just 1 byte being allocated, rather than
950 1.3 christos ((unsigned long) -1) bytes. Also memory checkers will often
951 1.3 christos complain about attempts to allocate a negative amount of memory.
952 1.3 christos So to stop these problems we fail if the size is negative. */
953 1.1 christos || ((signed long) ul_size) < 0)
954 1.1 christos {
955 1.1 christos bfd_set_error (bfd_error_no_memory);
956 1.1 christos return NULL;
957 1.1 christos }
958 1.3 christos
959 1.1 christos ret = objalloc_alloc ((struct objalloc *) abfd->memory, ul_size);
960 1.1 christos if (ret == NULL)
961 1.1 christos bfd_set_error (bfd_error_no_memory);
962 1.1 christos return ret;
963 1.1 christos }
964 1.1 christos
965 1.1 christos /*
966 1.1 christos INTERNAL_FUNCTION
967 1.1 christos bfd_alloc2
968 1.1 christos
969 1.1 christos SYNOPSIS
970 1.1 christos void *bfd_alloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size);
971 1.1 christos
972 1.1 christos DESCRIPTION
973 1.1 christos Allocate a block of @var{nmemb} elements of @var{size} bytes each
974 1.1 christos of memory attached to <<abfd>> and return a pointer to it.
975 1.1 christos */
976 1.1 christos
977 1.1 christos void *
978 1.1 christos bfd_alloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size)
979 1.1 christos {
980 1.1 christos if ((nmemb | size) >= HALF_BFD_SIZE_TYPE
981 1.1 christos && size != 0
982 1.1 christos && nmemb > ~(bfd_size_type) 0 / size)
983 1.1 christos {
984 1.1 christos bfd_set_error (bfd_error_no_memory);
985 1.1 christos return NULL;
986 1.1 christos }
987 1.3 christos
988 1.1 christos return bfd_alloc (abfd, size * nmemb);
989 1.1 christos }
990 1.1 christos
991 1.1 christos /*
992 1.1 christos FUNCTION
993 1.1 christos bfd_zalloc
994 1.1 christos
995 1.1 christos SYNOPSIS
996 1.1 christos void *bfd_zalloc (bfd *abfd, bfd_size_type wanted);
997 1.1 christos
998 1.1 christos DESCRIPTION
999 1.1 christos Allocate a block of @var{wanted} bytes of zeroed memory
1000 1.1 christos attached to <<abfd>> and return a pointer to it.
1001 1.1 christos */
1002 1.1 christos
1003 1.1 christos void *
1004 1.1 christos bfd_zalloc (bfd *abfd, bfd_size_type size)
1005 1.1 christos {
1006 1.1 christos void *res;
1007 1.1 christos
1008 1.1 christos res = bfd_alloc (abfd, size);
1009 1.1 christos if (res)
1010 1.1 christos memset (res, 0, (size_t) size);
1011 1.1 christos return res;
1012 1.1 christos }
1013 1.1 christos
1014 1.1 christos /*
1015 1.1 christos INTERNAL_FUNCTION
1016 1.1 christos bfd_zalloc2
1017 1.1 christos
1018 1.1 christos SYNOPSIS
1019 1.1 christos void *bfd_zalloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size);
1020 1.1 christos
1021 1.1 christos DESCRIPTION
1022 1.1 christos Allocate a block of @var{nmemb} elements of @var{size} bytes each
1023 1.1 christos of zeroed memory attached to <<abfd>> and return a pointer to it.
1024 1.1 christos */
1025 1.1 christos
1026 1.1 christos void *
1027 1.1 christos bfd_zalloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size)
1028 1.1 christos {
1029 1.1 christos void *res;
1030 1.1 christos
1031 1.1 christos if ((nmemb | size) >= HALF_BFD_SIZE_TYPE
1032 1.1 christos && size != 0
1033 1.1 christos && nmemb > ~(bfd_size_type) 0 / size)
1034 1.1 christos {
1035 1.1 christos bfd_set_error (bfd_error_no_memory);
1036 1.1 christos return NULL;
1037 1.1 christos }
1038 1.1 christos
1039 1.1 christos size *= nmemb;
1040 1.1 christos
1041 1.1 christos res = bfd_alloc (abfd, size);
1042 1.1 christos if (res)
1043 1.1 christos memset (res, 0, (size_t) size);
1044 1.1 christos return res;
1045 1.1 christos }
1046 1.1 christos
1047 1.1 christos /* Free a block allocated for a BFD.
1048 1.1 christos Note: Also frees all more recently allocated blocks! */
1049 1.1 christos
1050 1.1 christos void
1051 1.1 christos bfd_release (bfd *abfd, void *block)
1052 1.1 christos {
1053 1.1 christos objalloc_free_block ((struct objalloc *) abfd->memory, block);
1054 1.1 christos }
1055 1.1 christos
1056 1.1 christos
1057 1.1 christos /*
1058 1.1 christos GNU Extension: separate debug-info files
1059 1.1 christos
1060 1.1 christos The idea here is that a special section called .gnu_debuglink might be
1061 1.1 christos embedded in a binary file, which indicates that some *other* file
1062 1.1 christos contains the real debugging information. This special section contains a
1063 1.1 christos filename and CRC32 checksum, which we read and resolve to another file,
1064 1.1 christos if it exists.
1065 1.1 christos
1066 1.1 christos This facilitates "optional" provision of debugging information, without
1067 1.1 christos having to provide two complete copies of every binary object (with and
1068 1.1 christos without debug symbols). */
1069 1.1 christos
1070 1.1 christos #define GNU_DEBUGLINK ".gnu_debuglink"
1071 1.1 christos #define GNU_DEBUGALTLINK ".gnu_debugaltlink"
1072 1.1 christos
1073 1.1 christos /*
1074 1.1 christos FUNCTION
1075 1.1 christos bfd_calc_gnu_debuglink_crc32
1076 1.1 christos
1077 1.1 christos SYNOPSIS
1078 1.1 christos unsigned long bfd_calc_gnu_debuglink_crc32
1079 1.1 christos (unsigned long crc, const unsigned char *buf, bfd_size_type len);
1080 1.1 christos
1081 1.1 christos DESCRIPTION
1082 1.1 christos Computes a CRC value as used in the .gnu_debuglink section.
1083 1.1 christos Advances the previously computed @var{crc} value by computing
1084 1.1 christos and adding in the crc32 for @var{len} bytes of @var{buf}.
1085 1.1 christos
1086 1.1 christos RETURNS
1087 1.1 christos Return the updated CRC32 value.
1088 1.1 christos */
1089 1.1 christos
1090 1.1 christos unsigned long
1091 1.1 christos bfd_calc_gnu_debuglink_crc32 (unsigned long crc,
1092 1.1 christos const unsigned char *buf,
1093 1.1 christos bfd_size_type len)
1094 1.1 christos {
1095 1.1 christos static const unsigned long crc32_table[256] =
1096 1.1 christos {
1097 1.1 christos 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
1098 1.1 christos 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
1099 1.1 christos 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
1100 1.1 christos 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
1101 1.1 christos 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
1102 1.1 christos 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
1103 1.1 christos 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
1104 1.1 christos 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
1105 1.1 christos 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
1106 1.1 christos 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
1107 1.1 christos 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
1108 1.1 christos 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
1109 1.1 christos 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
1110 1.1 christos 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
1111 1.1 christos 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
1112 1.1 christos 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
1113 1.1 christos 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
1114 1.1 christos 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
1115 1.1 christos 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
1116 1.1 christos 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
1117 1.1 christos 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
1118 1.1 christos 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
1119 1.1 christos 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
1120 1.1 christos 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
1121 1.1 christos 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
1122 1.1 christos 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
1123 1.1 christos 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
1124 1.1 christos 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
1125 1.1 christos 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
1126 1.1 christos 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
1127 1.1 christos 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
1128 1.1 christos 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
1129 1.1 christos 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
1130 1.1 christos 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
1131 1.1 christos 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
1132 1.1 christos 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
1133 1.1 christos 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
1134 1.1 christos 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
1135 1.1 christos 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
1136 1.1 christos 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
1137 1.1 christos 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
1138 1.1 christos 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
1139 1.1 christos 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
1140 1.1 christos 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
1141 1.1 christos 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
1142 1.1 christos 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
1143 1.1 christos 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
1144 1.1 christos 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
1145 1.1 christos 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
1146 1.1 christos 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
1147 1.1 christos 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
1148 1.1 christos 0x2d02ef8d
1149 1.1 christos };
1150 1.1 christos const unsigned char *end;
1151 1.1 christos
1152 1.1 christos crc = ~crc & 0xffffffff;
1153 1.1 christos for (end = buf + len; buf < end; ++ buf)
1154 1.1 christos crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
1155 1.1 christos return ~crc & 0xffffffff;
1156 1.1 christos }
1157 1.1 christos
1158 1.1 christos
1159 1.1 christos /*
1160 1.1 christos FUNCTION
1161 1.1 christos bfd_get_debug_link_info
1162 1.1 christos
1163 1.1 christos SYNOPSIS
1164 1.1 christos char *bfd_get_debug_link_info (bfd *abfd, unsigned long *crc32_out);
1165 1.1 christos
1166 1.1 christos DESCRIPTION
1167 1.1 christos Fetch the filename and CRC32 value for any separate debuginfo
1168 1.1 christos associated with @var{abfd}. Return NULL if no such info found,
1169 1.1 christos otherwise return filename and update @var{crc32_out}. The
1170 1.1 christos returned filename is allocated with @code{malloc}; freeing it
1171 1.1 christos is the responsibility of the caller.
1172 1.1 christos */
1173 1.1 christos
1174 1.1 christos char *
1175 1.1 christos bfd_get_debug_link_info (bfd *abfd, unsigned long *crc32_out)
1176 1.1 christos {
1177 1.1 christos asection *sect;
1178 1.1 christos unsigned long crc32;
1179 1.3 christos bfd_byte *contents;
1180 1.1 christos unsigned int crc_offset;
1181 1.1 christos char *name;
1182 1.1 christos
1183 1.1 christos BFD_ASSERT (abfd);
1184 1.1 christos BFD_ASSERT (crc32_out);
1185 1.1 christos
1186 1.1 christos sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
1187 1.1 christos
1188 1.1 christos if (sect == NULL)
1189 1.1 christos return NULL;
1190 1.1 christos
1191 1.1 christos if (!bfd_malloc_and_get_section (abfd, sect, &contents))
1192 1.1 christos {
1193 1.1 christos if (contents != NULL)
1194 1.1 christos free (contents);
1195 1.1 christos return NULL;
1196 1.1 christos }
1197 1.3 christos
1198 1.1 christos /* CRC value is stored after the filename, aligned up to 4 bytes. */
1199 1.3 christos name = (char *) contents;
1200 1.3 christos /* PR 17597: avoid reading off the end of the buffer. */
1201 1.1 christos crc_offset = strnlen (name, bfd_get_section_size (sect)) + 1;
1202 1.3 christos crc_offset = (crc_offset + 3) & ~3;
1203 1.3 christos if (crc_offset >= bfd_get_section_size (sect))
1204 1.1 christos return NULL;
1205 1.1 christos
1206 1.1 christos crc32 = bfd_get_32 (abfd, contents + crc_offset);
1207 1.1 christos
1208 1.1 christos *crc32_out = crc32;
1209 1.1 christos return name;
1210 1.1 christos }
1211 1.1 christos
1212 1.1 christos /*
1213 1.1 christos FUNCTION
1214 1.1 christos bfd_get_alt_debug_link_info
1215 1.1 christos
1216 1.1 christos SYNOPSIS
1217 1.1 christos char *bfd_get_alt_debug_link_info (bfd * abfd,
1218 1.1 christos bfd_size_type *buildid_len,
1219 1.1 christos bfd_byte **buildid_out);
1220 1.1 christos
1221 1.1 christos DESCRIPTION
1222 1.1 christos Fetch the filename and BuildID value for any alternate debuginfo
1223 1.1 christos associated with @var{abfd}. Return NULL if no such info found,
1224 1.1 christos otherwise return filename and update @var{buildid_len} and
1225 1.1 christos @var{buildid_out}. The returned filename and build_id are
1226 1.1 christos allocated with @code{malloc}; freeing them is the
1227 1.1 christos responsibility of the caller.
1228 1.1 christos */
1229 1.1 christos
1230 1.1 christos char *
1231 1.1 christos bfd_get_alt_debug_link_info (bfd * abfd, bfd_size_type *buildid_len,
1232 1.1 christos bfd_byte **buildid_out)
1233 1.1 christos {
1234 1.1 christos asection *sect;
1235 1.3 christos bfd_byte *contents;
1236 1.1 christos unsigned int buildid_offset;
1237 1.1 christos char *name;
1238 1.1 christos
1239 1.1 christos BFD_ASSERT (abfd);
1240 1.1 christos BFD_ASSERT (buildid_len);
1241 1.1 christos BFD_ASSERT (buildid_out);
1242 1.1 christos
1243 1.1 christos sect = bfd_get_section_by_name (abfd, GNU_DEBUGALTLINK);
1244 1.1 christos
1245 1.1 christos if (sect == NULL)
1246 1.1 christos return NULL;
1247 1.1 christos
1248 1.1 christos if (!bfd_malloc_and_get_section (abfd, sect, & contents))
1249 1.1 christos {
1250 1.1 christos if (contents != NULL)
1251 1.1 christos free (contents);
1252 1.1 christos return NULL;
1253 1.1 christos }
1254 1.1 christos
1255 1.1 christos /* BuildID value is stored after the filename. */
1256 1.3 christos name = (char *) contents;
1257 1.3 christos buildid_offset = strnlen (name, bfd_get_section_size (sect)) + 1;
1258 1.3 christos if (buildid_offset >= bfd_get_section_size (sect))
1259 1.1 christos return NULL;
1260 1.1 christos
1261 1.1 christos *buildid_len = bfd_get_section_size (sect) - buildid_offset;
1262 1.1 christos *buildid_out = bfd_malloc (*buildid_len);
1263 1.1 christos memcpy (*buildid_out, contents + buildid_offset, *buildid_len);
1264 1.1 christos
1265 1.1 christos return name;
1266 1.1 christos }
1267 1.1 christos
1268 1.1 christos /*
1269 1.1 christos INTERNAL_FUNCTION
1270 1.1 christos separate_debug_file_exists
1271 1.1 christos
1272 1.1 christos SYNOPSIS
1273 1.1 christos bfd_boolean separate_debug_file_exists
1274 1.1 christos (char *name, unsigned long crc32);
1275 1.1 christos
1276 1.1 christos DESCRIPTION
1277 1.1 christos Checks to see if @var{name} is a file and if its contents
1278 1.1 christos match @var{crc32}.
1279 1.1 christos */
1280 1.1 christos
1281 1.1 christos static bfd_boolean
1282 1.1 christos separate_debug_file_exists (const char *name, const unsigned long crc)
1283 1.1 christos {
1284 1.1 christos static unsigned char buffer [8 * 1024];
1285 1.1 christos unsigned long file_crc = 0;
1286 1.1 christos FILE *f;
1287 1.1 christos bfd_size_type count;
1288 1.1 christos
1289 1.1 christos BFD_ASSERT (name);
1290 1.1 christos
1291 1.1 christos f = real_fopen (name, FOPEN_RB);
1292 1.1 christos if (f == NULL)
1293 1.1 christos return FALSE;
1294 1.1 christos
1295 1.1 christos while ((count = fread (buffer, 1, sizeof (buffer), f)) > 0)
1296 1.1 christos file_crc = bfd_calc_gnu_debuglink_crc32 (file_crc, buffer, count);
1297 1.1 christos
1298 1.1 christos fclose (f);
1299 1.1 christos
1300 1.1 christos return crc == file_crc;
1301 1.1 christos }
1302 1.1 christos
1303 1.1 christos /*
1304 1.1 christos INTERNAL_FUNCTION
1305 1.1 christos separate_alt_debug_file_exists
1306 1.1 christos
1307 1.1 christos SYNOPSIS
1308 1.1 christos bfd_boolean separate_alt_debug_file_exists
1309 1.1 christos (char *name, unsigned long crc32);
1310 1.1 christos
1311 1.1 christos DESCRIPTION
1312 1.1 christos Checks to see if @var{name} is a file and if its BuildID
1313 1.1 christos matches @var{buildid}.
1314 1.1 christos */
1315 1.1 christos
1316 1.1 christos static bfd_boolean
1317 1.1 christos separate_alt_debug_file_exists (const char *name,
1318 1.1 christos const unsigned long buildid ATTRIBUTE_UNUSED)
1319 1.1 christos {
1320 1.1 christos FILE *f;
1321 1.1 christos
1322 1.1 christos BFD_ASSERT (name);
1323 1.1 christos
1324 1.1 christos f = real_fopen (name, FOPEN_RB);
1325 1.1 christos if (f == NULL)
1326 1.1 christos return FALSE;
1327 1.1 christos
1328 1.1 christos /* FIXME: Add code to check buildid. */
1329 1.1 christos
1330 1.1 christos fclose (f);
1331 1.1 christos
1332 1.1 christos return TRUE;
1333 1.1 christos }
1334 1.1 christos
1335 1.1 christos /*
1336 1.1 christos INTERNAL_FUNCTION
1337 1.1 christos find_separate_debug_file
1338 1.1 christos
1339 1.1 christos SYNOPSIS
1340 1.1 christos char *find_separate_debug_file (bfd *abfd);
1341 1.1 christos
1342 1.1 christos DESCRIPTION
1343 1.1 christos Searches @var{abfd} for a section called @var{section_name} which
1344 1.1 christos is expected to contain a reference to a file containing separate
1345 1.1 christos debugging information. The function scans various locations in
1346 1.1 christos the filesystem, including the file tree rooted at
1347 1.1 christos @var{debug_file_directory}, and returns the first matching
1348 1.1 christos filename that it finds. If @var{check_crc} is TRUE then the
1349 1.1 christos contents of the file must also match the CRC value contained in
1350 1.1 christos @var{section_name}. Returns NULL if no valid file could be found.
1351 1.1 christos */
1352 1.1 christos
1353 1.1 christos typedef char * (* get_func_type) (bfd *, unsigned long *);
1354 1.1 christos typedef bfd_boolean (* check_func_type) (const char *, const unsigned long);
1355 1.1 christos
1356 1.1 christos static char *
1357 1.1 christos find_separate_debug_file (bfd * abfd,
1358 1.1 christos const char * debug_file_directory,
1359 1.1 christos get_func_type get_func,
1360 1.1 christos check_func_type check_func)
1361 1.1 christos {
1362 1.1 christos char *base;
1363 1.1 christos char *dir;
1364 1.1 christos char *debugfile;
1365 1.1 christos char *canon_dir;
1366 1.1 christos unsigned long crc32;
1367 1.1 christos size_t dirlen;
1368 1.1 christos size_t canon_dirlen;
1369 1.1 christos
1370 1.1 christos BFD_ASSERT (abfd);
1371 1.1 christos if (debug_file_directory == NULL)
1372 1.1 christos debug_file_directory = ".";
1373 1.1 christos
1374 1.1 christos /* BFD may have been opened from a stream. */
1375 1.1 christos if (abfd->filename == NULL)
1376 1.1 christos {
1377 1.1 christos bfd_set_error (bfd_error_invalid_operation);
1378 1.1 christos return NULL;
1379 1.1 christos }
1380 1.1 christos
1381 1.1 christos base = get_func (abfd, & crc32);
1382 1.1 christos
1383 1.1 christos if (base == NULL)
1384 1.1 christos return NULL;
1385 1.1 christos
1386 1.1 christos if (base[0] == '\0')
1387 1.1 christos {
1388 1.1 christos free (base);
1389 1.1 christos bfd_set_error (bfd_error_no_debug_section);
1390 1.1 christos return NULL;
1391 1.1 christos }
1392 1.1 christos
1393 1.1 christos for (dirlen = strlen (abfd->filename); dirlen > 0; dirlen--)
1394 1.1 christos if (IS_DIR_SEPARATOR (abfd->filename[dirlen - 1]))
1395 1.1 christos break;
1396 1.1 christos
1397 1.1 christos dir = (char *) bfd_malloc (dirlen + 1);
1398 1.1 christos if (dir == NULL)
1399 1.1 christos {
1400 1.1 christos free (base);
1401 1.1 christos return NULL;
1402 1.1 christos }
1403 1.1 christos memcpy (dir, abfd->filename, dirlen);
1404 1.1 christos dir[dirlen] = '\0';
1405 1.1 christos
1406 1.1 christos /* Compute the canonical name of the bfd object with all symbolic links
1407 1.1 christos resolved, for use in the global debugfile directory. */
1408 1.1 christos canon_dir = lrealpath (abfd->filename);
1409 1.1 christos for (canon_dirlen = strlen (canon_dir); canon_dirlen > 0; canon_dirlen--)
1410 1.1 christos if (IS_DIR_SEPARATOR (canon_dir[canon_dirlen - 1]))
1411 1.1 christos break;
1412 1.1 christos canon_dir[canon_dirlen] = '\0';
1413 1.1 christos
1414 1.1 christos debugfile = (char *)
1415 1.1 christos bfd_malloc (strlen (debug_file_directory) + 1
1416 1.1 christos + (canon_dirlen > dirlen ? canon_dirlen : dirlen)
1417 1.1 christos + strlen (".debug/")
1418 1.1 christos + strlen (base)
1419 1.1 christos + 1);
1420 1.1 christos if (debugfile == NULL)
1421 1.1 christos goto found; /* Actually this returns NULL. */
1422 1.1 christos
1423 1.1 christos /* First try in the same directory as the original file: */
1424 1.1 christos strcpy (debugfile, dir);
1425 1.1 christos strcat (debugfile, base);
1426 1.1 christos
1427 1.1 christos if (check_func (debugfile, crc32))
1428 1.1 christos goto found;
1429 1.1 christos
1430 1.1 christos /* Then try in a subdirectory called .debug. */
1431 1.1 christos strcpy (debugfile, dir);
1432 1.1 christos strcat (debugfile, ".debug/");
1433 1.1 christos strcat (debugfile, base);
1434 1.1 christos
1435 1.1 christos if (check_func (debugfile, crc32))
1436 1.1 christos goto found;
1437 1.1 christos
1438 1.1 christos /* Then try in the global debugfile directory. */
1439 1.1 christos strcpy (debugfile, debug_file_directory);
1440 1.1 christos dirlen = strlen (debug_file_directory) - 1;
1441 1.1 christos if (dirlen > 0
1442 1.1 christos && debug_file_directory[dirlen] != '/'
1443 1.1 christos && canon_dir[0] != '/')
1444 1.1 christos strcat (debugfile, "/");
1445 1.1 christos strcat (debugfile, canon_dir);
1446 1.1 christos strcat (debugfile, base);
1447 1.1 christos
1448 1.1 christos if (check_func (debugfile, crc32))
1449 1.1 christos goto found;
1450 1.1 christos
1451 1.1 christos /* Failed to find the file. */
1452 1.1 christos free (debugfile);
1453 1.1 christos debugfile = NULL;
1454 1.1 christos
1455 1.1 christos found:
1456 1.1 christos free (base);
1457 1.1 christos free (dir);
1458 1.1 christos free (canon_dir);
1459 1.1 christos return debugfile;
1460 1.1 christos }
1461 1.1 christos
1462 1.1 christos
1463 1.1 christos /*
1464 1.1 christos FUNCTION
1465 1.1 christos bfd_follow_gnu_debuglink
1466 1.1 christos
1467 1.1 christos SYNOPSIS
1468 1.1 christos char *bfd_follow_gnu_debuglink (bfd *abfd, const char *dir);
1469 1.1 christos
1470 1.1 christos DESCRIPTION
1471 1.1 christos
1472 1.1 christos Takes a BFD and searches it for a .gnu_debuglink section. If this
1473 1.1 christos section is found, it examines the section for the name and checksum
1474 1.1 christos of a '.debug' file containing auxiliary debugging information. It
1475 1.1 christos then searches the filesystem for this .debug file in some standard
1476 1.1 christos locations, including the directory tree rooted at @var{dir}, and if
1477 1.1 christos found returns the full filename.
1478 1.1 christos
1479 1.1 christos If @var{dir} is NULL, it will search a default path configured into
1480 1.1 christos libbfd at build time. [XXX this feature is not currently
1481 1.1 christos implemented].
1482 1.1 christos
1483 1.1 christos RETURNS
1484 1.1 christos <<NULL>> on any errors or failure to locate the .debug file,
1485 1.1 christos otherwise a pointer to a heap-allocated string containing the
1486 1.1 christos filename. The caller is responsible for freeing this string.
1487 1.1 christos */
1488 1.1 christos
1489 1.1 christos char *
1490 1.1 christos bfd_follow_gnu_debuglink (bfd *abfd, const char *dir)
1491 1.1 christos {
1492 1.1 christos return find_separate_debug_file (abfd, dir,
1493 1.1 christos bfd_get_debug_link_info,
1494 1.1 christos separate_debug_file_exists);
1495 1.1 christos }
1496 1.1 christos
1497 1.1 christos /* Helper for bfd_follow_gnu_debugaltlink. It just pretends to return
1498 1.1 christos a CRC. .gnu_debugaltlink supplies a build-id, which is different,
1499 1.1 christos but this is ok because separate_alt_debug_file_exists ignores the
1500 1.1 christos CRC anyway. */
1501 1.1 christos
1502 1.1 christos static char *
1503 1.1 christos get_alt_debug_link_info_shim (bfd * abfd, unsigned long *crc32_out)
1504 1.1 christos {
1505 1.1 christos bfd_size_type len;
1506 1.1 christos bfd_byte *buildid = NULL;
1507 1.1 christos char *result = bfd_get_alt_debug_link_info (abfd, &len, &buildid);
1508 1.1 christos
1509 1.1 christos *crc32_out = 0;
1510 1.1 christos free (buildid);
1511 1.1 christos
1512 1.1 christos return result;
1513 1.1 christos }
1514 1.1 christos
1515 1.1 christos /*
1516 1.1 christos FUNCTION
1517 1.1 christos bfd_follow_gnu_debugaltlink
1518 1.1 christos
1519 1.1 christos SYNOPSIS
1520 1.1 christos char *bfd_follow_gnu_debugaltlink (bfd *abfd, const char *dir);
1521 1.1 christos
1522 1.1 christos DESCRIPTION
1523 1.1 christos
1524 1.1 christos Takes a BFD and searches it for a .gnu_debugaltlink section. If this
1525 1.1 christos section is found, it examines the section for the name of a file
1526 1.1 christos containing auxiliary debugging information. It then searches the
1527 1.1 christos filesystem for this file in a set of standard locations, including
1528 1.1 christos the directory tree rooted at @var{dir}, and if found returns the
1529 1.1 christos full filename.
1530 1.1 christos
1531 1.1 christos If @var{dir} is NULL, it will search a default path configured into
1532 1.1 christos libbfd at build time. [FIXME: This feature is not currently
1533 1.1 christos implemented].
1534 1.1 christos
1535 1.1 christos RETURNS
1536 1.1 christos <<NULL>> on any errors or failure to locate the debug file,
1537 1.1 christos otherwise a pointer to a heap-allocated string containing the
1538 1.1 christos filename. The caller is responsible for freeing this string.
1539 1.1 christos */
1540 1.1 christos
1541 1.1 christos char *
1542 1.1 christos bfd_follow_gnu_debugaltlink (bfd *abfd, const char *dir)
1543 1.1 christos {
1544 1.1 christos return find_separate_debug_file (abfd, dir,
1545 1.1 christos get_alt_debug_link_info_shim,
1546 1.1 christos separate_alt_debug_file_exists);
1547 1.1 christos }
1548 1.1 christos
1549 1.1 christos /*
1550 1.1 christos FUNCTION
1551 1.1 christos bfd_create_gnu_debuglink_section
1552 1.1 christos
1553 1.1 christos SYNOPSIS
1554 1.1 christos struct bfd_section *bfd_create_gnu_debuglink_section
1555 1.1 christos (bfd *abfd, const char *filename);
1556 1.1 christos
1557 1.1 christos DESCRIPTION
1558 1.1 christos
1559 1.1 christos Takes a @var{BFD} and adds a .gnu_debuglink section to it. The section is sized
1560 1.1 christos to be big enough to contain a link to the specified @var{filename}.
1561 1.1 christos
1562 1.1 christos RETURNS
1563 1.1 christos A pointer to the new section is returned if all is ok. Otherwise <<NULL>> is
1564 1.1 christos returned and bfd_error is set.
1565 1.1 christos */
1566 1.1 christos
1567 1.1 christos asection *
1568 1.1 christos bfd_create_gnu_debuglink_section (bfd *abfd, const char *filename)
1569 1.1 christos {
1570 1.1 christos asection *sect;
1571 1.1 christos bfd_size_type debuglink_size;
1572 1.1 christos flagword flags;
1573 1.1 christos
1574 1.1 christos if (abfd == NULL || filename == NULL)
1575 1.1 christos {
1576 1.1 christos bfd_set_error (bfd_error_invalid_operation);
1577 1.1 christos return NULL;
1578 1.1 christos }
1579 1.1 christos
1580 1.1 christos /* Strip off any path components in filename. */
1581 1.1 christos filename = lbasename (filename);
1582 1.1 christos
1583 1.1 christos sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
1584 1.1 christos if (sect)
1585 1.1 christos {
1586 1.1 christos /* Section already exists. */
1587 1.1 christos bfd_set_error (bfd_error_invalid_operation);
1588 1.1 christos return NULL;
1589 1.1 christos }
1590 1.1 christos
1591 1.1 christos flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
1592 1.1 christos sect = bfd_make_section_with_flags (abfd, GNU_DEBUGLINK, flags);
1593 1.1 christos if (sect == NULL)
1594 1.1 christos return NULL;
1595 1.1 christos
1596 1.1 christos debuglink_size = strlen (filename) + 1;
1597 1.1 christos debuglink_size += 3;
1598 1.1 christos debuglink_size &= ~3;
1599 1.1 christos debuglink_size += 4;
1600 1.1 christos
1601 1.1 christos if (! bfd_set_section_size (abfd, sect, debuglink_size))
1602 1.1 christos /* XXX Should we delete the section from the bfd ? */
1603 1.1 christos return NULL;
1604 1.1 christos
1605 1.1 christos return sect;
1606 1.1 christos }
1607 1.1 christos
1608 1.1 christos
1609 1.1 christos /*
1610 1.1 christos FUNCTION
1611 1.1 christos bfd_fill_in_gnu_debuglink_section
1612 1.1 christos
1613 1.1 christos SYNOPSIS
1614 1.1 christos bfd_boolean bfd_fill_in_gnu_debuglink_section
1615 1.1 christos (bfd *abfd, struct bfd_section *sect, const char *filename);
1616 1.1 christos
1617 1.1 christos DESCRIPTION
1618 1.1 christos
1619 1.1 christos Takes a @var{BFD} and containing a .gnu_debuglink section @var{SECT}
1620 1.1 christos and fills in the contents of the section to contain a link to the
1621 1.1 christos specified @var{filename}. The filename should be relative to the
1622 1.1 christos current directory.
1623 1.1 christos
1624 1.1 christos RETURNS
1625 1.1 christos <<TRUE>> is returned if all is ok. Otherwise <<FALSE>> is returned
1626 1.1 christos and bfd_error is set.
1627 1.1 christos */
1628 1.1 christos
1629 1.1 christos bfd_boolean
1630 1.1 christos bfd_fill_in_gnu_debuglink_section (bfd *abfd,
1631 1.1 christos struct bfd_section *sect,
1632 1.1 christos const char *filename)
1633 1.1 christos {
1634 1.1 christos bfd_size_type debuglink_size;
1635 1.1 christos unsigned long crc32;
1636 1.1 christos char * contents;
1637 1.1 christos bfd_size_type crc_offset;
1638 1.1 christos FILE * handle;
1639 1.1 christos static unsigned char buffer[8 * 1024];
1640 1.1 christos size_t count;
1641 1.1 christos size_t filelen;
1642 1.1 christos
1643 1.1 christos if (abfd == NULL || sect == NULL || filename == NULL)
1644 1.1 christos {
1645 1.1 christos bfd_set_error (bfd_error_invalid_operation);
1646 1.1 christos return FALSE;
1647 1.1 christos }
1648 1.1 christos
1649 1.1 christos /* Make sure that we can read the file.
1650 1.1 christos XXX - Should we attempt to locate the debug info file using the same
1651 1.1 christos algorithm as gdb ? At the moment, since we are creating the
1652 1.1 christos .gnu_debuglink section, we insist upon the user providing us with a
1653 1.1 christos correct-for-section-creation-time path, but this need not conform to
1654 1.1 christos the gdb location algorithm. */
1655 1.1 christos handle = real_fopen (filename, FOPEN_RB);
1656 1.1 christos if (handle == NULL)
1657 1.1 christos {
1658 1.1 christos bfd_set_error (bfd_error_system_call);
1659 1.1 christos return FALSE;
1660 1.1 christos }
1661 1.1 christos
1662 1.1 christos crc32 = 0;
1663 1.1 christos while ((count = fread (buffer, 1, sizeof buffer, handle)) > 0)
1664 1.1 christos crc32 = bfd_calc_gnu_debuglink_crc32 (crc32, buffer, count);
1665 1.1 christos fclose (handle);
1666 1.1 christos
1667 1.1 christos /* Strip off any path components in filename,
1668 1.1 christos now that we no longer need them. */
1669 1.1 christos filename = lbasename (filename);
1670 1.1 christos
1671 1.1 christos filelen = strlen (filename);
1672 1.1 christos debuglink_size = filelen + 1;
1673 1.1 christos debuglink_size += 3;
1674 1.1 christos debuglink_size &= ~3;
1675 1.1 christos debuglink_size += 4;
1676 1.1 christos
1677 1.1 christos contents = (char *) bfd_malloc (debuglink_size);
1678 1.1 christos if (contents == NULL)
1679 1.1 christos {
1680 1.1 christos /* XXX Should we delete the section from the bfd ? */
1681 1.1 christos return FALSE;
1682 1.1 christos }
1683 1.1 christos
1684 1.1 christos crc_offset = debuglink_size - 4;
1685 1.1 christos memcpy (contents, filename, filelen);
1686 1.1 christos memset (contents + filelen, 0, crc_offset - filelen);
1687 1.1 christos
1688 1.1 christos bfd_put_32 (abfd, crc32, contents + crc_offset);
1689 1.1 christos
1690 1.1 christos if (! bfd_set_section_contents (abfd, sect, contents, 0, debuglink_size))
1691 1.1 christos {
1692 1.1 christos /* XXX Should we delete the section from the bfd ? */
1693 1.1 christos free (contents);
1694 1.1 christos return FALSE;
1695 1.1 christos }
1696 1.1 christos
1697 1.1 christos return TRUE;
1698 }
1699