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