1 /* Load module for 'compile' command.
3 Copyright (C) 2014-2015 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
21 #include "compile-object-load.h"
22 #include "compile-internal.h"
26 #include "readline/tilde.h"
32 #include "arch-utils.h"
34 /* Helper data for setup_sections. */
36 struct setup_sections_data
38 /* Size of all recent sections with matching LAST_PROT. */
41 /* First section matching LAST_PROT. */
42 asection
*last_section_first
;
44 /* Memory protection like the prot parameter of gdbarch_infcall_mmap. */
47 /* Maximum of alignments of all sections matching LAST_PROT.
48 This value is always at least 1. This value is always a power of 2. */
49 CORE_ADDR last_max_alignment
;
52 /* Place all ABFD sections next to each other obeying all constraints. */
55 setup_sections (bfd
*abfd
, asection
*sect
, void *data_voidp
)
57 struct setup_sections_data
*data
= data_voidp
;
63 /* It is required by later bfd_get_relocated_section_contents. */
64 if (sect
->output_section
== NULL
)
65 sect
->output_section
= sect
;
67 if ((bfd_get_section_flags (abfd
, sect
) & SEC_ALLOC
) == 0)
70 /* Make the memory always readable. */
71 prot
= GDB_MMAP_PROT_READ
;
72 if ((bfd_get_section_flags (abfd
, sect
) & SEC_READONLY
) == 0)
73 prot
|= GDB_MMAP_PROT_WRITE
;
74 if ((bfd_get_section_flags (abfd
, sect
) & SEC_CODE
) != 0)
75 prot
|= GDB_MMAP_PROT_EXEC
;
78 fprintf_unfiltered (gdb_stdout
,
79 "module \"%s\" section \"%s\" size %s prot %u\n",
80 bfd_get_filename (abfd
),
81 bfd_get_section_name (abfd
, sect
),
82 paddress (target_gdbarch (),
83 bfd_get_section_size (sect
)),
90 || (data
->last_prot
!= prot
&& bfd_get_section_size (sect
) != 0))
95 if (data
->last_size
!= 0)
97 addr
= gdbarch_infcall_mmap (target_gdbarch (), data
->last_size
,
100 fprintf_unfiltered (gdb_stdout
,
101 "allocated %s bytes at %s prot %u\n",
102 paddress (target_gdbarch (), data
->last_size
),
103 paddress (target_gdbarch (), addr
),
109 if ((addr
& (data
->last_max_alignment
- 1)) != 0)
110 error (_("Inferior compiled module address %s "
111 "is not aligned to BFD required %s."),
112 paddress (target_gdbarch (), addr
),
113 paddress (target_gdbarch (), data
->last_max_alignment
));
115 for (sect_iter
= data
->last_section_first
; sect_iter
!= sect
;
116 sect_iter
= sect_iter
->next
)
117 if ((bfd_get_section_flags (abfd
, sect_iter
) & SEC_ALLOC
) != 0)
118 bfd_set_section_vma (abfd
, sect_iter
,
119 addr
+ bfd_get_section_vma (abfd
, sect_iter
));
122 data
->last_section_first
= sect
;
123 data
->last_prot
= prot
;
124 data
->last_max_alignment
= 1;
130 alignment
= ((CORE_ADDR
) 1) << bfd_get_section_alignment (abfd
, sect
);
131 data
->last_max_alignment
= max (data
->last_max_alignment
, alignment
);
133 data
->last_size
= (data
->last_size
+ alignment
- 1) & -alignment
;
135 bfd_set_section_vma (abfd
, sect
, data
->last_size
);
137 data
->last_size
+= bfd_get_section_size (sect
);
138 data
->last_size
= (data
->last_size
+ alignment
- 1) & -alignment
;
141 /* Helper for link_callbacks callbacks vector. */
144 link_callbacks_multiple_definition (struct bfd_link_info
*link_info
,
145 struct bfd_link_hash_entry
*h
, bfd
*nbfd
,
146 asection
*nsec
, bfd_vma nval
)
148 bfd
*abfd
= link_info
->input_bfds
;
150 if (link_info
->allow_multiple_definition
)
152 warning (_("Compiled module \"%s\": multiple symbol definitions: %s"),
153 bfd_get_filename (abfd
), h
->root
.string
);
157 /* Helper for link_callbacks callbacks vector. */
160 link_callbacks_warning (struct bfd_link_info
*link_info
, const char *xwarning
,
161 const char *symbol
, bfd
*abfd
, asection
*section
,
164 warning (_("Compiled module \"%s\" section \"%s\": warning: %s"),
165 bfd_get_filename (abfd
), bfd_get_section_name (abfd
, section
),
167 /* Maybe permit running as a module? */
171 /* Helper for link_callbacks callbacks vector. */
174 link_callbacks_undefined_symbol (struct bfd_link_info
*link_info
,
175 const char *name
, bfd
*abfd
, asection
*section
,
176 bfd_vma address
, bfd_boolean is_fatal
)
178 warning (_("Cannot resolve relocation to \"%s\" "
179 "from compiled module \"%s\" section \"%s\"."),
180 name
, bfd_get_filename (abfd
), bfd_get_section_name (abfd
, section
));
184 /* Helper for link_callbacks callbacks vector. */
187 link_callbacks_reloc_overflow (struct bfd_link_info
*link_info
,
188 struct bfd_link_hash_entry
*entry
,
189 const char *name
, const char *reloc_name
,
190 bfd_vma addend
, bfd
*abfd
, asection
*section
,
193 /* TRUE is required for intra-module relocations. */
197 /* Helper for link_callbacks callbacks vector. */
200 link_callbacks_reloc_dangerous (struct bfd_link_info
*link_info
,
201 const char *message
, bfd
*abfd
,
202 asection
*section
, bfd_vma address
)
204 warning (_("Compiled module \"%s\" section \"%s\": dangerous "
206 bfd_get_filename (abfd
), bfd_get_section_name (abfd
, section
),
211 /* Helper for link_callbacks callbacks vector. */
214 link_callbacks_unattached_reloc (struct bfd_link_info
*link_info
,
215 const char *name
, bfd
*abfd
, asection
*section
,
218 warning (_("Compiled module \"%s\" section \"%s\": unattached "
220 bfd_get_filename (abfd
), bfd_get_section_name (abfd
, section
),
225 /* Helper for link_callbacks callbacks vector. */
227 static void link_callbacks_einfo (const char *fmt
, ...)
228 ATTRIBUTE_PRINTF (1, 2);
231 link_callbacks_einfo (const char *fmt
, ...)
233 struct cleanup
*cleanups
;
238 str
= xstrvprintf (fmt
, ap
);
240 cleanups
= make_cleanup (xfree
, str
);
242 warning (_("Compile module: warning: %s"), str
);
244 do_cleanups (cleanups
);
247 /* Helper for bfd_get_relocated_section_contents.
248 Only these symbols are set by bfd_simple_get_relocated_section_contents
249 but bfd/ seems to use even the NULL ones without checking them first. */
251 static const struct bfd_link_callbacks link_callbacks
=
253 NULL
, /* add_archive_element */
254 link_callbacks_multiple_definition
, /* multiple_definition */
255 NULL
, /* multiple_common */
256 NULL
, /* add_to_set */
257 NULL
, /* constructor */
258 link_callbacks_warning
, /* warning */
259 link_callbacks_undefined_symbol
, /* undefined_symbol */
260 link_callbacks_reloc_overflow
, /* reloc_overflow */
261 link_callbacks_reloc_dangerous
, /* reloc_dangerous */
262 link_callbacks_unattached_reloc
, /* unattached_reloc */
264 link_callbacks_einfo
, /* einfo */
267 NULL
, /* override_segment_assignment */
270 struct link_hash_table_cleanup_data
276 /* Cleanup callback for struct bfd_link_info. */
279 link_hash_table_free (void *d
)
281 struct link_hash_table_cleanup_data
*data
= d
;
283 if (data
->abfd
->is_linker_output
)
284 (*data
->abfd
->link
.hash
->hash_table_free
) (data
->abfd
);
285 data
->abfd
->link
.next
= data
->link_next
;
288 /* Relocate and store into inferior memory each section SECT of ABFD. */
291 copy_sections (bfd
*abfd
, asection
*sect
, void *data
)
293 asymbol
**symbol_table
= data
;
294 bfd_byte
*sect_data
, *sect_data_got
;
295 struct cleanup
*cleanups
;
296 struct bfd_link_info link_info
;
297 struct bfd_link_order link_order
;
298 CORE_ADDR inferior_addr
;
299 struct link_hash_table_cleanup_data cleanup_data
;
301 if ((bfd_get_section_flags (abfd
, sect
) & (SEC_ALLOC
| SEC_LOAD
))
302 != (SEC_ALLOC
| SEC_LOAD
))
305 if (bfd_get_section_size (sect
) == 0)
308 /* Mostly a copy of bfd_simple_get_relocated_section_contents which GDB
309 cannot use as it does not report relocations to undefined symbols. */
310 memset (&link_info
, 0, sizeof (link_info
));
311 link_info
.output_bfd
= abfd
;
312 link_info
.input_bfds
= abfd
;
313 link_info
.input_bfds_tail
= &abfd
->link
.next
;
315 cleanup_data
.abfd
= abfd
;
316 cleanup_data
.link_next
= abfd
->link
.next
;
318 abfd
->link
.next
= NULL
;
319 link_info
.hash
= bfd_link_hash_table_create (abfd
);
321 cleanups
= make_cleanup (link_hash_table_free
, &cleanup_data
);
322 link_info
.callbacks
= &link_callbacks
;
324 memset (&link_order
, 0, sizeof (link_order
));
325 link_order
.next
= NULL
;
326 link_order
.type
= bfd_indirect_link_order
;
327 link_order
.offset
= 0;
328 link_order
.size
= bfd_get_section_size (sect
);
329 link_order
.u
.indirect
.section
= sect
;
331 sect_data
= xmalloc (bfd_get_section_size (sect
));
332 make_cleanup (xfree
, sect_data
);
334 sect_data_got
= bfd_get_relocated_section_contents (abfd
, &link_info
,
335 &link_order
, sect_data
,
336 FALSE
, symbol_table
);
338 if (sect_data_got
== NULL
)
339 error (_("Cannot map compiled module \"%s\" section \"%s\": %s"),
340 bfd_get_filename (abfd
), bfd_get_section_name (abfd
, sect
),
341 bfd_errmsg (bfd_get_error ()));
342 gdb_assert (sect_data_got
== sect_data
);
344 inferior_addr
= bfd_get_section_vma (abfd
, sect
);
345 if (0 != target_write_memory (inferior_addr
, sect_data
,
346 bfd_get_section_size (sect
)))
347 error (_("Cannot write compiled module \"%s\" section \"%s\" "
348 "to inferior memory range %s-%s."),
349 bfd_get_filename (abfd
), bfd_get_section_name (abfd
, sect
),
350 paddress (target_gdbarch (), inferior_addr
),
351 paddress (target_gdbarch (),
352 inferior_addr
+ bfd_get_section_size (sect
)));
354 do_cleanups (cleanups
);
357 /* Fetch the type of first parameter of FUNC_SYM.
358 Return NULL if FUNC_SYM has no parameters. Throw an error otherwise. */
361 get_regs_type (struct symbol
*func_sym
, struct objfile
*objfile
)
363 struct type
*func_type
= SYMBOL_TYPE (func_sym
);
364 struct type
*regsp_type
, *regs_type
;
366 /* No register parameter present. */
367 if (TYPE_NFIELDS (func_type
) == 0)
370 regsp_type
= check_typedef (TYPE_FIELD_TYPE (func_type
, 0));
371 if (TYPE_CODE (regsp_type
) != TYPE_CODE_PTR
)
372 error (_("Invalid type code %d of first parameter of function \"%s\" "
373 "in compiled module \"%s\"."),
374 TYPE_CODE (regsp_type
), GCC_FE_WRAPPER_FUNCTION
,
375 objfile_name (objfile
));
377 regs_type
= check_typedef (TYPE_TARGET_TYPE (regsp_type
));
378 if (TYPE_CODE (regs_type
) != TYPE_CODE_STRUCT
)
379 error (_("Invalid type code %d of dereferenced first parameter "
380 "of function \"%s\" in compiled module \"%s\"."),
381 TYPE_CODE (regs_type
), GCC_FE_WRAPPER_FUNCTION
,
382 objfile_name (objfile
));
387 /* Store all inferior registers required by REGS_TYPE to inferior memory
388 starting at inferior address REGS_BASE. */
391 store_regs (struct type
*regs_type
, CORE_ADDR regs_base
)
393 struct gdbarch
*gdbarch
= target_gdbarch ();
394 struct regcache
*regcache
= get_thread_regcache (inferior_ptid
);
397 for (fieldno
= 0; fieldno
< TYPE_NFIELDS (regs_type
); fieldno
++)
399 const char *reg_name
= TYPE_FIELD_NAME (regs_type
, fieldno
);
400 ULONGEST reg_bitpos
= TYPE_FIELD_BITPOS (regs_type
, fieldno
);
401 ULONGEST reg_bitsize
= TYPE_FIELD_BITSIZE (regs_type
, fieldno
);
403 struct type
*reg_type
= check_typedef (TYPE_FIELD_TYPE (regs_type
,
405 ULONGEST reg_size
= TYPE_LENGTH (reg_type
);
407 struct value
*regval
;
408 CORE_ADDR inferior_addr
;
410 if (strcmp (reg_name
, COMPILE_I_SIMPLE_REGISTER_DUMMY
) == 0)
413 if ((reg_bitpos
% 8) != 0 || reg_bitsize
!= 0)
414 error (_("Invalid register \"%s\" position %s bits or size %s bits"),
415 reg_name
, pulongest (reg_bitpos
), pulongest (reg_bitsize
));
416 reg_offset
= reg_bitpos
/ 8;
418 if (TYPE_CODE (reg_type
) != TYPE_CODE_INT
419 && TYPE_CODE (reg_type
) != TYPE_CODE_PTR
)
420 error (_("Invalid register \"%s\" type code %d"), reg_name
,
421 TYPE_CODE (reg_type
));
423 regnum
= compile_register_name_demangle (gdbarch
, reg_name
);
425 regval
= value_from_register (reg_type
, regnum
, get_current_frame ());
426 if (value_optimized_out (regval
))
427 error (_("Register \"%s\" is optimized out."), reg_name
);
428 if (!value_entirely_available (regval
))
429 error (_("Register \"%s\" is not available."), reg_name
);
431 inferior_addr
= regs_base
+ reg_offset
;
432 if (0 != target_write_memory (inferior_addr
, value_contents (regval
),
434 error (_("Cannot write register \"%s\" to inferior memory at %s."),
435 reg_name
, paddress (gdbarch
, inferior_addr
));
439 /* Load OBJECT_FILE into inferior memory. Throw an error otherwise.
440 Caller must fully dispose the return value by calling compile_object_run.
441 SOURCE_FILE's copy is stored into the returned object.
442 Caller should free both OBJECT_FILE and SOURCE_FILE immediatelly after this
445 struct compile_module
*
446 compile_object_load (const char *object_file
, const char *source_file
,
447 enum compile_i_scope_types scope
, void *scope_data
)
449 struct cleanup
*cleanups
, *cleanups_free_objfile
;
451 struct setup_sections_data setup_sections_data
;
452 CORE_ADDR addr
, regs_addr
;
453 struct symbol
*func_sym
;
454 struct type
*func_type
;
455 struct bound_minimal_symbol bmsym
;
457 asymbol
**symbol_table
, **symp
;
458 long number_of_symbols
, missing_symbols
;
459 struct type
*dptr_type
= builtin_type (target_gdbarch ())->builtin_data_ptr
;
460 unsigned dptr_type_len
= TYPE_LENGTH (dptr_type
);
461 struct compile_module
*retval
;
462 struct type
*regs_type
;
463 char *filename
, **matching
;
464 struct objfile
*objfile
;
465 int expect_parameters
;
466 struct type
*expect_return_type
;
468 filename
= tilde_expand (object_file
);
469 cleanups
= make_cleanup (xfree
, filename
);
471 abfd
= gdb_bfd_open (filename
, gnutarget
, -1);
473 error (_("\"%s\": could not open as compiled module: %s"),
474 filename
, bfd_errmsg (bfd_get_error ()));
475 make_cleanup_bfd_unref (abfd
);
477 if (!bfd_check_format_matches (abfd
, bfd_object
, &matching
))
478 error (_("\"%s\": not in loadable format: %s"),
479 filename
, gdb_bfd_errmsg (bfd_get_error (), matching
));
481 if ((bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
)) != 0)
482 error (_("\"%s\": not in object format."), filename
);
484 setup_sections_data
.last_size
= 0;
485 setup_sections_data
.last_section_first
= abfd
->sections
;
486 setup_sections_data
.last_prot
= -1;
487 setup_sections_data
.last_max_alignment
= 1;
488 bfd_map_over_sections (abfd
, setup_sections
, &setup_sections_data
);
489 setup_sections (abfd
, NULL
, &setup_sections_data
);
491 storage_needed
= bfd_get_symtab_upper_bound (abfd
);
492 if (storage_needed
< 0)
493 error (_("Cannot read symbols of compiled module \"%s\": %s"),
494 filename
, bfd_errmsg (bfd_get_error ()));
496 /* SYMFILE_VERBOSE is not passed even if FROM_TTY, user is not interested in
497 "Reading symbols from ..." message for automatically generated file. */
498 objfile
= symbol_file_add_from_bfd (abfd
, filename
, 0, NULL
, 0, NULL
);
499 cleanups_free_objfile
= make_cleanup_free_objfile (objfile
);
501 func_sym
= lookup_global_symbol_from_objfile (objfile
,
502 GCC_FE_WRAPPER_FUNCTION
,
504 if (func_sym
== NULL
)
505 error (_("Cannot find function \"%s\" in compiled module \"%s\"."),
506 GCC_FE_WRAPPER_FUNCTION
, objfile_name (objfile
));
507 func_type
= SYMBOL_TYPE (func_sym
);
508 if (TYPE_CODE (func_type
) != TYPE_CODE_FUNC
)
509 error (_("Invalid type code %d of function \"%s\" in compiled "
511 TYPE_CODE (func_type
), GCC_FE_WRAPPER_FUNCTION
,
512 objfile_name (objfile
));
516 case COMPILE_I_SIMPLE_SCOPE
:
517 expect_parameters
= 1;
518 expect_return_type
= builtin_type (target_gdbarch ())->builtin_void
;
520 case COMPILE_I_RAW_SCOPE
:
521 expect_parameters
= 0;
522 expect_return_type
= builtin_type (target_gdbarch ())->builtin_void
;
525 internal_error (__FILE__
, __LINE__
, _("invalid scope %d"), scope
);
527 if (TYPE_NFIELDS (func_type
) != expect_parameters
)
528 error (_("Invalid %d parameters of function \"%s\" in compiled "
530 TYPE_NFIELDS (func_type
), GCC_FE_WRAPPER_FUNCTION
,
531 objfile_name (objfile
));
532 if (!types_deeply_equal (expect_return_type
, TYPE_TARGET_TYPE (func_type
)))
533 error (_("Invalid return type of function \"%s\" in compiled "
535 GCC_FE_WRAPPER_FUNCTION
, objfile_name (objfile
));
537 /* The memory may be later needed
538 by bfd_generic_get_relocated_section_contents
539 called from default_symfile_relocate. */
540 symbol_table
= obstack_alloc (&objfile
->objfile_obstack
, storage_needed
);
541 number_of_symbols
= bfd_canonicalize_symtab (abfd
, symbol_table
);
542 if (number_of_symbols
< 0)
543 error (_("Cannot parse symbols of compiled module \"%s\": %s"),
544 filename
, bfd_errmsg (bfd_get_error ()));
547 for (symp
= symbol_table
; symp
< symbol_table
+ number_of_symbols
; symp
++)
549 asymbol
*sym
= *symp
;
554 fprintf_unfiltered (gdb_stdout
,
555 "lookup undefined ELF symbol \"%s\"\n",
557 sym
->flags
= BSF_GLOBAL
;
558 sym
->section
= bfd_abs_section_ptr
;
559 if (strcmp (sym
->name
, "_GLOBAL_OFFSET_TABLE_") == 0)
564 bmsym
= lookup_minimal_symbol (sym
->name
, NULL
, NULL
);
565 switch (bmsym
.minsym
== NULL
566 ? mst_unknown
: MSYMBOL_TYPE (bmsym
.minsym
))
569 sym
->value
= BMSYMBOL_VALUE_ADDRESS (bmsym
);
571 case mst_text_gnu_ifunc
:
572 sym
->value
= gnu_ifunc_resolve_addr (target_gdbarch (),
573 BMSYMBOL_VALUE_ADDRESS (bmsym
));
576 warning (_("Could not find symbol \"%s\" "
577 "for compiled module \"%s\"."),
578 sym
->name
, filename
);
583 error (_("%ld symbols were missing, cannot continue."), missing_symbols
);
585 bfd_map_over_sections (abfd
, copy_sections
, symbol_table
);
587 regs_type
= get_regs_type (func_sym
, objfile
);
588 if (regs_type
== NULL
)
592 /* Use read-only non-executable memory protection. */
593 regs_addr
= gdbarch_infcall_mmap (target_gdbarch (),
594 TYPE_LENGTH (regs_type
),
596 gdb_assert (regs_addr
!= 0);
598 fprintf_unfiltered (gdb_stdout
,
599 "allocated %s bytes at %s for registers\n",
600 paddress (target_gdbarch (),
601 TYPE_LENGTH (regs_type
)),
602 paddress (target_gdbarch (), regs_addr
));
603 store_regs (regs_type
, regs_addr
);
606 discard_cleanups (cleanups_free_objfile
);
607 do_cleanups (cleanups
);
609 retval
= xmalloc (sizeof (*retval
));
610 retval
->objfile
= objfile
;
611 retval
->source_file
= xstrdup (source_file
);
612 retval
->func_sym
= func_sym
;
613 retval
->regs_addr
= regs_addr
;
614 retval
->scope
= scope
;
615 retval
->scope_data
= scope_data
;