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