OLD | NEW |
1 /* Read ELF (Executable and Linking Format) object files for GDB. | 1 /* Read ELF (Executable and Linking Format) object files for GDB. |
2 | 2 |
3 Copyright (C) 1991-2012 Free Software Foundation, Inc. | 3 Copyright (C) 1991-2012 Free Software Foundation, Inc. |
4 | 4 |
5 Written by Fred Fish at Cygnus Support. | 5 Written by Fred Fish at Cygnus Support. |
6 | 6 |
7 This file is part of GDB. | 7 This file is part of GDB. |
8 | 8 |
9 This program is free software; you can redistribute it and/or modify | 9 This program is free software; you can redistribute it and/or modify |
10 it under the terms of the GNU General Public License as published by | 10 it under the terms of the GNU General Public License as published by |
(...skipping 18 matching lines...) Expand all Loading... |
29 #include "symtab.h" | 29 #include "symtab.h" |
30 #include "symfile.h" | 30 #include "symfile.h" |
31 #include "objfiles.h" | 31 #include "objfiles.h" |
32 #include "buildsym.h" | 32 #include "buildsym.h" |
33 #include "stabsread.h" | 33 #include "stabsread.h" |
34 #include "gdb-stabs.h" | 34 #include "gdb-stabs.h" |
35 #include "complaints.h" | 35 #include "complaints.h" |
36 #include "demangle.h" | 36 #include "demangle.h" |
37 #include "psympriv.h" | 37 #include "psympriv.h" |
38 #include "filenames.h" | 38 #include "filenames.h" |
| 39 #include "probe.h" |
| 40 #include "arch-utils.h" |
39 #include "gdbtypes.h" | 41 #include "gdbtypes.h" |
40 #include "value.h" | 42 #include "value.h" |
41 #include "infcall.h" | 43 #include "infcall.h" |
42 #include "gdbthread.h" | 44 #include "gdbthread.h" |
43 #include "regcache.h" | 45 #include "regcache.h" |
| 46 #include "bcache.h" |
44 | 47 |
45 extern void _initialize_elfread (void); | 48 extern void _initialize_elfread (void); |
46 | 49 |
47 /* Forward declarations. */ | 50 /* Forward declarations. */ |
48 static const struct sym_fns elf_sym_fns_gdb_index; | 51 static const struct sym_fns elf_sym_fns_gdb_index; |
49 static const struct sym_fns elf_sym_fns_lazy_psyms; | 52 static const struct sym_fns elf_sym_fns_lazy_psyms; |
50 | 53 |
51 /* The struct elfinfo is available only during ELF symbol table and | 54 /* The struct elfinfo is available only during ELF symbol table and |
52 psymtab reading. It is destroyed at the completion of psymtab-reading. | 55 psymtab reading. It is destroyed at the completion of psymtab-reading. |
53 It's local to elf_symfile_read. */ | 56 It's local to elf_symfile_read. */ |
54 | 57 |
55 struct elfinfo | 58 struct elfinfo |
56 { | 59 { |
57 asection *stabsect; /* Section pointer for .stab section */ | 60 asection *stabsect; /* Section pointer for .stab section */ |
58 asection *stabindexsect; /* Section pointer for .stab.index section */ | 61 asection *stabindexsect; /* Section pointer for .stab.index section */ |
59 asection *mdebugsect; /* Section pointer for .mdebug section */ | 62 asection *mdebugsect; /* Section pointer for .mdebug section */ |
60 }; | 63 }; |
61 | 64 |
| 65 /* Per-objfile data for probe info. */ |
| 66 |
| 67 static const struct objfile_data *probe_key = NULL; |
| 68 |
62 static void free_elfinfo (void *); | 69 static void free_elfinfo (void *); |
63 | 70 |
64 /* Minimal symbols located at the GOT entries for .plt - that is the real | 71 /* Minimal symbols located at the GOT entries for .plt - that is the real |
65 pointer where the given entry will jump to. It gets updated by the real | 72 pointer where the given entry will jump to. It gets updated by the real |
66 function address during lazy ld.so resolving in the inferior. These | 73 function address during lazy ld.so resolving in the inferior. These |
67 minimal symbols are indexed for <tab>-completion. */ | 74 minimal symbols are indexed for <tab>-completion. */ |
68 | 75 |
69 #define SYMBOL_GOT_PLT_SUFFIX "@got.plt" | 76 #define SYMBOL_GOT_PLT_SUFFIX "@got.plt" |
70 | 77 |
71 /* Locate the segments in ABFD. */ | 78 /* Locate the segments in ABFD. */ |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 If we haven't, we will not relocate this section by any | 141 If we haven't, we will not relocate this section by any |
135 offsets we apply to the segments. As an exception, do not | 142 offsets we apply to the segments. As an exception, do not |
136 warn about SHT_NOBITS sections; in normal ELF execution | 143 warn about SHT_NOBITS sections; in normal ELF execution |
137 environments, SHT_NOBITS means zero-initialized and belongs | 144 environments, SHT_NOBITS means zero-initialized and belongs |
138 in a segment, but in no-OS environments some tools (e.g. ARM | 145 in a segment, but in no-OS environments some tools (e.g. ARM |
139 RealView) use SHT_NOBITS for uninitialized data. Since it is | 146 RealView) use SHT_NOBITS for uninitialized data. Since it is |
140 uninitialized, it doesn't need a program header. Such | 147 uninitialized, it doesn't need a program header. Such |
141 binaries are not relocatable. */ | 148 binaries are not relocatable. */ |
142 if (bfd_get_section_size (sect) > 0 && j == num_segments | 149 if (bfd_get_section_size (sect) > 0 && j == num_segments |
143 && (bfd_get_section_flags (abfd, sect) & SEC_LOAD) != 0) | 150 && (bfd_get_section_flags (abfd, sect) & SEC_LOAD) != 0) |
144 » warning (_("Loadable segment \"%s\" outside of ELF segments"), | 151 » warning (_("Loadable section \"%s\" outside of ELF segments"), |
145 bfd_section_name (abfd, sect)); | 152 bfd_section_name (abfd, sect)); |
146 } | 153 } |
147 | 154 |
148 return data; | 155 return data; |
149 } | 156 } |
150 | 157 |
151 /* We are called once per section from elf_symfile_read. We | 158 /* We are called once per section from elf_symfile_read. We |
152 need to examine each section we are passed, check to see | 159 need to examine each section we are passed, check to see |
153 if it is something we are interested in processing, and | 160 if it is something we are interested in processing, and |
154 if so, stash away some access information for the section. | 161 if so, stash away some access information for the section. |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 CORE_ADDR symaddr; | 238 CORE_ADDR symaddr; |
232 CORE_ADDR offset; | 239 CORE_ADDR offset; |
233 enum minimal_symbol_type ms_type; | 240 enum minimal_symbol_type ms_type; |
234 /* If sectinfo is nonNULL, it contains section info that should end up | 241 /* If sectinfo is nonNULL, it contains section info that should end up |
235 filed in the objfile. */ | 242 filed in the objfile. */ |
236 struct stab_section_info *sectinfo = NULL; | 243 struct stab_section_info *sectinfo = NULL; |
237 /* If filesym is nonzero, it points to a file symbol, but we haven't | 244 /* If filesym is nonzero, it points to a file symbol, but we haven't |
238 seen any section info for it yet. */ | 245 seen any section info for it yet. */ |
239 asymbol *filesym = 0; | 246 asymbol *filesym = 0; |
240 /* Name of filesym. This is either a constant string or is saved on | 247 /* Name of filesym. This is either a constant string or is saved on |
241 the objfile's obstack. */ | 248 the objfile's filename cache. */ |
242 char *filesymname = ""; | 249 const char *filesymname = ""; |
243 struct dbx_symfile_info *dbx = objfile->deprecated_sym_stab_info; | 250 struct dbx_symfile_info *dbx = objfile->deprecated_sym_stab_info; |
244 int stripped = (bfd_get_symcount (objfile->obfd) == 0); | 251 int stripped = (bfd_get_symcount (objfile->obfd) == 0); |
245 | 252 |
246 for (i = 0; i < number_of_symbols; i++) | 253 for (i = 0; i < number_of_symbols; i++) |
247 { | 254 { |
248 sym = symbol_table[i]; | 255 sym = symbol_table[i]; |
249 if (sym->name == NULL || *sym->name == '\0') | 256 if (sym->name == NULL || *sym->name == '\0') |
250 { | 257 { |
251 /* Skip names that don't exist (shouldn't happen), or names | 258 /* Skip names that don't exist (shouldn't happen), or names |
252 that are null strings (may happen). */ | 259 that are null strings (may happen). */ |
253 continue; | 260 continue; |
254 } | 261 } |
255 | 262 |
256 /* Skip "special" symbols, e.g. ARM mapping symbols. These are | 263 /* Skip "special" symbols, e.g. ARM mapping symbols. These are |
257 symbols which do not correspond to objects in the symbol table, | 264 symbols which do not correspond to objects in the symbol table, |
258 but have some other target-specific meaning. */ | 265 but have some other target-specific meaning. */ |
259 if (bfd_is_target_special_symbol (objfile->obfd, sym)) | 266 if (bfd_is_target_special_symbol (objfile->obfd, sym)) |
260 { | 267 { |
261 if (gdbarch_record_special_symbol_p (gdbarch)) | 268 if (gdbarch_record_special_symbol_p (gdbarch)) |
262 gdbarch_record_special_symbol (gdbarch, objfile, sym); | 269 gdbarch_record_special_symbol (gdbarch, objfile, sym); |
263 continue; | 270 continue; |
264 } | 271 } |
265 | 272 |
266 offset = ANOFFSET (objfile->section_offsets, sym->section->index); | 273 offset = ANOFFSET (objfile->section_offsets, sym->section->index); |
267 if (type == ST_DYNAMIC | 274 if (type == ST_DYNAMIC |
268 » && sym->section == &bfd_und_section | 275 » && sym->section == bfd_und_section_ptr |
269 && (sym->flags & BSF_FUNCTION)) | 276 && (sym->flags & BSF_FUNCTION)) |
270 { | 277 { |
271 struct minimal_symbol *msym; | 278 struct minimal_symbol *msym; |
272 bfd *abfd = objfile->obfd; | 279 bfd *abfd = objfile->obfd; |
273 asection *sect; | 280 asection *sect; |
274 | 281 |
275 /* Symbol is a reference to a function defined in | 282 /* Symbol is a reference to a function defined in |
276 a shared library. | 283 a shared library. |
277 If its value is non zero then it is usually the address | 284 If its value is non zero then it is usually the address |
278 of the corresponding entry in the procedure linkage table, | 285 of the corresponding entry in the procedure linkage table, |
(...skipping 15 matching lines...) Expand all Loading... |
294 continue; | 301 continue; |
295 | 302 |
296 if (symaddr >= bfd_get_section_vma (abfd, sect) | 303 if (symaddr >= bfd_get_section_vma (abfd, sect) |
297 && symaddr < bfd_get_section_vma (abfd, sect) | 304 && symaddr < bfd_get_section_vma (abfd, sect) |
298 + bfd_get_section_size (sect)) | 305 + bfd_get_section_size (sect)) |
299 break; | 306 break; |
300 } | 307 } |
301 if (!sect) | 308 if (!sect) |
302 continue; | 309 continue; |
303 | 310 |
| 311 /* On ia64-hpux, we have discovered that the system linker |
| 312 adds undefined symbols with nonzero addresses that cannot |
| 313 be right (their address points inside the code of another |
| 314 function in the .text section). This creates problems |
| 315 when trying to determine which symbol corresponds to |
| 316 a given address. |
| 317 |
| 318 We try to detect those buggy symbols by checking which |
| 319 section we think they correspond to. Normally, PLT symbols |
| 320 are stored inside their own section, and the typical name |
| 321 for that section is ".plt". So, if there is a ".plt" |
| 322 section, and yet the section name of our symbol does not |
| 323 start with ".plt", we ignore that symbol. */ |
| 324 if (strncmp (sect->name, ".plt", 4) != 0 |
| 325 && bfd_get_section_by_name (abfd, ".plt") != NULL) |
| 326 continue; |
| 327 |
304 symaddr += ANOFFSET (objfile->section_offsets, sect->index); | 328 symaddr += ANOFFSET (objfile->section_offsets, sect->index); |
305 | 329 |
306 msym = record_minimal_symbol | 330 msym = record_minimal_symbol |
307 (sym->name, strlen (sym->name), copy_names, | 331 (sym->name, strlen (sym->name), copy_names, |
308 symaddr, mst_solib_trampoline, sect, objfile); | 332 symaddr, mst_solib_trampoline, sect, objfile); |
309 if (msym != NULL) | 333 if (msym != NULL) |
310 msym->filename = filesymname; | 334 msym->filename = filesymname; |
311 continue; | 335 continue; |
312 } | 336 } |
313 | 337 |
314 /* If it is a nonstripped executable, do not enter dynamic | 338 /* If it is a nonstripped executable, do not enter dynamic |
315 symbols, as the dynamic symbol table is usually a subset | 339 symbols, as the dynamic symbol table is usually a subset |
316 of the main symbol table. */ | 340 of the main symbol table. */ |
317 if (type == ST_DYNAMIC && !stripped) | 341 if (type == ST_DYNAMIC && !stripped) |
318 continue; | 342 continue; |
319 if (sym->flags & BSF_FILE) | 343 if (sym->flags & BSF_FILE) |
320 { | 344 { |
321 /* STT_FILE debugging symbol that helps stabs-in-elf debugging. | 345 /* STT_FILE debugging symbol that helps stabs-in-elf debugging. |
322 Chain any old one onto the objfile; remember new sym. */ | 346 Chain any old one onto the objfile; remember new sym. */ |
323 if (sectinfo != NULL) | 347 if (sectinfo != NULL) |
324 { | 348 { |
325 sectinfo->next = dbx->stab_section_info; | 349 sectinfo->next = dbx->stab_section_info; |
326 dbx->stab_section_info = sectinfo; | 350 dbx->stab_section_info = sectinfo; |
327 sectinfo = NULL; | 351 sectinfo = NULL; |
328 } | 352 } |
329 filesym = sym; | 353 filesym = sym; |
330 » filesymname = | 354 » filesymname = bcache (filesym->name, strlen (filesym->name) + 1, |
331 » obsavestring ((char *) filesym->name, strlen (filesym->name), | 355 » » » » objfile->filename_cache); |
332 » » » &objfile->objfile_obstack); | |
333 } | 356 } |
334 else if (sym->flags & BSF_SECTION_SYM) | 357 else if (sym->flags & BSF_SECTION_SYM) |
335 continue; | 358 continue; |
336 else if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK)) | 359 else if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK)) |
337 { | 360 { |
338 struct minimal_symbol *msym; | 361 struct minimal_symbol *msym; |
339 | 362 |
340 /* Select global/local/weak symbols. Note that bfd puts abs | 363 /* Select global/local/weak symbols. Note that bfd puts abs |
341 symbols in their own section, so all symbols we are | 364 symbols in their own section, so all symbols we are |
342 interested in will have a section. */ | 365 interested in will have a section. */ |
343 /* Bfd symbols are section relative. */ | 366 /* Bfd symbols are section relative. */ |
344 symaddr = sym->value + sym->section->vma; | 367 symaddr = sym->value + sym->section->vma; |
345 /* Relocate all non-absolute and non-TLS symbols by the | 368 /* Relocate all non-absolute and non-TLS symbols by the |
346 section offset. */ | 369 section offset. */ |
347 » if (sym->section != &bfd_abs_section | 370 » if (sym->section != bfd_abs_section_ptr |
348 && !(sym->section->flags & SEC_THREAD_LOCAL)) | 371 && !(sym->section->flags & SEC_THREAD_LOCAL)) |
349 { | 372 { |
350 symaddr += offset; | 373 symaddr += offset; |
351 } | 374 } |
352 /* For non-absolute symbols, use the type of the section | 375 /* For non-absolute symbols, use the type of the section |
353 they are relative to, to intuit text/data. Bfd provides | 376 they are relative to, to intuit text/data. Bfd provides |
354 no way of figuring this out for absolute symbols. */ | 377 no way of figuring this out for absolute symbols. */ |
355 » if (sym->section == &bfd_abs_section) | 378 » if (sym->section == bfd_abs_section_ptr) |
356 { | 379 { |
357 /* This is a hack to get the minimal symbol type | 380 /* This is a hack to get the minimal symbol type |
358 right for Irix 5, which has absolute addresses | 381 right for Irix 5, which has absolute addresses |
359 with special section indices for dynamic symbols. | 382 with special section indices for dynamic symbols. |
360 | 383 |
361 NOTE: uweigand-20071112: Synthetic symbols do not | 384 NOTE: uweigand-20071112: Synthetic symbols do not |
362 have an ELF-private part, so do not touch those. */ | 385 have an ELF-private part, so do not touch those. */ |
363 unsigned int shndx = type == ST_SYNTHETIC ? 0 : | 386 unsigned int shndx = type == ST_SYNTHETIC ? 0 : |
364 ((elf_symbol_type *) sym)->internal_elf_sym.st_shndx; | 387 ((elf_symbol_type *) sym)->internal_elf_sym.st_shndx; |
365 | 388 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
487 } | 510 } |
488 if (sectinfo->sections[special_local_sect] != 0) | 511 if (sectinfo->sections[special_local_sect] != 0) |
489 complaint (&symfile_complaints, | 512 complaint (&symfile_complaints, |
490 _("duplicated elf/stab section " | 513 _("duplicated elf/stab section " |
491 "information for %s"), | 514 "information for %s"), |
492 sectinfo->filename); | 515 sectinfo->filename); |
493 /* BFD symbols are section relative. */ | 516 /* BFD symbols are section relative. */ |
494 symaddr = sym->value + sym->section->vma; | 517 symaddr = sym->value + sym->section->vma; |
495 /* Relocate non-absolute symbols by the | 518 /* Relocate non-absolute symbols by the |
496 section offset. */ | 519 section offset. */ |
497 » » if (sym->section != &bfd_abs_section) | 520 » » if (sym->section != bfd_abs_section_ptr) |
498 symaddr += offset; | 521 symaddr += offset; |
499 sectinfo->sections[special_local_sect] = symaddr; | 522 sectinfo->sections[special_local_sect] = symaddr; |
500 /* The special local symbols don't go in the | 523 /* The special local symbols don't go in the |
501 minimal symbol table, so ignore this one. */ | 524 minimal symbol table, so ignore this one. */ |
502 continue; | 525 continue; |
503 } | 526 } |
504 /* Not a special stabs-in-elf symbol, do regular | 527 /* Not a special stabs-in-elf symbol, do regular |
505 symbol processing. */ | 528 symbol processing. */ |
506 if (sym->section->flags & SEC_LOAD) | 529 if (sym->section->flags & SEC_LOAD) |
507 { | 530 { |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
564 { | 587 { |
565 struct minimal_symbol *mtramp; | 588 struct minimal_symbol *mtramp; |
566 | 589 |
567 mtramp = record_minimal_symbol (sym->name, len - 4, 1, | 590 mtramp = record_minimal_symbol (sym->name, len - 4, 1, |
568 symaddr, | 591 symaddr, |
569 mst_solib_trampoline, | 592 mst_solib_trampoline, |
570 sym->section, objfile); | 593 sym->section, objfile); |
571 if (mtramp) | 594 if (mtramp) |
572 { | 595 { |
573 MSYMBOL_SIZE (mtramp) = MSYMBOL_SIZE (msym); | 596 MSYMBOL_SIZE (mtramp) = MSYMBOL_SIZE (msym); |
| 597 mtramp->created_by_gdb = 1; |
574 mtramp->filename = filesymname; | 598 mtramp->filename = filesymname; |
575 gdbarch_elf_make_msymbol_special (gdbarch, sym, mtramp); | 599 gdbarch_elf_make_msymbol_special (gdbarch, sym, mtramp); |
576 } | 600 } |
577 } | 601 } |
578 } | 602 } |
579 } | 603 } |
580 } | 604 } |
581 } | 605 } |
582 | 606 |
583 /* Build minimal symbols named `function@got.plt' (see SYMBOL_GOT_PLT_SUFFIX) | 607 /* Build minimal symbols named `function@got.plt' (see SYMBOL_GOT_PLT_SUFFIX) |
584 for later look ups of which function to call when user requests | 608 for later look ups of which function to call when user requests |
585 a STT_GNU_IFUNC function. As the STT_GNU_IFUNC type is found at the target | 609 a STT_GNU_IFUNC function. As the STT_GNU_IFUNC type is found at the target |
586 library defining `function' we cannot yet know while reading OBJFILE which | 610 library defining `function' we cannot yet know while reading OBJFILE which |
587 of the SYMBOL_GOT_PLT_SUFFIX entries will be needed and later | 611 of the SYMBOL_GOT_PLT_SUFFIX entries will be needed and later |
588 DYN_SYMBOL_TABLE is no longer easily available for OBJFILE. */ | 612 DYN_SYMBOL_TABLE is no longer easily available for OBJFILE. */ |
589 | 613 |
590 static void | 614 static void |
591 elf_rel_plt_read (struct objfile *objfile, asymbol **dyn_symbol_table) | 615 elf_rel_plt_read (struct objfile *objfile, asymbol **dyn_symbol_table) |
592 { | 616 { |
593 bfd *obfd = objfile->obfd; | 617 bfd *obfd = objfile->obfd; |
594 const struct elf_backend_data *bed = get_elf_backend_data (obfd); | 618 const struct elf_backend_data *bed = get_elf_backend_data (obfd); |
595 asection *plt, *relplt, *got_plt; | 619 asection *plt, *relplt, *got_plt; |
596 unsigned u; | |
597 int plt_elf_idx; | 620 int plt_elf_idx; |
598 bfd_size_type reloc_count, reloc; | 621 bfd_size_type reloc_count, reloc; |
599 char *string_buffer = NULL; | 622 char *string_buffer = NULL; |
600 size_t string_buffer_size = 0; | 623 size_t string_buffer_size = 0; |
601 struct cleanup *back_to; | 624 struct cleanup *back_to; |
602 struct gdbarch *gdbarch = objfile->gdbarch; | 625 struct gdbarch *gdbarch = objfile->gdbarch; |
603 struct type *ptr_type = builtin_type (gdbarch)->builtin_data_ptr; | 626 struct type *ptr_type = builtin_type (gdbarch)->builtin_data_ptr; |
604 size_t ptr_size = TYPE_LENGTH (ptr_type); | 627 size_t ptr_size = TYPE_LENGTH (ptr_type); |
605 | 628 |
606 if (objfile->separate_debug_objfile_backlink) | 629 if (objfile->separate_debug_objfile_backlink) |
(...skipping 18 matching lines...) Expand all Loading... |
625 return; | 648 return; |
626 | 649 |
627 if (! bed->s->slurp_reloc_table (obfd, relplt, dyn_symbol_table, TRUE)) | 650 if (! bed->s->slurp_reloc_table (obfd, relplt, dyn_symbol_table, TRUE)) |
628 return; | 651 return; |
629 | 652 |
630 back_to = make_cleanup (free_current_contents, &string_buffer); | 653 back_to = make_cleanup (free_current_contents, &string_buffer); |
631 | 654 |
632 reloc_count = relplt->size / elf_section_data (relplt)->this_hdr.sh_entsize; | 655 reloc_count = relplt->size / elf_section_data (relplt)->this_hdr.sh_entsize; |
633 for (reloc = 0; reloc < reloc_count; reloc++) | 656 for (reloc = 0; reloc < reloc_count; reloc++) |
634 { | 657 { |
635 const char *name, *name_got_plt; | 658 const char *name; |
636 struct minimal_symbol *msym; | 659 struct minimal_symbol *msym; |
637 CORE_ADDR address; | 660 CORE_ADDR address; |
638 const size_t got_suffix_len = strlen (SYMBOL_GOT_PLT_SUFFIX); | 661 const size_t got_suffix_len = strlen (SYMBOL_GOT_PLT_SUFFIX); |
639 size_t name_len; | 662 size_t name_len; |
640 | 663 |
641 name = bfd_asymbol_name (*relplt->relocation[reloc].sym_ptr_ptr); | 664 name = bfd_asymbol_name (*relplt->relocation[reloc].sym_ptr_ptr); |
642 name_len = strlen (name); | 665 name_len = strlen (name); |
643 address = relplt->relocation[reloc].address; | 666 address = relplt->relocation[reloc].address; |
644 | 667 |
645 /* Does the pointer reside in the .got.plt section? */ | 668 /* Does the pointer reside in the .got.plt section? */ |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 } | 919 } |
897 | 920 |
898 /* Call STT_GNU_IFUNC - a function returning addresss of a real function to | 921 /* Call STT_GNU_IFUNC - a function returning addresss of a real function to |
899 call. PC is theSTT_GNU_IFUNC resolving function entry. The value returned | 922 call. PC is theSTT_GNU_IFUNC resolving function entry. The value returned |
900 is the entry point of the resolved STT_GNU_IFUNC target function to call. | 923 is the entry point of the resolved STT_GNU_IFUNC target function to call. |
901 */ | 924 */ |
902 | 925 |
903 static CORE_ADDR | 926 static CORE_ADDR |
904 elf_gnu_ifunc_resolve_addr (struct gdbarch *gdbarch, CORE_ADDR pc) | 927 elf_gnu_ifunc_resolve_addr (struct gdbarch *gdbarch, CORE_ADDR pc) |
905 { | 928 { |
906 char *name_at_pc; | 929 const char *name_at_pc; |
907 CORE_ADDR start_at_pc, address; | 930 CORE_ADDR start_at_pc, address; |
908 struct type *func_func_type = builtin_type (gdbarch)->builtin_func_func; | 931 struct type *func_func_type = builtin_type (gdbarch)->builtin_func_func; |
909 struct value *function, *address_val; | 932 struct value *function, *address_val; |
910 | 933 |
911 /* Try first any non-intrusive methods without an inferior call. */ | 934 /* Try first any non-intrusive methods without an inferior call. */ |
912 | 935 |
913 if (find_pc_partial_function (pc, &name_at_pc, &start_at_pc, NULL) | 936 if (find_pc_partial_function (pc, &name_at_pc, &start_at_pc, NULL) |
914 && start_at_pc == pc) | 937 && start_at_pc == pc) |
915 { | 938 { |
916 if (elf_gnu_ifunc_resolve_name (name_at_pc, &address)) | 939 if (elf_gnu_ifunc_resolve_name (name_at_pc, &address)) |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
971 | 994 |
972 init_sal (&sal); | 995 init_sal (&sal); |
973 sal.pspace = current_inferior ()->pspace; | 996 sal.pspace = current_inferior ()->pspace; |
974 sal.pc = prev_pc; | 997 sal.pc = prev_pc; |
975 sal.section = find_pc_overlay (sal.pc); | 998 sal.section = find_pc_overlay (sal.pc); |
976 sal.explicit_pc = 1; | 999 sal.explicit_pc = 1; |
977 b_return = set_momentary_breakpoint (get_frame_arch (prev_frame), sal, | 1000 b_return = set_momentary_breakpoint (get_frame_arch (prev_frame), sal, |
978 prev_frame_id, | 1001 prev_frame_id, |
979 bp_gnu_ifunc_resolver_return); | 1002 bp_gnu_ifunc_resolver_return); |
980 | 1003 |
| 1004 /* set_momentary_breakpoint invalidates PREV_FRAME. */ |
| 1005 prev_frame = NULL; |
| 1006 |
981 /* Add new b_return to the ring list b->related_breakpoint. */ | 1007 /* Add new b_return to the ring list b->related_breakpoint. */ |
982 gdb_assert (b_return->related_breakpoint == b_return); | 1008 gdb_assert (b_return->related_breakpoint == b_return); |
983 b_return->related_breakpoint = b->related_breakpoint; | 1009 b_return->related_breakpoint = b->related_breakpoint; |
984 b->related_breakpoint = b_return; | 1010 b->related_breakpoint = b_return; |
985 } | 1011 } |
986 } | 1012 } |
987 | 1013 |
988 /* Handle inferior hit of bp_gnu_ifunc_resolver_return, see its definition. */ | 1014 /* Handle inferior hit of bp_gnu_ifunc_resolver_return, see its definition. */ |
989 | 1015 |
990 static void | 1016 static void |
991 elf_gnu_ifunc_resolver_return_stop (struct breakpoint *b) | 1017 elf_gnu_ifunc_resolver_return_stop (struct breakpoint *b) |
992 { | 1018 { |
993 struct gdbarch *gdbarch = get_frame_arch (get_current_frame ()); | 1019 struct gdbarch *gdbarch = get_frame_arch (get_current_frame ()); |
994 struct type *func_func_type = builtin_type (gdbarch)->builtin_func_func; | 1020 struct type *func_func_type = builtin_type (gdbarch)->builtin_func_func; |
995 struct type *value_type = TYPE_TARGET_TYPE (func_func_type); | 1021 struct type *value_type = TYPE_TARGET_TYPE (func_func_type); |
996 struct regcache *regcache = get_thread_regcache (inferior_ptid); | 1022 struct regcache *regcache = get_thread_regcache (inferior_ptid); |
| 1023 struct value *func_func; |
997 struct value *value; | 1024 struct value *value; |
998 CORE_ADDR resolved_address, resolved_pc; | 1025 CORE_ADDR resolved_address, resolved_pc; |
999 struct symtab_and_line sal; | 1026 struct symtab_and_line sal; |
1000 struct symtabs_and_lines sals, sals_end; | 1027 struct symtabs_and_lines sals, sals_end; |
1001 | 1028 |
1002 gdb_assert (b->type == bp_gnu_ifunc_resolver_return); | 1029 gdb_assert (b->type == bp_gnu_ifunc_resolver_return); |
1003 | 1030 |
1004 value = allocate_value (value_type); | |
1005 gdbarch_return_value (gdbarch, func_func_type, value_type, regcache, | |
1006 value_contents_raw (value), NULL); | |
1007 resolved_address = value_as_address (value); | |
1008 resolved_pc = gdbarch_convert_from_func_ptr_addr (gdbarch, | |
1009 resolved_address, | |
1010 ¤t_target); | |
1011 | |
1012 while (b->related_breakpoint != b) | 1031 while (b->related_breakpoint != b) |
1013 { | 1032 { |
1014 struct breakpoint *b_next = b->related_breakpoint; | 1033 struct breakpoint *b_next = b->related_breakpoint; |
1015 | 1034 |
1016 switch (b->type) | 1035 switch (b->type) |
1017 { | 1036 { |
1018 case bp_gnu_ifunc_resolver: | 1037 case bp_gnu_ifunc_resolver: |
1019 break; | 1038 break; |
1020 case bp_gnu_ifunc_resolver_return: | 1039 case bp_gnu_ifunc_resolver_return: |
1021 delete_breakpoint (b); | 1040 delete_breakpoint (b); |
1022 break; | 1041 break; |
1023 default: | 1042 default: |
1024 internal_error (__FILE__, __LINE__, | 1043 internal_error (__FILE__, __LINE__, |
1025 _("handle_inferior_event: Invalid " | 1044 _("handle_inferior_event: Invalid " |
1026 "gnu-indirect-function breakpoint type %d"), | 1045 "gnu-indirect-function breakpoint type %d"), |
1027 (int) b->type); | 1046 (int) b->type); |
1028 } | 1047 } |
1029 b = b_next; | 1048 b = b_next; |
1030 } | 1049 } |
1031 gdb_assert (b->type == bp_gnu_ifunc_resolver); | 1050 gdb_assert (b->type == bp_gnu_ifunc_resolver); |
| 1051 gdb_assert (b->loc->next == NULL); |
| 1052 |
| 1053 func_func = allocate_value (func_func_type); |
| 1054 set_value_address (func_func, b->loc->related_address); |
| 1055 |
| 1056 value = allocate_value (value_type); |
| 1057 gdbarch_return_value (gdbarch, func_func, value_type, regcache, |
| 1058 value_contents_raw (value), NULL); |
| 1059 resolved_address = value_as_address (value); |
| 1060 resolved_pc = gdbarch_convert_from_func_ptr_addr (gdbarch, |
| 1061 resolved_address, |
| 1062 ¤t_target); |
1032 | 1063 |
1033 gdb_assert (current_program_space == b->pspace || b->pspace == NULL); | 1064 gdb_assert (current_program_space == b->pspace || b->pspace == NULL); |
1034 elf_gnu_ifunc_record_cache (b->addr_string, resolved_pc); | 1065 elf_gnu_ifunc_record_cache (b->addr_string, resolved_pc); |
1035 | 1066 |
1036 sal = find_pc_line (resolved_pc, 0); | 1067 sal = find_pc_line (resolved_pc, 0); |
1037 sals.nelts = 1; | 1068 sals.nelts = 1; |
1038 sals.sals = &sal; | 1069 sals.sals = &sal; |
1039 sals_end.nelts = 0; | 1070 sals_end.nelts = 0; |
1040 | 1071 |
1041 b->type = bp_breakpoint; | 1072 b->type = bp_breakpoint; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1096 | 1127 |
1097 xfree (found); | 1128 xfree (found); |
1098 | 1129 |
1099 return retval; | 1130 return retval; |
1100 } | 1131 } |
1101 | 1132 |
1102 static char * | 1133 static char * |
1103 build_id_to_debug_filename (struct build_id *build_id) | 1134 build_id_to_debug_filename (struct build_id *build_id) |
1104 { | 1135 { |
1105 char *link, *debugdir, *retval = NULL; | 1136 char *link, *debugdir, *retval = NULL; |
| 1137 VEC (char_ptr) *debugdir_vec; |
| 1138 struct cleanup *back_to; |
| 1139 int ix; |
1106 | 1140 |
1107 /* DEBUG_FILE_DIRECTORY/.build-id/ab/cdef */ | 1141 /* DEBUG_FILE_DIRECTORY/.build-id/ab/cdef */ |
1108 link = alloca (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1 | 1142 link = alloca (strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1 |
1109 + 2 * build_id->size + (sizeof ".debug" - 1) + 1); | 1143 + 2 * build_id->size + (sizeof ".debug" - 1) + 1); |
1110 | 1144 |
1111 /* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will | 1145 /* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will |
1112 cause "/.build-id/..." lookups. */ | 1146 cause "/.build-id/..." lookups. */ |
1113 | 1147 |
1114 debugdir = debug_file_directory; | 1148 debugdir_vec = dirnames_to_char_ptr_vec (debug_file_directory); |
1115 do | 1149 back_to = make_cleanup_free_char_ptr_vec (debugdir_vec); |
| 1150 |
| 1151 for (ix = 0; VEC_iterate (char_ptr, debugdir_vec, ix, debugdir); ++ix) |
1116 { | 1152 { |
1117 char *s, *debugdir_end; | 1153 size_t debugdir_len = strlen (debugdir); |
1118 gdb_byte *data = build_id->data; | 1154 gdb_byte *data = build_id->data; |
1119 size_t size = build_id->size; | 1155 size_t size = build_id->size; |
| 1156 char *s; |
1120 | 1157 |
1121 while (*debugdir == DIRNAME_SEPARATOR) | 1158 memcpy (link, debugdir, debugdir_len); |
1122 » debugdir++; | 1159 s = &link[debugdir_len]; |
1123 | |
1124 debugdir_end = strchr (debugdir, DIRNAME_SEPARATOR); | |
1125 if (debugdir_end == NULL) | |
1126 » debugdir_end = &debugdir[strlen (debugdir)]; | |
1127 | |
1128 memcpy (link, debugdir, debugdir_end - debugdir); | |
1129 s = &link[debugdir_end - debugdir]; | |
1130 s += sprintf (s, "/.build-id/"); | 1160 s += sprintf (s, "/.build-id/"); |
1131 if (size > 0) | 1161 if (size > 0) |
1132 { | 1162 { |
1133 size--; | 1163 size--; |
1134 s += sprintf (s, "%02x", (unsigned) *data++); | 1164 s += sprintf (s, "%02x", (unsigned) *data++); |
1135 } | 1165 } |
1136 if (size > 0) | 1166 if (size > 0) |
1137 *s++ = '/'; | 1167 *s++ = '/'; |
1138 while (size-- > 0) | 1168 while (size-- > 0) |
1139 s += sprintf (s, "%02x", (unsigned) *data++); | 1169 s += sprintf (s, "%02x", (unsigned) *data++); |
1140 strcpy (s, ".debug"); | 1170 strcpy (s, ".debug"); |
1141 | 1171 |
1142 /* lrealpath() is expensive even for the usually non-existent files. */ | 1172 /* lrealpath() is expensive even for the usually non-existent files. */ |
1143 if (access (link, F_OK) == 0) | 1173 if (access (link, F_OK) == 0) |
1144 retval = lrealpath (link); | 1174 retval = lrealpath (link); |
1145 | 1175 |
1146 if (retval != NULL && !build_id_verify (retval, build_id)) | 1176 if (retval != NULL && !build_id_verify (retval, build_id)) |
1147 { | 1177 { |
1148 xfree (retval); | 1178 xfree (retval); |
1149 retval = NULL; | 1179 retval = NULL; |
1150 } | 1180 } |
1151 | 1181 |
1152 if (retval != NULL) | 1182 if (retval != NULL) |
1153 break; | 1183 break; |
| 1184 } |
1154 | 1185 |
1155 debugdir = debugdir_end; | 1186 do_cleanups (back_to); |
1156 } | |
1157 while (*debugdir != 0); | |
1158 | |
1159 return retval; | 1187 return retval; |
1160 } | 1188 } |
1161 | 1189 |
1162 static char * | 1190 static char * |
1163 find_separate_debug_file_by_buildid (struct objfile *objfile) | 1191 find_separate_debug_file_by_buildid (struct objfile *objfile) |
1164 { | 1192 { |
1165 struct build_id *build_id; | 1193 struct build_id *build_id; |
1166 | 1194 |
1167 build_id = build_id_bfd_get (objfile->obfd); | 1195 build_id = build_id_bfd_get (objfile->obfd); |
1168 if (build_id != NULL) | 1196 if (build_id != NULL) |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1216 static void | 1244 static void |
1217 elf_symfile_read (struct objfile *objfile, int symfile_flags) | 1245 elf_symfile_read (struct objfile *objfile, int symfile_flags) |
1218 { | 1246 { |
1219 bfd *synth_abfd, *abfd = objfile->obfd; | 1247 bfd *synth_abfd, *abfd = objfile->obfd; |
1220 struct elfinfo ei; | 1248 struct elfinfo ei; |
1221 struct cleanup *back_to; | 1249 struct cleanup *back_to; |
1222 long symcount = 0, dynsymcount = 0, synthcount, storage_needed; | 1250 long symcount = 0, dynsymcount = 0, synthcount, storage_needed; |
1223 asymbol **symbol_table = NULL, **dyn_symbol_table = NULL; | 1251 asymbol **symbol_table = NULL, **dyn_symbol_table = NULL; |
1224 asymbol *synthsyms; | 1252 asymbol *synthsyms; |
1225 | 1253 |
| 1254 if (symtab_create_debug) |
| 1255 { |
| 1256 fprintf_unfiltered (gdb_stdlog, |
| 1257 "Reading minimal symbols of objfile %s ...\n", |
| 1258 objfile->name); |
| 1259 } |
| 1260 |
1226 init_minimal_symbol_collection (); | 1261 init_minimal_symbol_collection (); |
1227 back_to = make_cleanup_discard_minimal_symbols (); | 1262 back_to = make_cleanup_discard_minimal_symbols (); |
1228 | 1263 |
1229 memset ((char *) &ei, 0, sizeof (ei)); | 1264 memset ((char *) &ei, 0, sizeof (ei)); |
1230 | 1265 |
1231 /* Allocate struct to keep track of the symfile. */ | 1266 /* Allocate struct to keep track of the symfile. */ |
1232 objfile->deprecated_sym_stab_info = (struct dbx_symfile_info *) | 1267 objfile->deprecated_sym_stab_info = (struct dbx_symfile_info *) |
1233 xmalloc (sizeof (struct dbx_symfile_info)); | 1268 xmalloc (sizeof (struct dbx_symfile_info)); |
1234 memset ((char *) objfile->deprecated_sym_stab_info, | 1269 memset ((char *) objfile->deprecated_sym_stab_info, |
1235 0, sizeof (struct dbx_symfile_info)); | 1270 0, sizeof (struct dbx_symfile_info)); |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1408 debugfile = find_separate_debug_file_by_debuglink (objfile); | 1443 debugfile = find_separate_debug_file_by_debuglink (objfile); |
1409 | 1444 |
1410 if (debugfile) | 1445 if (debugfile) |
1411 { | 1446 { |
1412 bfd *abfd = symfile_bfd_open (debugfile); | 1447 bfd *abfd = symfile_bfd_open (debugfile); |
1413 | 1448 |
1414 symbol_file_add_separate (abfd, symfile_flags, objfile); | 1449 symbol_file_add_separate (abfd, symfile_flags, objfile); |
1415 xfree (debugfile); | 1450 xfree (debugfile); |
1416 } | 1451 } |
1417 } | 1452 } |
| 1453 |
| 1454 if (symtab_create_debug) |
| 1455 fprintf_unfiltered (gdb_stdlog, "Done reading minimal symbols.\n"); |
1418 } | 1456 } |
1419 | 1457 |
1420 /* Callback to lazily read psymtabs. */ | 1458 /* Callback to lazily read psymtabs. */ |
1421 | 1459 |
1422 static void | 1460 static void |
1423 read_psyms (struct objfile *objfile) | 1461 read_psyms (struct objfile *objfile) |
1424 { | 1462 { |
1425 if (dwarf2_has_info (objfile, NULL)) | 1463 if (dwarf2_has_info (objfile, NULL)) |
1426 dwarf2_build_psymtabs (objfile); | 1464 dwarf2_build_psymtabs (objfile); |
1427 } | 1465 } |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1549 pst->section_offsets = (struct section_offsets *) | 1587 pst->section_offsets = (struct section_offsets *) |
1550 obstack_alloc (&objfile->objfile_obstack, | 1588 obstack_alloc (&objfile->objfile_obstack, |
1551 SIZEOF_N_SECTION_OFFSETS (objfile->num_sections)); | 1589 SIZEOF_N_SECTION_OFFSETS (objfile->num_sections)); |
1552 for (i = 0; i < maybe->num_sections; i++) | 1590 for (i = 0; i < maybe->num_sections; i++) |
1553 (pst->section_offsets)->offsets[i] = maybe->sections[i]; | 1591 (pst->section_offsets)->offsets[i] = maybe->sections[i]; |
1554 return; | 1592 return; |
1555 } | 1593 } |
1556 | 1594 |
1557 /* We were unable to find any offsets for this file. Complain. */ | 1595 /* We were unable to find any offsets for this file. Complain. */ |
1558 if (dbx->stab_section_info) /* If there *is* any info, */ | 1596 if (dbx->stab_section_info) /* If there *is* any info, */ |
error: old chunk mismatch |
None
OLD | NEW |