1 /* Load module for 'compile' command. 2 3 Copyright (C) 2014-2017 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20 #include "defs.h" 21 #include "compile-object-load.h" 22 #include "compile-internal.h" 23 #include "command.h" 24 #include "objfiles.h" 25 #include "gdbcore.h" 26 #include "readline/tilde.h" 27 #include "bfdlink.h" 28 #include "gdbcmd.h" 29 #include "regcache.h" 30 #include "inferior.h" 31 #include "compile.h" 32 #include "block.h" 33 #include "arch-utils.h" 34 #include <algorithm> 35 36 /* Track inferior memory reserved by inferior mmap. */ 37 38 struct munmap_list 39 { 40 struct munmap_list *next; 41 CORE_ADDR addr, size; 42 }; 43 44 /* Add inferior mmap memory range ADDR..ADDR+SIZE (exclusive) to list 45 HEADP. *HEADP needs to be initialized to NULL. */ 46 47 static void 48 munmap_list_add (struct munmap_list **headp, CORE_ADDR addr, CORE_ADDR size) 49 { 50 struct munmap_list *head_new = XNEW (struct munmap_list); 51 52 head_new->next = *headp; 53 *headp = head_new; 54 head_new->addr = addr; 55 head_new->size = size; 56 } 57 58 /* Free list of inferior mmap memory ranges HEAD. HEAD is the first 59 element of the list, it can be NULL. After calling this function 60 HEAD pointer is invalid and the possible list needs to be 61 reinitialized by caller to NULL. */ 62 63 void 64 munmap_list_free (struct munmap_list *head) 65 { 66 while (head) 67 { 68 struct munmap_list *todo = head; 69 70 head = todo->next; 71 gdbarch_infcall_munmap (target_gdbarch (), todo->addr, todo->size); 72 xfree (todo); 73 } 74 } 75 76 /* Stub for munmap_list_free suitable for make_cleanup. Contrary to 77 munmap_list_free this function's parameter is a pointer to the first 78 list element pointer. */ 79 80 static void 81 munmap_listp_free_cleanup (void *headp_voidp) 82 { 83 struct munmap_list **headp = (struct munmap_list **) headp_voidp; 84 85 munmap_list_free (*headp); 86 } 87 88 /* Helper data for setup_sections. */ 89 90 struct setup_sections_data 91 { 92 /* Size of all recent sections with matching LAST_PROT. */ 93 CORE_ADDR last_size; 94 95 /* First section matching LAST_PROT. */ 96 asection *last_section_first; 97 98 /* Memory protection like the prot parameter of gdbarch_infcall_mmap. */ 99 unsigned last_prot; 100 101 /* Maximum of alignments of all sections matching LAST_PROT. 102 This value is always at least 1. This value is always a power of 2. */ 103 CORE_ADDR last_max_alignment; 104 105 /* List of inferior mmap ranges where setup_sections should add its 106 next range. */ 107 struct munmap_list **munmap_list_headp; 108 }; 109 110 /* Place all ABFD sections next to each other obeying all constraints. */ 111 112 static void 113 setup_sections (bfd *abfd, asection *sect, void *data_voidp) 114 { 115 struct setup_sections_data *data = (struct setup_sections_data *) data_voidp; 116 CORE_ADDR alignment; 117 unsigned prot; 118 119 if (sect != NULL) 120 { 121 /* It is required by later bfd_get_relocated_section_contents. */ 122 if (sect->output_section == NULL) 123 sect->output_section = sect; 124 125 if ((bfd_get_section_flags (abfd, sect) & SEC_ALLOC) == 0) 126 return; 127 128 /* Make the memory always readable. */ 129 prot = GDB_MMAP_PROT_READ; 130 if ((bfd_get_section_flags (abfd, sect) & SEC_READONLY) == 0) 131 prot |= GDB_MMAP_PROT_WRITE; 132 if ((bfd_get_section_flags (abfd, sect) & SEC_CODE) != 0) 133 prot |= GDB_MMAP_PROT_EXEC; 134 135 if (compile_debug) 136 fprintf_unfiltered (gdb_stdlog, 137 "module \"%s\" section \"%s\" size %s prot %u\n", 138 bfd_get_filename (abfd), 139 bfd_get_section_name (abfd, sect), 140 paddress (target_gdbarch (), 141 bfd_get_section_size (sect)), 142 prot); 143 } 144 else 145 prot = -1; 146 147 if (sect == NULL 148 || (data->last_prot != prot && bfd_get_section_size (sect) != 0)) 149 { 150 CORE_ADDR addr; 151 asection *sect_iter; 152 153 if (data->last_size != 0) 154 { 155 addr = gdbarch_infcall_mmap (target_gdbarch (), data->last_size, 156 data->last_prot); 157 munmap_list_add (data->munmap_list_headp, addr, data->last_size); 158 if (compile_debug) 159 fprintf_unfiltered (gdb_stdlog, 160 "allocated %s bytes at %s prot %u\n", 161 paddress (target_gdbarch (), data->last_size), 162 paddress (target_gdbarch (), addr), 163 data->last_prot); 164 } 165 else 166 addr = 0; 167 168 if ((addr & (data->last_max_alignment - 1)) != 0) 169 error (_("Inferior compiled module address %s " 170 "is not aligned to BFD required %s."), 171 paddress (target_gdbarch (), addr), 172 paddress (target_gdbarch (), data->last_max_alignment)); 173 174 for (sect_iter = data->last_section_first; sect_iter != sect; 175 sect_iter = sect_iter->next) 176 if ((bfd_get_section_flags (abfd, sect_iter) & SEC_ALLOC) != 0) 177 bfd_set_section_vma (abfd, sect_iter, 178 addr + bfd_get_section_vma (abfd, sect_iter)); 179 180 data->last_size = 0; 181 data->last_section_first = sect; 182 data->last_prot = prot; 183 data->last_max_alignment = 1; 184 } 185 186 if (sect == NULL) 187 return; 188 189 alignment = ((CORE_ADDR) 1) << bfd_get_section_alignment (abfd, sect); 190 data->last_max_alignment = std::max (data->last_max_alignment, alignment); 191 192 data->last_size = (data->last_size + alignment - 1) & -alignment; 193 194 bfd_set_section_vma (abfd, sect, data->last_size); 195 196 data->last_size += bfd_get_section_size (sect); 197 data->last_size = (data->last_size + alignment - 1) & -alignment; 198 } 199 200 /* Helper for link_callbacks callbacks vector. */ 201 202 static void 203 link_callbacks_multiple_definition (struct bfd_link_info *link_info, 204 struct bfd_link_hash_entry *h, bfd *nbfd, 205 asection *nsec, bfd_vma nval) 206 { 207 bfd *abfd = link_info->input_bfds; 208 209 if (link_info->allow_multiple_definition) 210 return; 211 warning (_("Compiled module \"%s\": multiple symbol definitions: %s"), 212 bfd_get_filename (abfd), h->root.string); 213 } 214 215 /* Helper for link_callbacks callbacks vector. */ 216 217 static void 218 link_callbacks_warning (struct bfd_link_info *link_info, const char *xwarning, 219 const char *symbol, bfd *abfd, asection *section, 220 bfd_vma address) 221 { 222 warning (_("Compiled module \"%s\" section \"%s\": warning: %s"), 223 bfd_get_filename (abfd), bfd_get_section_name (abfd, section), 224 xwarning); 225 } 226 227 /* Helper for link_callbacks callbacks vector. */ 228 229 static void 230 link_callbacks_undefined_symbol (struct bfd_link_info *link_info, 231 const char *name, bfd *abfd, asection *section, 232 bfd_vma address, bfd_boolean is_fatal) 233 { 234 warning (_("Cannot resolve relocation to \"%s\" " 235 "from compiled module \"%s\" section \"%s\"."), 236 name, bfd_get_filename (abfd), bfd_get_section_name (abfd, section)); 237 } 238 239 /* Helper for link_callbacks callbacks vector. */ 240 241 static void 242 link_callbacks_reloc_overflow (struct bfd_link_info *link_info, 243 struct bfd_link_hash_entry *entry, 244 const char *name, const char *reloc_name, 245 bfd_vma addend, bfd *abfd, asection *section, 246 bfd_vma address) 247 { 248 } 249 250 /* Helper for link_callbacks callbacks vector. */ 251 252 static void 253 link_callbacks_reloc_dangerous (struct bfd_link_info *link_info, 254 const char *message, bfd *abfd, 255 asection *section, bfd_vma address) 256 { 257 warning (_("Compiled module \"%s\" section \"%s\": dangerous " 258 "relocation: %s\n"), 259 bfd_get_filename (abfd), bfd_get_section_name (abfd, section), 260 message); 261 } 262 263 /* Helper for link_callbacks callbacks vector. */ 264 265 static void 266 link_callbacks_unattached_reloc (struct bfd_link_info *link_info, 267 const char *name, bfd *abfd, asection *section, 268 bfd_vma address) 269 { 270 warning (_("Compiled module \"%s\" section \"%s\": unattached " 271 "relocation: %s\n"), 272 bfd_get_filename (abfd), bfd_get_section_name (abfd, section), 273 name); 274 } 275 276 /* Helper for link_callbacks callbacks vector. */ 277 278 static void link_callbacks_einfo (const char *fmt, ...) 279 ATTRIBUTE_PRINTF (1, 2); 280 281 static void 282 link_callbacks_einfo (const char *fmt, ...) 283 { 284 struct cleanup *cleanups; 285 va_list ap; 286 char *str; 287 288 va_start (ap, fmt); 289 str = xstrvprintf (fmt, ap); 290 va_end (ap); 291 cleanups = make_cleanup (xfree, str); 292 293 warning (_("Compile module: warning: %s"), str); 294 295 do_cleanups (cleanups); 296 } 297 298 /* Helper for bfd_get_relocated_section_contents. 299 Only these symbols are set by bfd_simple_get_relocated_section_contents 300 but bfd/ seems to use even the NULL ones without checking them first. */ 301 302 static const struct bfd_link_callbacks link_callbacks = 303 { 304 NULL, /* add_archive_element */ 305 link_callbacks_multiple_definition, /* multiple_definition */ 306 NULL, /* multiple_common */ 307 NULL, /* add_to_set */ 308 NULL, /* constructor */ 309 link_callbacks_warning, /* warning */ 310 link_callbacks_undefined_symbol, /* undefined_symbol */ 311 link_callbacks_reloc_overflow, /* reloc_overflow */ 312 link_callbacks_reloc_dangerous, /* reloc_dangerous */ 313 link_callbacks_unattached_reloc, /* unattached_reloc */ 314 NULL, /* notice */ 315 link_callbacks_einfo, /* einfo */ 316 NULL, /* info */ 317 NULL, /* minfo */ 318 NULL, /* override_segment_assignment */ 319 }; 320 321 struct link_hash_table_cleanup_data 322 { 323 bfd *abfd; 324 bfd *link_next; 325 }; 326 327 /* Cleanup callback for struct bfd_link_info. */ 328 329 static void 330 link_hash_table_free (void *d) 331 { 332 struct link_hash_table_cleanup_data *data 333 = (struct link_hash_table_cleanup_data *) d; 334 335 if (data->abfd->is_linker_output) 336 (*data->abfd->link.hash->hash_table_free) (data->abfd); 337 data->abfd->link.next = data->link_next; 338 } 339 340 /* Relocate and store into inferior memory each section SECT of ABFD. */ 341 342 static void 343 copy_sections (bfd *abfd, asection *sect, void *data) 344 { 345 asymbol **symbol_table = (asymbol **) data; 346 bfd_byte *sect_data, *sect_data_got; 347 struct cleanup *cleanups; 348 struct bfd_link_info link_info; 349 struct bfd_link_order link_order; 350 CORE_ADDR inferior_addr; 351 struct link_hash_table_cleanup_data cleanup_data; 352 353 if ((bfd_get_section_flags (abfd, sect) & (SEC_ALLOC | SEC_LOAD)) 354 != (SEC_ALLOC | SEC_LOAD)) 355 return; 356 357 if (bfd_get_section_size (sect) == 0) 358 return; 359 360 /* Mostly a copy of bfd_simple_get_relocated_section_contents which GDB 361 cannot use as it does not report relocations to undefined symbols. */ 362 memset (&link_info, 0, sizeof (link_info)); 363 link_info.output_bfd = abfd; 364 link_info.input_bfds = abfd; 365 link_info.input_bfds_tail = &abfd->link.next; 366 367 cleanup_data.abfd = abfd; 368 cleanup_data.link_next = abfd->link.next; 369 370 abfd->link.next = NULL; 371 link_info.hash = bfd_link_hash_table_create (abfd); 372 373 cleanups = make_cleanup (link_hash_table_free, &cleanup_data); 374 link_info.callbacks = &link_callbacks; 375 376 memset (&link_order, 0, sizeof (link_order)); 377 link_order.next = NULL; 378 link_order.type = bfd_indirect_link_order; 379 link_order.offset = 0; 380 link_order.size = bfd_get_section_size (sect); 381 link_order.u.indirect.section = sect; 382 383 sect_data = (bfd_byte *) xmalloc (bfd_get_section_size (sect)); 384 make_cleanup (xfree, sect_data); 385 386 sect_data_got = bfd_get_relocated_section_contents (abfd, &link_info, 387 &link_order, sect_data, 388 FALSE, symbol_table); 389 390 if (sect_data_got == NULL) 391 error (_("Cannot map compiled module \"%s\" section \"%s\": %s"), 392 bfd_get_filename (abfd), bfd_get_section_name (abfd, sect), 393 bfd_errmsg (bfd_get_error ())); 394 gdb_assert (sect_data_got == sect_data); 395 396 inferior_addr = bfd_get_section_vma (abfd, sect); 397 if (0 != target_write_memory (inferior_addr, sect_data, 398 bfd_get_section_size (sect))) 399 error (_("Cannot write compiled module \"%s\" section \"%s\" " 400 "to inferior memory range %s-%s."), 401 bfd_get_filename (abfd), bfd_get_section_name (abfd, sect), 402 paddress (target_gdbarch (), inferior_addr), 403 paddress (target_gdbarch (), 404 inferior_addr + bfd_get_section_size (sect))); 405 406 do_cleanups (cleanups); 407 } 408 409 /* Fetch the type of COMPILE_I_EXPR_PTR_TYPE and COMPILE_I_EXPR_VAL 410 symbols in OBJFILE so we can calculate how much memory to allocate 411 for the out parameter. This avoids needing a malloc in the generated 412 code. Throw an error if anything fails. 413 GDB first tries to compile the code with COMPILE_I_PRINT_ADDRESS_SCOPE. 414 If it finds user tries to print an array type this function returns 415 NULL. Caller will then regenerate the code with 416 COMPILE_I_PRINT_VALUE_SCOPE, recompiles it again and finally runs it. 417 This is because __auto_type array-to-pointer type conversion of 418 COMPILE_I_EXPR_VAL which gets detected by COMPILE_I_EXPR_PTR_TYPE 419 preserving the array type. */ 420 421 static struct type * 422 get_out_value_type (struct symbol *func_sym, struct objfile *objfile, 423 enum compile_i_scope_types scope) 424 { 425 struct symbol *gdb_ptr_type_sym; 426 /* Initialize it just to avoid a GCC false warning. */ 427 struct symbol *gdb_val_sym = NULL; 428 struct type *gdb_ptr_type, *gdb_type_from_ptr, *gdb_type, *retval; 429 /* Initialize it just to avoid a GCC false warning. */ 430 const struct block *block = NULL; 431 const struct blockvector *bv; 432 int nblocks = 0; 433 int block_loop = 0; 434 435 bv = SYMTAB_BLOCKVECTOR (func_sym->owner.symtab); 436 nblocks = BLOCKVECTOR_NBLOCKS (bv); 437 438 gdb_ptr_type_sym = NULL; 439 for (block_loop = 0; block_loop < nblocks; block_loop++) 440 { 441 struct symbol *function = NULL; 442 const struct block *function_block; 443 444 block = BLOCKVECTOR_BLOCK (bv, block_loop); 445 if (BLOCK_FUNCTION (block) != NULL) 446 continue; 447 gdb_val_sym = block_lookup_symbol (block, COMPILE_I_EXPR_VAL, VAR_DOMAIN); 448 if (gdb_val_sym == NULL) 449 continue; 450 451 function_block = block; 452 while (function_block != BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK) 453 && function_block != BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK)) 454 { 455 function_block = BLOCK_SUPERBLOCK (function_block); 456 function = BLOCK_FUNCTION (function_block); 457 if (function != NULL) 458 break; 459 } 460 if (function != NULL 461 && (BLOCK_SUPERBLOCK (function_block) 462 == BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)) 463 && (strcmp (SYMBOL_LINKAGE_NAME (function), GCC_FE_WRAPPER_FUNCTION) 464 == 0)) 465 break; 466 } 467 if (block_loop == nblocks) 468 error (_("No \"%s\" symbol found"), COMPILE_I_EXPR_PTR_TYPE); 469 470 gdb_type = SYMBOL_TYPE (gdb_val_sym); 471 gdb_type = check_typedef (gdb_type); 472 473 gdb_ptr_type_sym = block_lookup_symbol (block, COMPILE_I_EXPR_PTR_TYPE, 474 VAR_DOMAIN); 475 if (gdb_ptr_type_sym == NULL) 476 error (_("No \"%s\" symbol found"), COMPILE_I_EXPR_PTR_TYPE); 477 gdb_ptr_type = SYMBOL_TYPE (gdb_ptr_type_sym); 478 gdb_ptr_type = check_typedef (gdb_ptr_type); 479 if (TYPE_CODE (gdb_ptr_type) != TYPE_CODE_PTR) 480 error (_("Type of \"%s\" is not a pointer"), COMPILE_I_EXPR_PTR_TYPE); 481 gdb_type_from_ptr = TYPE_TARGET_TYPE (gdb_ptr_type); 482 483 if (types_deeply_equal (gdb_type, gdb_type_from_ptr)) 484 { 485 if (scope != COMPILE_I_PRINT_ADDRESS_SCOPE) 486 error (_("Expected address scope in compiled module \"%s\"."), 487 objfile_name (objfile)); 488 return gdb_type; 489 } 490 491 if (TYPE_CODE (gdb_type) != TYPE_CODE_PTR) 492 error (_("Invalid type code %d of symbol \"%s\" " 493 "in compiled module \"%s\"."), 494 TYPE_CODE (gdb_type_from_ptr), COMPILE_I_EXPR_VAL, 495 objfile_name (objfile)); 496 497 retval = gdb_type_from_ptr; 498 switch (TYPE_CODE (gdb_type_from_ptr)) 499 { 500 case TYPE_CODE_ARRAY: 501 gdb_type_from_ptr = TYPE_TARGET_TYPE (gdb_type_from_ptr); 502 break; 503 case TYPE_CODE_FUNC: 504 break; 505 default: 506 error (_("Invalid type code %d of symbol \"%s\" " 507 "in compiled module \"%s\"."), 508 TYPE_CODE (gdb_type_from_ptr), COMPILE_I_EXPR_PTR_TYPE, 509 objfile_name (objfile)); 510 } 511 if (!types_deeply_equal (gdb_type_from_ptr, 512 TYPE_TARGET_TYPE (gdb_type))) 513 error (_("Referenced types do not match for symbols \"%s\" and \"%s\" " 514 "in compiled module \"%s\"."), 515 COMPILE_I_EXPR_PTR_TYPE, COMPILE_I_EXPR_VAL, 516 objfile_name (objfile)); 517 if (scope == COMPILE_I_PRINT_ADDRESS_SCOPE) 518 return NULL; 519 return retval; 520 } 521 522 /* Fetch the type of first parameter of FUNC_SYM. 523 Return NULL if FUNC_SYM has no parameters. Throw an error otherwise. */ 524 525 static struct type * 526 get_regs_type (struct symbol *func_sym, struct objfile *objfile) 527 { 528 struct type *func_type = SYMBOL_TYPE (func_sym); 529 struct type *regsp_type, *regs_type; 530 531 /* No register parameter present. */ 532 if (TYPE_NFIELDS (func_type) == 0) 533 return NULL; 534 535 regsp_type = check_typedef (TYPE_FIELD_TYPE (func_type, 0)); 536 if (TYPE_CODE (regsp_type) != TYPE_CODE_PTR) 537 error (_("Invalid type code %d of first parameter of function \"%s\" " 538 "in compiled module \"%s\"."), 539 TYPE_CODE (regsp_type), GCC_FE_WRAPPER_FUNCTION, 540 objfile_name (objfile)); 541 542 regs_type = check_typedef (TYPE_TARGET_TYPE (regsp_type)); 543 if (TYPE_CODE (regs_type) != TYPE_CODE_STRUCT) 544 error (_("Invalid type code %d of dereferenced first parameter " 545 "of function \"%s\" in compiled module \"%s\"."), 546 TYPE_CODE (regs_type), GCC_FE_WRAPPER_FUNCTION, 547 objfile_name (objfile)); 548 549 return regs_type; 550 } 551 552 /* Store all inferior registers required by REGS_TYPE to inferior memory 553 starting at inferior address REGS_BASE. */ 554 555 static void 556 store_regs (struct type *regs_type, CORE_ADDR regs_base) 557 { 558 struct gdbarch *gdbarch = target_gdbarch (); 559 struct regcache *regcache = get_thread_regcache (inferior_ptid); 560 int fieldno; 561 562 for (fieldno = 0; fieldno < TYPE_NFIELDS (regs_type); fieldno++) 563 { 564 const char *reg_name = TYPE_FIELD_NAME (regs_type, fieldno); 565 ULONGEST reg_bitpos = TYPE_FIELD_BITPOS (regs_type, fieldno); 566 ULONGEST reg_bitsize = TYPE_FIELD_BITSIZE (regs_type, fieldno); 567 ULONGEST reg_offset; 568 struct type *reg_type = check_typedef (TYPE_FIELD_TYPE (regs_type, 569 fieldno)); 570 ULONGEST reg_size = TYPE_LENGTH (reg_type); 571 int regnum; 572 struct value *regval; 573 CORE_ADDR inferior_addr; 574 575 if (strcmp (reg_name, COMPILE_I_SIMPLE_REGISTER_DUMMY) == 0) 576 continue; 577 578 if ((reg_bitpos % 8) != 0 || reg_bitsize != 0) 579 error (_("Invalid register \"%s\" position %s bits or size %s bits"), 580 reg_name, pulongest (reg_bitpos), pulongest (reg_bitsize)); 581 reg_offset = reg_bitpos / 8; 582 583 if (TYPE_CODE (reg_type) != TYPE_CODE_INT 584 && TYPE_CODE (reg_type) != TYPE_CODE_PTR) 585 error (_("Invalid register \"%s\" type code %d"), reg_name, 586 TYPE_CODE (reg_type)); 587 588 regnum = compile_register_name_demangle (gdbarch, reg_name); 589 590 regval = value_from_register (reg_type, regnum, get_current_frame ()); 591 if (value_optimized_out (regval)) 592 error (_("Register \"%s\" is optimized out."), reg_name); 593 if (!value_entirely_available (regval)) 594 error (_("Register \"%s\" is not available."), reg_name); 595 596 inferior_addr = regs_base + reg_offset; 597 if (0 != target_write_memory (inferior_addr, value_contents (regval), 598 reg_size)) 599 error (_("Cannot write register \"%s\" to inferior memory at %s."), 600 reg_name, paddress (gdbarch, inferior_addr)); 601 } 602 } 603 604 /* Load the object file specified in FILE_NAMES into inferior memory. 605 Throw an error otherwise. Caller must fully dispose the return 606 value by calling compile_object_run. Returns NULL only for 607 COMPILE_I_PRINT_ADDRESS_SCOPE when COMPILE_I_PRINT_VALUE_SCOPE 608 should have been used instead. */ 609 610 struct compile_module * 611 compile_object_load (const compile_file_names &file_names, 612 enum compile_i_scope_types scope, void *scope_data) 613 { 614 struct cleanup *cleanups, *cleanups_free_objfile; 615 struct setup_sections_data setup_sections_data; 616 CORE_ADDR addr, regs_addr, out_value_addr = 0; 617 struct symbol *func_sym; 618 struct type *func_type; 619 struct bound_minimal_symbol bmsym; 620 long storage_needed; 621 asymbol **symbol_table, **symp; 622 long number_of_symbols, missing_symbols; 623 struct type *dptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr; 624 unsigned dptr_type_len = TYPE_LENGTH (dptr_type); 625 struct compile_module *retval; 626 struct type *regs_type, *out_value_type = NULL; 627 char *filename, **matching; 628 struct objfile *objfile; 629 int expect_parameters; 630 struct type *expect_return_type; 631 struct munmap_list *munmap_list_head = NULL; 632 633 filename = tilde_expand (file_names.object_file ()); 634 cleanups = make_cleanup (xfree, filename); 635 636 gdb_bfd_ref_ptr abfd (gdb_bfd_open (filename, gnutarget, -1)); 637 if (abfd == NULL) 638 error (_("\"%s\": could not open as compiled module: %s"), 639 filename, bfd_errmsg (bfd_get_error ())); 640 641 if (!bfd_check_format_matches (abfd.get (), bfd_object, &matching)) 642 error (_("\"%s\": not in loadable format: %s"), 643 filename, gdb_bfd_errmsg (bfd_get_error (), matching)); 644 645 if ((bfd_get_file_flags (abfd.get ()) & (EXEC_P | DYNAMIC)) != 0) 646 error (_("\"%s\": not in object format."), filename); 647 648 setup_sections_data.last_size = 0; 649 setup_sections_data.last_section_first = abfd->sections; 650 setup_sections_data.last_prot = -1; 651 setup_sections_data.last_max_alignment = 1; 652 setup_sections_data.munmap_list_headp = &munmap_list_head; 653 make_cleanup (munmap_listp_free_cleanup, &munmap_list_head); 654 bfd_map_over_sections (abfd.get (), setup_sections, &setup_sections_data); 655 setup_sections (abfd.get (), NULL, &setup_sections_data); 656 657 storage_needed = bfd_get_symtab_upper_bound (abfd.get ()); 658 if (storage_needed < 0) 659 error (_("Cannot read symbols of compiled module \"%s\": %s"), 660 filename, bfd_errmsg (bfd_get_error ())); 661 662 /* SYMFILE_VERBOSE is not passed even if FROM_TTY, user is not interested in 663 "Reading symbols from ..." message for automatically generated file. */ 664 objfile = symbol_file_add_from_bfd (abfd.get (), filename, 0, NULL, 0, NULL); 665 cleanups_free_objfile = make_cleanup_free_objfile (objfile); 666 667 func_sym = lookup_global_symbol_from_objfile (objfile, 668 GCC_FE_WRAPPER_FUNCTION, 669 VAR_DOMAIN).symbol; 670 if (func_sym == NULL) 671 error (_("Cannot find function \"%s\" in compiled module \"%s\"."), 672 GCC_FE_WRAPPER_FUNCTION, objfile_name (objfile)); 673 func_type = SYMBOL_TYPE (func_sym); 674 if (TYPE_CODE (func_type) != TYPE_CODE_FUNC) 675 error (_("Invalid type code %d of function \"%s\" in compiled " 676 "module \"%s\"."), 677 TYPE_CODE (func_type), GCC_FE_WRAPPER_FUNCTION, 678 objfile_name (objfile)); 679 680 switch (scope) 681 { 682 case COMPILE_I_SIMPLE_SCOPE: 683 expect_parameters = 1; 684 expect_return_type = builtin_type (target_gdbarch ())->builtin_void; 685 break; 686 case COMPILE_I_RAW_SCOPE: 687 expect_parameters = 0; 688 expect_return_type = builtin_type (target_gdbarch ())->builtin_void; 689 break; 690 case COMPILE_I_PRINT_ADDRESS_SCOPE: 691 case COMPILE_I_PRINT_VALUE_SCOPE: 692 expect_parameters = 2; 693 expect_return_type = builtin_type (target_gdbarch ())->builtin_void; 694 break; 695 default: 696 internal_error (__FILE__, __LINE__, _("invalid scope %d"), scope); 697 } 698 if (TYPE_NFIELDS (func_type) != expect_parameters) 699 error (_("Invalid %d parameters of function \"%s\" in compiled " 700 "module \"%s\"."), 701 TYPE_NFIELDS (func_type), GCC_FE_WRAPPER_FUNCTION, 702 objfile_name (objfile)); 703 if (!types_deeply_equal (expect_return_type, TYPE_TARGET_TYPE (func_type))) 704 error (_("Invalid return type of function \"%s\" in compiled " 705 "module \"%s\"."), 706 GCC_FE_WRAPPER_FUNCTION, objfile_name (objfile)); 707 708 /* The memory may be later needed 709 by bfd_generic_get_relocated_section_contents 710 called from default_symfile_relocate. */ 711 symbol_table = (asymbol **) obstack_alloc (&objfile->objfile_obstack, 712 storage_needed); 713 number_of_symbols = bfd_canonicalize_symtab (abfd.get (), symbol_table); 714 if (number_of_symbols < 0) 715 error (_("Cannot parse symbols of compiled module \"%s\": %s"), 716 filename, bfd_errmsg (bfd_get_error ())); 717 718 missing_symbols = 0; 719 for (symp = symbol_table; symp < symbol_table + number_of_symbols; symp++) 720 { 721 asymbol *sym = *symp; 722 723 if (sym->flags != 0) 724 continue; 725 sym->flags = BSF_GLOBAL; 726 sym->section = bfd_abs_section_ptr; 727 if (strcmp (sym->name, "_GLOBAL_OFFSET_TABLE_") == 0) 728 { 729 if (compile_debug) 730 fprintf_unfiltered (gdb_stdlog, 731 "ELF symbol \"%s\" relocated to zero\n", 732 sym->name); 733 734 /* It seems to be a GCC bug, with -mcmodel=large there should be no 735 need for _GLOBAL_OFFSET_TABLE_. Together with -fPIE the data 736 remain PC-relative even with _GLOBAL_OFFSET_TABLE_ as zero. */ 737 sym->value = 0; 738 continue; 739 } 740 bmsym = lookup_minimal_symbol (sym->name, NULL, NULL); 741 switch (bmsym.minsym == NULL 742 ? mst_unknown : MSYMBOL_TYPE (bmsym.minsym)) 743 { 744 case mst_text: 745 sym->value = BMSYMBOL_VALUE_ADDRESS (bmsym); 746 if (compile_debug) 747 fprintf_unfiltered (gdb_stdlog, 748 "ELF mst_text symbol \"%s\" relocated to %s\n", 749 sym->name, 750 paddress (target_gdbarch (), sym->value)); 751 break; 752 case mst_text_gnu_ifunc: 753 sym->value = gnu_ifunc_resolve_addr (target_gdbarch (), 754 BMSYMBOL_VALUE_ADDRESS (bmsym)); 755 if (compile_debug) 756 fprintf_unfiltered (gdb_stdlog, 757 "ELF mst_text_gnu_ifunc symbol \"%s\" " 758 "relocated to %s\n", 759 sym->name, 760 paddress (target_gdbarch (), sym->value)); 761 break; 762 default: 763 warning (_("Could not find symbol \"%s\" " 764 "for compiled module \"%s\"."), 765 sym->name, filename); 766 missing_symbols++; 767 } 768 } 769 if (missing_symbols) 770 error (_("%ld symbols were missing, cannot continue."), missing_symbols); 771 772 bfd_map_over_sections (abfd.get (), copy_sections, symbol_table); 773 774 regs_type = get_regs_type (func_sym, objfile); 775 if (regs_type == NULL) 776 regs_addr = 0; 777 else 778 { 779 /* Use read-only non-executable memory protection. */ 780 regs_addr = gdbarch_infcall_mmap (target_gdbarch (), 781 TYPE_LENGTH (regs_type), 782 GDB_MMAP_PROT_READ); 783 gdb_assert (regs_addr != 0); 784 munmap_list_add (&munmap_list_head, regs_addr, TYPE_LENGTH (regs_type)); 785 if (compile_debug) 786 fprintf_unfiltered (gdb_stdlog, 787 "allocated %s bytes at %s for registers\n", 788 paddress (target_gdbarch (), 789 TYPE_LENGTH (regs_type)), 790 paddress (target_gdbarch (), regs_addr)); 791 store_regs (regs_type, regs_addr); 792 } 793 794 if (scope == COMPILE_I_PRINT_ADDRESS_SCOPE 795 || scope == COMPILE_I_PRINT_VALUE_SCOPE) 796 { 797 out_value_type = get_out_value_type (func_sym, objfile, scope); 798 if (out_value_type == NULL) 799 { 800 do_cleanups (cleanups); 801 return NULL; 802 } 803 check_typedef (out_value_type); 804 out_value_addr = gdbarch_infcall_mmap (target_gdbarch (), 805 TYPE_LENGTH (out_value_type), 806 (GDB_MMAP_PROT_READ 807 | GDB_MMAP_PROT_WRITE)); 808 gdb_assert (out_value_addr != 0); 809 munmap_list_add (&munmap_list_head, out_value_addr, 810 TYPE_LENGTH (out_value_type)); 811 if (compile_debug) 812 fprintf_unfiltered (gdb_stdlog, 813 "allocated %s bytes at %s for printed value\n", 814 paddress (target_gdbarch (), 815 TYPE_LENGTH (out_value_type)), 816 paddress (target_gdbarch (), out_value_addr)); 817 } 818 819 discard_cleanups (cleanups_free_objfile); 820 821 retval = XNEW (struct compile_module); 822 retval->objfile = objfile; 823 retval->source_file = xstrdup (file_names.source_file ()); 824 retval->func_sym = func_sym; 825 retval->regs_addr = regs_addr; 826 retval->scope = scope; 827 retval->scope_data = scope_data; 828 retval->out_value_type = out_value_type; 829 retval->out_value_addr = out_value_addr; 830 831 /* CLEANUPS will free MUNMAP_LIST_HEAD. */ 832 retval->munmap_list_head = munmap_list_head; 833 munmap_list_head = NULL; 834 835 do_cleanups (cleanups); 836 837 return retval; 838 } 839