OLD | NEW |
1 /* Darwin support for GDB, the GNU debugger. | 1 /* Darwin support for GDB, the GNU debugger. |
2 Copyright (C) 2008-2012 Free Software Foundation, Inc. | 2 Copyright (C) 2008-2013 Free Software Foundation, Inc. |
3 | 3 |
4 Contributed by AdaCore. | 4 Contributed by AdaCore. |
5 | 5 |
6 This file is part of GDB. | 6 This file is part of GDB. |
7 | 7 |
8 This program is free software; you can redistribute it and/or modify | 8 This program is free software; you can redistribute it and/or modify |
9 it under the terms of the GNU General Public License as published by | 9 it under the terms of the GNU General Public License as published by |
10 the Free Software Foundation; either version 3 of the License, or | 10 the Free Software Foundation; either version 3 of the License, or |
11 (at your option) any later version. | 11 (at your option) any later version. |
12 | 12 |
13 This program is distributed in the hope that it will be useful, | 13 This program is distributed in the hope that it will be useful, |
14 but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 GNU General Public License for more details. | 16 GNU General Public License for more details. |
17 | 17 |
18 You should have received a copy of the GNU General Public License | 18 You should have received a copy of the GNU General Public License |
19 along with this program. If not, see <http://www.gnu.org/licenses/>. | 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
20 */ | |
21 | 20 |
22 #include "defs.h" | 21 #include "defs.h" |
23 #include "symtab.h" | 22 #include "symtab.h" |
24 #include "gdbtypes.h" | 23 #include "gdbtypes.h" |
25 #include "bfd.h" | 24 #include "bfd.h" |
26 #include "symfile.h" | 25 #include "symfile.h" |
27 #include "objfiles.h" | 26 #include "objfiles.h" |
28 #include "buildsym.h" | 27 #include "buildsym.h" |
29 #include "gdbcmd.h" | 28 #include "gdbcmd.h" |
30 #include "gdbcore.h" | 29 #include "gdbcore.h" |
31 #include "mach-o.h" | 30 #include "mach-o.h" |
32 #include "gdb_assert.h" | 31 #include "gdb_assert.h" |
33 #include "aout/stab_gnu.h" | 32 #include "aout/stab_gnu.h" |
34 #include "vec.h" | 33 #include "vec.h" |
35 #include "psympriv.h" | 34 #include "psympriv.h" |
36 #include "complaints.h" | 35 #include "complaints.h" |
| 36 #include "gdb_bfd.h" |
37 | 37 |
38 #include <string.h> | 38 #include <string.h> |
39 | 39 |
40 /* If non-zero displays debugging message. */ | 40 /* If non-zero displays debugging message. */ |
41 static int mach_o_debug_level = 0; | 41 static unsigned int mach_o_debug_level = 0; |
42 | 42 |
43 /* Dwarf debugging information are never in the final executable. They stay | 43 /* Dwarf debugging information are never in the final executable. They stay |
44 in object files and the executable contains the list of object files read | 44 in object files and the executable contains the list of object files read |
45 during the link. | 45 during the link. |
46 Each time an oso (other source) is found in the executable, the reader | 46 Each time an oso (other source) is found in the executable, the reader |
47 creates such a structure. They are read after the processing of the | 47 creates such a structure. They are read after the processing of the |
48 executable. */ | 48 executable. */ |
49 | 49 |
50 typedef struct oso_el | 50 typedef struct oso_el |
51 { | 51 { |
52 /* Object file name. Can also be a member name. */ | 52 /* Object file name. Can also be a member name. */ |
53 const char *name; | 53 const char *name; |
54 | 54 |
55 /* Associated time stamp. */ | 55 /* Associated time stamp. */ |
56 unsigned long mtime; | 56 unsigned long mtime; |
57 | 57 |
58 /* Stab symbols range for this OSO. */ | 58 /* Stab symbols range for this OSO. */ |
59 asymbol **oso_sym; | 59 asymbol **oso_sym; |
60 asymbol **end_sym; | 60 asymbol **end_sym; |
61 | 61 |
62 /* Number of interesting stabs in the range. */ | 62 /* Number of interesting stabs in the range. */ |
63 unsigned int nbr_syms; | 63 unsigned int nbr_syms; |
64 } | 64 } |
65 oso_el; | 65 oso_el; |
66 | 66 |
67 /* Vector of object files to be read after the executable. This is one | 67 /* Vector of object files to be read after the executable. */ |
68 global variable but it's life-time is the one of macho_symfile_read. */ | |
69 DEF_VEC_O (oso_el); | 68 DEF_VEC_O (oso_el); |
70 static VEC (oso_el) *oso_vector; | |
71 | 69 |
72 static void | 70 static void |
73 macho_new_init (struct objfile *objfile) | 71 macho_new_init (struct objfile *objfile) |
74 { | 72 { |
75 } | 73 } |
76 | 74 |
77 static void | 75 static void |
78 macho_symfile_init (struct objfile *objfile) | 76 macho_symfile_init (struct objfile *objfile) |
79 { | 77 { |
80 objfile->flags |= OBJF_REORDERED; | 78 objfile->flags |= OBJF_REORDERED; |
81 init_entry_point_info (objfile); | |
82 } | 79 } |
83 | 80 |
84 /* Add a new OSO to the vector of OSO to load. */ | 81 /* Add a new OSO to the vector of OSO to load. */ |
85 | 82 |
86 static void | 83 static void |
87 macho_register_oso (struct objfile *objfile, | 84 macho_register_oso (VEC (oso_el) **oso_vector_ptr, |
| 85 » » struct objfile *objfile, |
88 asymbol **oso_sym, asymbol **end_sym, | 86 asymbol **oso_sym, asymbol **end_sym, |
89 unsigned int nbr_syms) | 87 unsigned int nbr_syms) |
90 { | 88 { |
91 oso_el el; | 89 oso_el el; |
92 | 90 |
93 el.name = (*oso_sym)->name; | 91 el.name = (*oso_sym)->name; |
94 el.mtime = (*oso_sym)->value; | 92 el.mtime = (*oso_sym)->value; |
95 el.oso_sym = oso_sym; | 93 el.oso_sym = oso_sym; |
96 el.end_sym = end_sym; | 94 el.end_sym = end_sym; |
97 el.nbr_syms = nbr_syms; | 95 el.nbr_syms = nbr_syms; |
98 VEC_safe_push (oso_el, oso_vector, &el); | 96 VEC_safe_push (oso_el, *oso_vector_ptr, &el); |
99 } | 97 } |
100 | 98 |
101 /* Add symbol SYM to the minimal symbol table of OBJFILE. */ | 99 /* Add symbol SYM to the minimal symbol table of OBJFILE. */ |
102 | 100 |
103 static void | 101 static void |
104 macho_symtab_add_minsym (struct objfile *objfile, const asymbol *sym) | 102 macho_symtab_add_minsym (struct objfile *objfile, const asymbol *sym) |
105 { | 103 { |
106 if (sym->name == NULL || *sym->name == '\0') | 104 if (sym->name == NULL || *sym->name == '\0') |
107 { | 105 { |
108 /* Skip names that don't exist (shouldn't happen), or names | 106 /* Skip names that don't exist (shouldn't happen), or names |
109 that are null strings (may happen). */ | 107 that are null strings (may happen). */ |
110 return; | 108 return; |
111 } | 109 } |
112 | 110 |
113 if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK)) | 111 if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK)) |
114 { | 112 { |
115 CORE_ADDR symaddr; | 113 CORE_ADDR symaddr; |
116 CORE_ADDR offset; | 114 CORE_ADDR offset; |
117 enum minimal_symbol_type ms_type; | 115 enum minimal_symbol_type ms_type; |
118 | 116 |
119 offset = ANOFFSET (objfile->section_offsets, sym->section->index); | 117 offset = ANOFFSET (objfile->section_offsets, |
| 118 » » » gdb_bfd_section_index (objfile->obfd, sym->section)); |
120 | 119 |
121 /* Bfd symbols are section relative. */ | 120 /* Bfd symbols are section relative. */ |
122 symaddr = sym->value + sym->section->vma; | 121 symaddr = sym->value + sym->section->vma; |
123 | 122 |
124 /* Select global/local/weak symbols. Note that bfd puts abs | 123 /* Select global/local/weak symbols. Note that bfd puts abs |
125 symbols in their own section, so all symbols we are | 124 symbols in their own section, so all symbols we are |
126 interested in will have a section. */ | 125 interested in will have a section. */ |
127 /* Relocate all non-absolute and non-TLS symbols by the | 126 /* Relocate all non-absolute and non-TLS symbols by the |
128 section offset. */ | 127 section offset. */ |
129 if (sym->section != bfd_abs_section_ptr | 128 if (sym->section != bfd_abs_section_ptr |
(...skipping 27 matching lines...) Expand all Loading... |
157 else | 156 else |
158 ms_type = mst_file_bss; | 157 ms_type = mst_file_bss; |
159 } | 158 } |
160 else | 159 else |
161 ms_type = mst_unknown; | 160 ms_type = mst_unknown; |
162 } | 161 } |
163 else | 162 else |
164 return; /* Skip this symbol. */ | 163 return; /* Skip this symbol. */ |
165 | 164 |
166 prim_record_minimal_symbol_and_info | 165 prim_record_minimal_symbol_and_info |
167 (sym->name, symaddr, ms_type, sym->section->index, | 166 (sym->name, symaddr, ms_type, |
168 sym->section, objfile); | 167 » gdb_bfd_section_index (objfile->obfd, sym->section), |
| 168 » objfile); |
169 } | 169 } |
170 } | 170 } |
171 | 171 |
172 /* Build the minimal symbol table from SYMBOL_TABLE of length | 172 /* Build the minimal symbol table from SYMBOL_TABLE of length |
173 NUMBER_OF_SYMBOLS for OBJFILE. Registers OSO filenames found. */ | 173 NUMBER_OF_SYMBOLS for OBJFILE. Registers OSO filenames found. */ |
174 | 174 |
175 static void | 175 static void |
176 macho_symtab_read (struct objfile *objfile, | 176 macho_symtab_read (struct objfile *objfile, |
177 » » long number_of_symbols, asymbol **symbol_table) | 177 » » long number_of_symbols, asymbol **symbol_table, |
| 178 » » VEC (oso_el) **oso_vector_ptr) |
178 { | 179 { |
179 long i; | 180 long i; |
180 const asymbol *dir_so = NULL; | 181 const asymbol *dir_so = NULL; |
181 const asymbol *file_so = NULL; | 182 const asymbol *file_so = NULL; |
182 asymbol **oso_file = NULL; | 183 asymbol **oso_file = NULL; |
183 unsigned int nbr_syms = 0; | 184 unsigned int nbr_syms = 0; |
184 | 185 |
185 /* Current state while reading stabs. */ | 186 /* Current state while reading stabs. */ |
186 enum | 187 enum |
187 { | 188 { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 { | 232 { |
232 if (mach_o_sym->n_type == N_OPT) | 233 if (mach_o_sym->n_type == N_OPT) |
233 { | 234 { |
234 /* No complaint for OPT. */ | 235 /* No complaint for OPT. */ |
235 break; | 236 break; |
236 } | 237 } |
237 | 238 |
238 /* Debugging symbols are not expected here. */ | 239 /* Debugging symbols are not expected here. */ |
239 complaint (&symfile_complaints, | 240 complaint (&symfile_complaints, |
240 _("%s: Unexpected debug stab outside SO markers"), | 241 _("%s: Unexpected debug stab outside SO markers"), |
241 objfile->name); | 242 objfile_name (objfile)); |
242 } | 243 } |
243 else | 244 else |
244 { | 245 { |
245 /* Non-debugging symbols go to the minimal symbol table. */ | 246 /* Non-debugging symbols go to the minimal symbol table. */ |
246 macho_symtab_add_minsym (objfile, sym); | 247 macho_symtab_add_minsym (objfile, sym); |
247 } | 248 } |
248 break; | 249 break; |
249 | 250 |
250 case S_FIRST_SO: | 251 case S_FIRST_SO: |
251 case S_SECOND_SO: | 252 case S_SECOND_SO: |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 break; | 292 break; |
292 | 293 |
293 case S_STAB_FILE: | 294 case S_STAB_FILE: |
294 case S_DWARF_FILE: | 295 case S_DWARF_FILE: |
295 if (mach_o_sym->n_type == N_SO) | 296 if (mach_o_sym->n_type == N_SO) |
296 { | 297 { |
297 if (sym->name == NULL || sym->name[0] == 0) | 298 if (sym->name == NULL || sym->name[0] == 0) |
298 { | 299 { |
299 /* End of file. */ | 300 /* End of file. */ |
300 if (state == S_DWARF_FILE) | 301 if (state == S_DWARF_FILE) |
301 macho_register_oso (objfile, oso_file, symbol_table + i, | 302 macho_register_oso (oso_vector_ptr, objfile, |
| 303 » » » » » oso_file, symbol_table + i, |
302 nbr_syms); | 304 nbr_syms); |
303 state = S_NO_SO; | 305 state = S_NO_SO; |
304 } | 306 } |
305 else | 307 else |
306 { | 308 { |
307 complaint (&symfile_complaints, _("Missing nul SO")); | 309 complaint (&symfile_complaints, _("Missing nul SO")); |
308 file_so = sym; | 310 file_so = sym; |
309 dir_so = NULL; | 311 dir_so = NULL; |
310 state = S_FIRST_SO; | 312 state = S_FIRST_SO; |
311 } | 313 } |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 warning (_("can't find symbol '%s' in minsymtab"), name); | 440 warning (_("can't find symbol '%s' in minsymtab"), name); |
439 return 0; | 441 return 0; |
440 } | 442 } |
441 else | 443 else |
442 return SYMBOL_VALUE_ADDRESS (msym); | 444 return SYMBOL_VALUE_ADDRESS (msym); |
443 } | 445 } |
444 | 446 |
445 /* Add oso file OSO/ABFD as a symbol file. */ | 447 /* Add oso file OSO/ABFD as a symbol file. */ |
446 | 448 |
447 static void | 449 static void |
448 macho_add_oso_symfile (oso_el *oso, bfd *abfd, | 450 macho_add_oso_symfile (oso_el *oso, bfd *abfd, const char *name, |
449 struct objfile *main_objfile, int symfile_flags) | 451 struct objfile *main_objfile, int symfile_flags) |
450 { | 452 { |
451 int storage; | 453 int storage; |
452 int i; | 454 int i; |
453 asymbol **symbol_table; | 455 asymbol **symbol_table; |
454 asymbol **symp; | 456 asymbol **symp; |
455 struct bfd_hash_table table; | 457 struct bfd_hash_table table; |
456 int nbr_sections; | 458 int nbr_sections; |
| 459 struct cleanup *cleanup; |
457 | 460 |
458 /* Per section flag to mark which section have been rebased. */ | 461 /* Per section flag to mark which section have been rebased. */ |
459 unsigned char *sections_rebased; | 462 unsigned char *sections_rebased; |
460 | 463 |
461 if (mach_o_debug_level > 0) | 464 if (mach_o_debug_level > 0) |
462 printf_unfiltered | 465 printf_unfiltered |
463 (_("Loading debugging symbols from oso: %s\n"), oso->name); | 466 (_("Loading debugging symbols from oso: %s\n"), oso->name); |
464 | 467 |
465 if (!bfd_check_format (abfd, bfd_object)) | 468 if (!bfd_check_format (abfd, bfd_object)) |
466 { | 469 { |
467 warning (_("`%s': can't read symbols: %s."), oso->name, | 470 warning (_("`%s': can't read symbols: %s."), oso->name, |
468 bfd_errmsg (bfd_get_error ())); | 471 bfd_errmsg (bfd_get_error ())); |
469 bfd_close (abfd); | 472 gdb_bfd_unref (abfd); |
470 return; | 473 return; |
471 } | 474 } |
472 | 475 |
473 if (abfd->my_archive == NULL && oso->mtime != bfd_get_mtime (abfd)) | 476 if (abfd->my_archive == NULL && oso->mtime != bfd_get_mtime (abfd)) |
474 { | 477 { |
475 warning (_("`%s': file time stamp mismatch."), oso->name); | 478 warning (_("`%s': file time stamp mismatch."), oso->name); |
476 bfd_close (abfd); | 479 gdb_bfd_unref (abfd); |
477 return; | 480 return; |
478 } | 481 } |
479 | 482 |
480 if (!bfd_hash_table_init_n (&table, macho_sym_hash_newfunc, | 483 if (!bfd_hash_table_init_n (&table, macho_sym_hash_newfunc, |
481 sizeof (struct macho_sym_hash_entry), | 484 sizeof (struct macho_sym_hash_entry), |
482 oso->nbr_syms)) | 485 oso->nbr_syms)) |
483 { | 486 { |
484 warning (_("`%s': can't create hash table"), oso->name); | 487 warning (_("`%s': can't create hash table"), oso->name); |
485 bfd_close (abfd); | 488 gdb_bfd_unref (abfd); |
486 return; | 489 return; |
487 } | 490 } |
488 | 491 |
489 bfd_set_cacheable (abfd, 1); | 492 bfd_set_cacheable (abfd, 1); |
490 | 493 |
491 /* Read symbols table. */ | 494 /* Read symbols table. */ |
492 storage = bfd_get_symtab_upper_bound (abfd); | 495 storage = bfd_get_symtab_upper_bound (abfd); |
493 symbol_table = (asymbol **) xmalloc (storage); | 496 symbol_table = (asymbol **) xmalloc (storage); |
494 bfd_canonicalize_symtab (abfd, symbol_table); | 497 bfd_canonicalize_symtab (abfd, symbol_table); |
495 | 498 |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
622 else | 625 else |
623 { | 626 { |
624 /* Mark the section as never rebased. */ | 627 /* Mark the section as never rebased. */ |
625 sections_rebased[sec->index] = 2; | 628 sections_rebased[sec->index] = 2; |
626 } | 629 } |
627 } | 630 } |
628 } | 631 } |
629 | 632 |
630 bfd_hash_table_free (&table); | 633 bfd_hash_table_free (&table); |
631 | 634 |
632 /* Make sure that the filename was malloc'ed. The current filename comes | |
633 either from an OSO symbol name or from an archive name. Memory for both | |
634 is not managed by gdb. */ | |
635 abfd->filename = xstrdup (abfd->filename); | |
636 | |
637 /* We need to clear SYMFILE_MAINLINE to avoid interractive question | 635 /* We need to clear SYMFILE_MAINLINE to avoid interractive question |
638 from symfile.c:symbol_file_add_with_addrs_or_offsets. */ | 636 from symfile.c:symbol_file_add_with_addrs_or_offsets. */ |
| 637 cleanup = make_cleanup_bfd_unref (abfd); |
639 symbol_file_add_from_bfd | 638 symbol_file_add_from_bfd |
640 (abfd, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), NULL, | 639 (abfd, name, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), NULL, |
641 main_objfile->flags & (OBJF_REORDERED | OBJF_SHARED | 640 main_objfile->flags & (OBJF_REORDERED | OBJF_SHARED |
642 | OBJF_READNOW | OBJF_USERLOADED), | 641 | OBJF_READNOW | OBJF_USERLOADED), |
643 main_objfile); | 642 main_objfile); |
| 643 do_cleanups (cleanup); |
644 } | 644 } |
645 | 645 |
646 /* Read symbols from the vector of oso files. */ | 646 /* Read symbols from the vector of oso files. |
| 647 |
| 648 Note that this function sorts OSO_VECTOR_PTR. */ |
647 | 649 |
648 static void | 650 static void |
649 macho_symfile_read_all_oso (struct objfile *main_objfile, int symfile_flags) | 651 macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr, |
| 652 » » » struct objfile *main_objfile, |
| 653 » » » int symfile_flags) |
650 { | 654 { |
651 int ix; | 655 int ix; |
652 VEC (oso_el) *vec; | 656 VEC (oso_el) *vec = *oso_vector_ptr; |
653 oso_el *oso; | 657 oso_el *oso; |
654 | 658 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL); |
655 vec = oso_vector; | |
656 oso_vector = NULL; | |
657 | 659 |
658 /* Sort oso by name so that files from libraries are gathered. */ | 660 /* Sort oso by name so that files from libraries are gathered. */ |
659 qsort (VEC_address (oso_el, vec), VEC_length (oso_el, vec), | 661 qsort (VEC_address (oso_el, vec), VEC_length (oso_el, vec), |
660 sizeof (oso_el), oso_el_compare_name); | 662 sizeof (oso_el), oso_el_compare_name); |
661 | 663 |
662 for (ix = 0; VEC_iterate (oso_el, vec, ix, oso);) | 664 for (ix = 0; VEC_iterate (oso_el, vec, ix, oso);) |
663 { | 665 { |
664 int pfx_len; | 666 int pfx_len; |
665 | 667 |
666 /* Check if this is a library name. */ | 668 /* Check if this is a library name. */ |
667 pfx_len = get_archive_prefix_len (oso->name); | 669 pfx_len = get_archive_prefix_len (oso->name); |
668 if (pfx_len > 0) | 670 if (pfx_len > 0) |
669 { | 671 { |
670 bfd *archive_bfd; | 672 bfd *archive_bfd; |
671 bfd *member_bfd; | 673 bfd *member_bfd; |
672 char *archive_name = XNEWVEC (char, pfx_len + 1); | 674 char *archive_name = XNEWVEC (char, pfx_len + 1); |
673 int last_ix; | 675 int last_ix; |
674 oso_el *oso2; | 676 oso_el *oso2; |
675 int ix2; | 677 int ix2; |
676 | 678 |
677 memcpy (archive_name, oso->name, pfx_len); | 679 memcpy (archive_name, oso->name, pfx_len); |
678 archive_name[pfx_len] = '\0'; | 680 archive_name[pfx_len] = '\0'; |
679 | 681 |
| 682 make_cleanup (xfree, archive_name); |
| 683 |
680 /* Compute number of oso for this archive. */ | 684 /* Compute number of oso for this archive. */ |
681 for (last_ix = ix; | 685 for (last_ix = ix; |
682 VEC_iterate (oso_el, vec, last_ix, oso2); last_ix++) | 686 VEC_iterate (oso_el, vec, last_ix, oso2); last_ix++) |
683 { | 687 { |
684 if (strncmp (oso2->name, archive_name, pfx_len) != 0) | 688 if (strncmp (oso2->name, archive_name, pfx_len) != 0) |
685 break; | 689 break; |
686 } | 690 } |
687 | 691 |
688 /* Open the archive and check the format. */ | 692 /* Open the archive and check the format. */ |
689 » archive_bfd = bfd_openr (archive_name, gnutarget); | 693 » archive_bfd = gdb_bfd_open (archive_name, gnutarget, -1); |
690 if (archive_bfd == NULL) | 694 if (archive_bfd == NULL) |
691 { | 695 { |
692 warning (_("Could not open OSO archive file \"%s\""), | 696 warning (_("Could not open OSO archive file \"%s\""), |
693 archive_name); | 697 archive_name); |
694 ix = last_ix; | 698 ix = last_ix; |
695 continue; | 699 continue; |
696 } | 700 } |
697 if (!bfd_check_format (archive_bfd, bfd_archive)) | 701 if (!bfd_check_format (archive_bfd, bfd_archive)) |
698 { | 702 { |
699 warning (_("OSO archive file \"%s\" not an archive."), | 703 warning (_("OSO archive file \"%s\" not an archive."), |
700 archive_name); | 704 archive_name); |
701 » bfd_close (archive_bfd); | 705 » gdb_bfd_unref (archive_bfd); |
702 ix = last_ix; | 706 ix = last_ix; |
703 continue; | 707 continue; |
704 } | 708 } |
705 » member_bfd = bfd_openr_next_archived_file (archive_bfd, NULL); | 709 |
| 710 » member_bfd = gdb_bfd_openr_next_archived_file (archive_bfd, NULL); |
706 | 711 |
707 if (member_bfd == NULL) | 712 if (member_bfd == NULL) |
708 { | 713 { |
709 warning (_("Could not read archive members out of " | 714 warning (_("Could not read archive members out of " |
710 "OSO archive \"%s\""), archive_name); | 715 "OSO archive \"%s\""), archive_name); |
711 » bfd_close (archive_bfd); | 716 » gdb_bfd_unref (archive_bfd); |
712 ix = last_ix; | 717 ix = last_ix; |
713 continue; | 718 continue; |
714 } | 719 } |
715 | 720 |
716 /* Load all oso in this library. */ | 721 /* Load all oso in this library. */ |
717 while (member_bfd != NULL) | 722 while (member_bfd != NULL) |
718 { | 723 { |
719 bfd *prev; | 724 bfd *prev; |
720 const char *member_name = member_bfd->filename; | 725 const char *member_name = member_bfd->filename; |
721 int member_len = strlen (member_name); | 726 int member_len = strlen (member_name); |
722 | 727 |
723 /* If this member is referenced, add it as a symfile. */ | 728 /* If this member is referenced, add it as a symfile. */ |
724 for (ix2 = ix; ix2 < last_ix; ix2++) | 729 for (ix2 = ix; ix2 < last_ix; ix2++) |
725 { | 730 { |
726 oso2 = VEC_index (oso_el, vec, ix2); | 731 oso2 = VEC_index (oso_el, vec, ix2); |
727 | 732 |
728 if (oso2->name | 733 if (oso2->name |
729 && strlen (oso2->name) == pfx_len + member_len + 2 | 734 && strlen (oso2->name) == pfx_len + member_len + 2 |
730 && !memcmp (member_name, oso2->name + pfx_len + 1, | 735 && !memcmp (member_name, oso2->name + pfx_len + 1, |
731 member_len)) | 736 member_len)) |
732 { | 737 { |
733 macho_add_oso_symfile (oso2, member_bfd, | 738 macho_add_oso_symfile (oso2, member_bfd, |
| 739 bfd_get_filename (member_bfd), |
734 main_objfile, symfile_flags); | 740 main_objfile, symfile_flags); |
735 oso2->name = NULL; | 741 oso2->name = NULL; |
736 break; | 742 break; |
737 } | 743 } |
738 } | 744 } |
739 | 745 |
740 prev = member_bfd; | 746 prev = member_bfd; |
741 » member_bfd = bfd_openr_next_archived_file | 747 » member_bfd = gdb_bfd_openr_next_archived_file (archive_bfd, |
742 » » (archive_bfd, member_bfd); | 748 » » » » » » » member_bfd); |
743 | 749 |
744 /* Free previous member if not referenced by an oso. */ | 750 /* Free previous member if not referenced by an oso. */ |
745 if (ix2 >= last_ix) | 751 if (ix2 >= last_ix) |
746 bfd_close (prev); | 752 gdb_bfd_unref (prev); |
747 } | 753 } |
748 for (ix2 = ix; ix2 < last_ix; ix2++) | 754 for (ix2 = ix; ix2 < last_ix; ix2++) |
749 { | 755 { |
750 oso_el *oso2 = VEC_index (oso_el, vec, ix2); | 756 oso_el *oso2 = VEC_index (oso_el, vec, ix2); |
751 | 757 |
752 if (oso2->name != NULL) | 758 if (oso2->name != NULL) |
753 warning (_("Could not find specified archive member " | 759 warning (_("Could not find specified archive member " |
754 "for OSO name \"%s\""), oso->name); | 760 "for OSO name \"%s\""), oso->name); |
755 } | 761 } |
756 ix = last_ix; | 762 ix = last_ix; |
757 } | 763 } |
758 else | 764 else |
759 { | 765 { |
760 bfd *abfd; | 766 bfd *abfd; |
761 | 767 |
762 » abfd = bfd_openr (oso->name, gnutarget); | 768 » abfd = gdb_bfd_open (oso->name, gnutarget, -1); |
763 if (!abfd) | 769 if (!abfd) |
764 warning (_("`%s': can't open to read symbols: %s."), oso->name, | 770 warning (_("`%s': can't open to read symbols: %s."), oso->name, |
765 bfd_errmsg (bfd_get_error ())); | 771 bfd_errmsg (bfd_get_error ())); |
766 else | 772 else |
767 macho_add_oso_symfile (oso, abfd, main_objfile, symfile_flags); | 773 macho_add_oso_symfile (oso, abfd, oso->name, main_objfile, |
| 774 » » » » symfile_flags); |
768 | 775 |
769 ix++; | 776 ix++; |
770 } | 777 } |
771 } | 778 } |
772 | 779 |
773 VEC_free (oso_el, vec); | 780 do_cleanups (cleanup); |
774 } | 781 } |
775 | 782 |
776 /* DSYM (debug symbols) files contain the debug info of an executable. | 783 /* DSYM (debug symbols) files contain the debug info of an executable. |
777 This is a separate file created by dsymutil(1) and is similar to debug | 784 This is a separate file created by dsymutil(1) and is similar to debug |
778 link feature on ELF. | 785 link feature on ELF. |
779 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the | 786 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the |
780 executable name and the executable base name to get the DSYM file name. */ | 787 executable name and the executable base name to get the DSYM file name. */ |
781 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/" | 788 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/" |
782 | 789 |
783 /* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it. | 790 /* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it |
784 Return NULL if no valid dsym file is found. */ | 791 and return *FILENAMEP with its original xmalloc-ated filename. |
| 792 Return NULL if no valid dsym file is found (FILENAMEP is not used in |
| 793 such case). */ |
785 | 794 |
786 static bfd * | 795 static bfd * |
787 macho_check_dsym (struct objfile *objfile) | 796 macho_check_dsym (struct objfile *objfile, char **filenamep) |
788 { | 797 { |
789 size_t name_len = strlen (objfile->name); | 798 size_t name_len = strlen (objfile_name (objfile)); |
790 size_t dsym_len = strlen (DSYM_SUFFIX); | 799 size_t dsym_len = strlen (DSYM_SUFFIX); |
791 const char *base_name = lbasename (objfile->name); | 800 const char *base_name = lbasename (objfile_name (objfile)); |
792 size_t base_len = strlen (base_name); | 801 size_t base_len = strlen (base_name); |
793 char *dsym_filename = alloca (name_len + dsym_len + base_len + 1); | 802 char *dsym_filename = alloca (name_len + dsym_len + base_len + 1); |
794 bfd *dsym_bfd; | 803 bfd *dsym_bfd; |
795 bfd_mach_o_load_command *main_uuid; | 804 bfd_mach_o_load_command *main_uuid; |
796 bfd_mach_o_load_command *dsym_uuid; | 805 bfd_mach_o_load_command *dsym_uuid; |
797 | 806 |
798 strcpy (dsym_filename, objfile->name); | 807 strcpy (dsym_filename, objfile_name (objfile)); |
799 strcpy (dsym_filename + name_len, DSYM_SUFFIX); | 808 strcpy (dsym_filename + name_len, DSYM_SUFFIX); |
800 strcpy (dsym_filename + name_len + dsym_len, base_name); | 809 strcpy (dsym_filename + name_len + dsym_len, base_name); |
801 | 810 |
802 if (access (dsym_filename, R_OK) != 0) | 811 if (access (dsym_filename, R_OK) != 0) |
803 return NULL; | 812 return NULL; |
804 | 813 |
805 if (bfd_mach_o_lookup_command (objfile->obfd, | 814 if (bfd_mach_o_lookup_command (objfile->obfd, |
806 BFD_MACH_O_LC_UUID, &main_uuid) == 0) | 815 BFD_MACH_O_LC_UUID, &main_uuid) == 0) |
807 { | 816 { |
808 warning (_("can't find UUID in %s"), objfile->name); | 817 warning (_("can't find UUID in %s"), objfile_name (objfile)); |
809 return NULL; | 818 return NULL; |
810 } | 819 } |
811 dsym_filename = xstrdup (dsym_filename); | 820 dsym_bfd = gdb_bfd_openr (dsym_filename, gnutarget); |
812 dsym_bfd = bfd_openr (dsym_filename, gnutarget); | |
813 if (dsym_bfd == NULL) | 821 if (dsym_bfd == NULL) |
814 { | 822 { |
815 warning (_("can't open dsym file %s"), dsym_filename); | 823 warning (_("can't open dsym file %s"), dsym_filename); |
816 xfree (dsym_filename); | |
817 return NULL; | 824 return NULL; |
818 } | 825 } |
819 | 826 |
820 if (!bfd_check_format (dsym_bfd, bfd_object)) | 827 if (!bfd_check_format (dsym_bfd, bfd_object)) |
821 { | 828 { |
822 bfd_close (dsym_bfd); | 829 gdb_bfd_unref (dsym_bfd); |
823 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ())); | 830 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ())); |
824 xfree (dsym_filename); | |
825 return NULL; | 831 return NULL; |
826 } | 832 } |
827 | 833 |
828 if (bfd_mach_o_lookup_command (dsym_bfd, | 834 if (bfd_mach_o_lookup_command (dsym_bfd, |
829 BFD_MACH_O_LC_UUID, &dsym_uuid) == 0) | 835 BFD_MACH_O_LC_UUID, &dsym_uuid) == 0) |
830 { | 836 { |
831 warning (_("can't find UUID in %s"), dsym_filename); | 837 warning (_("can't find UUID in %s"), dsym_filename); |
832 bfd_close (dsym_bfd); | 838 gdb_bfd_unref (dsym_bfd); |
833 xfree (dsym_filename); | |
834 return NULL; | 839 return NULL; |
835 } | 840 } |
836 if (memcmp (dsym_uuid->command.uuid.uuid, main_uuid->command.uuid.uuid, | 841 if (memcmp (dsym_uuid->command.uuid.uuid, main_uuid->command.uuid.uuid, |
837 sizeof (main_uuid->command.uuid.uuid))) | 842 sizeof (main_uuid->command.uuid.uuid))) |
838 { | 843 { |
839 warning (_("dsym file UUID doesn't match the one in %s"), objfile->name); | 844 warning (_("dsym file UUID doesn't match the one in %s"), |
840 bfd_close (dsym_bfd); | 845 » objfile_name (objfile)); |
841 xfree (dsym_filename); | 846 gdb_bfd_unref (dsym_bfd); |
842 return NULL; | 847 return NULL; |
843 } | 848 } |
| 849 *filenamep = xstrdup (dsym_filename); |
844 return dsym_bfd; | 850 return dsym_bfd; |
845 } | 851 } |
846 | 852 |
847 static void | 853 static void |
848 macho_symfile_read (struct objfile *objfile, int symfile_flags) | 854 macho_symfile_read (struct objfile *objfile, int symfile_flags) |
849 { | 855 { |
850 bfd *abfd = objfile->obfd; | 856 bfd *abfd = objfile->obfd; |
851 CORE_ADDR offset; | 857 CORE_ADDR offset; |
852 long storage_needed; | 858 long storage_needed; |
853 bfd *dsym_bfd; | 859 bfd *dsym_bfd; |
| 860 VEC (oso_el) *oso_vector = NULL; |
| 861 struct cleanup *old_chain = make_cleanup (VEC_cleanup (oso_el), &oso_vector); |
854 | 862 |
855 /* Get symbols from the symbol table only if the file is an executable. | 863 /* Get symbols from the symbol table only if the file is an executable. |
856 The symbol table of object files is not relocated and is expected to | 864 The symbol table of object files is not relocated and is expected to |
857 be in the executable. */ | 865 be in the executable. */ |
858 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC)) | 866 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC)) |
859 { | 867 { |
| 868 char *dsym_filename; |
| 869 |
860 /* Process the normal symbol table first. */ | 870 /* Process the normal symbol table first. */ |
861 storage_needed = bfd_get_symtab_upper_bound (objfile->obfd); | 871 storage_needed = bfd_get_symtab_upper_bound (objfile->obfd); |
862 if (storage_needed < 0) | 872 if (storage_needed < 0) |
863 error (_("Can't read symbols from %s: %s"), | 873 error (_("Can't read symbols from %s: %s"), |
864 bfd_get_filename (objfile->obfd), | 874 bfd_get_filename (objfile->obfd), |
865 bfd_errmsg (bfd_get_error ())); | 875 bfd_errmsg (bfd_get_error ())); |
866 | 876 |
867 if (storage_needed > 0) | 877 if (storage_needed > 0) |
868 { | 878 { |
869 asymbol **symbol_table; | 879 asymbol **symbol_table; |
870 long symcount; | 880 long symcount; |
871 struct cleanup *back_to; | |
872 | 881 |
873 symbol_table = (asymbol **) xmalloc (storage_needed); | 882 symbol_table = (asymbol **) xmalloc (storage_needed); |
874 make_cleanup (xfree, symbol_table); | 883 make_cleanup (xfree, symbol_table); |
875 | 884 |
876 init_minimal_symbol_collection (); | 885 init_minimal_symbol_collection (); |
877 back_to = make_cleanup_discard_minimal_symbols (); | 886 make_cleanup_discard_minimal_symbols (); |
878 | 887 |
879 symcount = bfd_canonicalize_symtab (objfile->obfd, symbol_table); | 888 symcount = bfd_canonicalize_symtab (objfile->obfd, symbol_table); |
880 | 889 |
881 if (symcount < 0) | 890 if (symcount < 0) |
882 error (_("Can't read symbols from %s: %s"), | 891 error (_("Can't read symbols from %s: %s"), |
883 bfd_get_filename (objfile->obfd), | 892 bfd_get_filename (objfile->obfd), |
884 bfd_errmsg (bfd_get_error ())); | 893 bfd_errmsg (bfd_get_error ())); |
885 | 894 |
886 » macho_symtab_read (objfile, symcount, symbol_table); | 895 » macho_symtab_read (objfile, symcount, symbol_table, &oso_vector); |
887 | 896 |
888 install_minimal_symbols (objfile); | 897 install_minimal_symbols (objfile); |
889 do_cleanups (back_to); | |
890 } | 898 } |
891 | 899 |
892 /* Try to read .eh_frame / .debug_frame. */ | 900 /* Try to read .eh_frame / .debug_frame. */ |
893 /* First, locate these sections. We ignore the result status | 901 /* First, locate these sections. We ignore the result status |
894 as it only checks for debug info. */ | 902 as it only checks for debug info. */ |
895 dwarf2_has_info (objfile, NULL); | 903 dwarf2_has_info (objfile, NULL); |
896 dwarf2_build_frame_info (objfile); | 904 dwarf2_build_frame_info (objfile); |
897 | 905 |
898 /* Check for DSYM file. */ | 906 /* Check for DSYM file. */ |
899 dsym_bfd = macho_check_dsym (objfile); | 907 dsym_bfd = macho_check_dsym (objfile, &dsym_filename); |
900 if (dsym_bfd != NULL) | 908 if (dsym_bfd != NULL) |
901 { | 909 { |
902 int ix; | 910 int ix; |
903 oso_el *oso; | 911 oso_el *oso; |
904 struct bfd_section *asect, *dsect; | 912 struct bfd_section *asect, *dsect; |
905 | 913 |
| 914 make_cleanup (xfree, dsym_filename); |
| 915 |
906 if (mach_o_debug_level > 0) | 916 if (mach_o_debug_level > 0) |
907 printf_unfiltered (_("dsym file found\n")); | 917 printf_unfiltered (_("dsym file found\n")); |
908 | 918 |
909 /* Remove oso. They won't be used. */ | |
910 VEC_free (oso_el, oso_vector); | |
911 oso_vector = NULL; | |
912 | |
913 /* Set dsym section size. */ | 919 /* Set dsym section size. */ |
914 for (asect = objfile->obfd->sections, dsect = dsym_bfd->sections; | 920 for (asect = objfile->obfd->sections, dsect = dsym_bfd->sections; |
915 asect && dsect; | 921 asect && dsect; |
916 asect = asect->next, dsect = dsect->next) | 922 asect = asect->next, dsect = dsect->next) |
917 { | 923 { |
918 if (strcmp (asect->name, dsect->name) != 0) | 924 if (strcmp (asect->name, dsect->name) != 0) |
919 break; | 925 break; |
920 bfd_set_section_size (dsym_bfd, dsect, | 926 bfd_set_section_size (dsym_bfd, dsect, |
921 bfd_get_section_size (asect)); | 927 bfd_get_section_size (asect)); |
922 } | 928 } |
923 | 929 |
924 /* Add the dsym file as a separate file. */ | 930 /* Add the dsym file as a separate file. */ |
925 symbol_file_add_separate (dsym_bfd, symfile_flags, objfile); | 931 » make_cleanup_bfd_unref (dsym_bfd); |
| 932 symbol_file_add_separate (dsym_bfd, dsym_filename, symfile_flags, |
| 933 » » » » objfile); |
926 | 934 |
927 /* Don't try to read dwarf2 from main file or shared libraries. */ | 935 /* Don't try to read dwarf2 from main file or shared libraries. */ |
| 936 do_cleanups (old_chain); |
928 return; | 937 return; |
929 } | 938 } |
930 } | 939 } |
931 | 940 |
932 if (dwarf2_has_info (objfile, NULL)) | 941 if (dwarf2_has_info (objfile, NULL)) |
933 { | 942 { |
934 /* DWARF 2 sections */ | 943 /* DWARF 2 sections */ |
935 dwarf2_build_psymtabs (objfile); | 944 dwarf2_build_psymtabs (objfile); |
936 } | 945 } |
937 | 946 |
938 /* Then the oso. */ | 947 /* Then the oso. */ |
939 if (oso_vector != NULL) | 948 if (oso_vector != NULL) |
940 macho_symfile_read_all_oso (objfile, symfile_flags); | 949 macho_symfile_read_all_oso (&oso_vector, objfile, symfile_flags); |
| 950 |
| 951 do_cleanups (old_chain); |
941 } | 952 } |
942 | 953 |
943 static bfd_byte * | 954 static bfd_byte * |
944 macho_symfile_relocate (struct objfile *objfile, asection *sectp, | 955 macho_symfile_relocate (struct objfile *objfile, asection *sectp, |
945 bfd_byte *buf) | 956 bfd_byte *buf) |
946 { | 957 { |
947 bfd *abfd = objfile->obfd; | 958 bfd *abfd = objfile->obfd; |
948 | 959 |
949 /* We're only interested in sections with relocation | 960 /* We're only interested in sections with relocation |
950 information. */ | 961 information. */ |
951 if ((sectp->flags & SEC_RELOC) == 0) | 962 if ((sectp->flags & SEC_RELOC) == 0) |
952 return NULL; | 963 return NULL; |
953 | 964 |
954 if (mach_o_debug_level > 0) | 965 if (mach_o_debug_level > 0) |
955 printf_unfiltered (_("Relocate section '%s' of %s\n"), | 966 printf_unfiltered (_("Relocate section '%s' of %s\n"), |
956 sectp->name, objfile->name); | 967 sectp->name, objfile_name (objfile)); |
957 | 968 |
958 return bfd_simple_get_relocated_section_contents (abfd, sectp, buf, NULL); | 969 return bfd_simple_get_relocated_section_contents (abfd, sectp, buf, NULL); |
959 } | 970 } |
960 | 971 |
961 static void | 972 static void |
962 macho_symfile_finish (struct objfile *objfile) | 973 macho_symfile_finish (struct objfile *objfile) |
963 { | 974 { |
964 } | 975 } |
965 | 976 |
966 static void | 977 static void |
967 macho_symfile_offsets (struct objfile *objfile, | 978 macho_symfile_offsets (struct objfile *objfile, |
968 struct section_addr_info *addrs) | 979 const struct section_addr_info *addrs) |
969 { | 980 { |
970 unsigned int i; | 981 unsigned int i; |
971 unsigned int num_sections; | 982 unsigned int num_sections; |
972 struct obj_section *osect; | 983 struct obj_section *osect; |
973 | 984 |
974 /* Allocate section_offsets. */ | 985 /* Allocate section_offsets. */ |
975 objfile->num_sections = bfd_count_sections (objfile->obfd); | 986 objfile->num_sections = bfd_count_sections (objfile->obfd); |
976 objfile->section_offsets = (struct section_offsets *) | 987 objfile->section_offsets = (struct section_offsets *) |
977 obstack_alloc (&objfile->objfile_obstack, | 988 obstack_alloc (&objfile->objfile_obstack, |
978 SIZEOF_N_SECTION_OFFSETS (objfile->num_sections)); | 989 SIZEOF_N_SECTION_OFFSETS (objfile->num_sections)); |
979 memset (objfile->section_offsets, 0, | 990 memset (objfile->section_offsets, 0, |
980 SIZEOF_N_SECTION_OFFSETS (objfile->num_sections)); | 991 SIZEOF_N_SECTION_OFFSETS (objfile->num_sections)); |
981 | 992 |
982 /* This code is run when we first add the objfile with | 993 /* This code is run when we first add the objfile with |
983 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are | 994 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are |
984 passed in. The place in symfile.c where the addrs are applied | 995 passed in. The place in symfile.c where the addrs are applied |
985 depends on the addrs having section names. But in the dyld code | 996 depends on the addrs having section names. But in the dyld code |
986 we build an anonymous array of addrs, so that code is a no-op. | 997 we build an anonymous array of addrs, so that code is a no-op. |
987 Because of that, we have to apply the addrs to the sections here. | 998 Because of that, we have to apply the addrs to the sections here. |
988 N.B. if an objfile slides after we've already created it, then it | 999 N.B. if an objfile slides after we've already created it, then it |
989 goes through objfile_relocate. */ | 1000 goes through objfile_relocate. */ |
990 | 1001 |
991 for (i = 0; i < addrs->num_sections; i++) | 1002 for (i = 0; i < addrs->num_sections; i++) |
992 { | 1003 { |
993 if (addrs->other[i].name == NULL) | |
994 continue; | |
995 | |
996 ALL_OBJFILE_OSECTIONS (objfile, osect) | 1004 ALL_OBJFILE_OSECTIONS (objfile, osect) |
997 { | 1005 { |
998 const char *bfd_sect_name = osect->the_bfd_section->name; | 1006 const char *bfd_sect_name = osect->the_bfd_section->name; |
999 | 1007 |
1000 if (strcmp (bfd_sect_name, addrs->other[i].name) == 0) | 1008 if (strcmp (bfd_sect_name, addrs->other[i].name) == 0) |
1001 { | 1009 { |
1002 obj_section_offset (osect) = addrs->other[i].addr; | 1010 obj_section_offset (osect) = addrs->other[i].addr; |
1003 break; | 1011 break; |
1004 } | 1012 } |
1005 } | 1013 } |
1006 } | 1014 } |
1007 | 1015 |
1008 objfile->sect_index_text = 0; | 1016 objfile->sect_index_text = 0; |
1009 | 1017 |
1010 ALL_OBJFILE_OSECTIONS (objfile, osect) | 1018 ALL_OBJFILE_OSECTIONS (objfile, osect) |
1011 { | 1019 { |
1012 const char *bfd_sect_name = osect->the_bfd_section->name; | 1020 const char *bfd_sect_name = osect->the_bfd_section->name; |
1013 int sect_index = osect->the_bfd_section->index; | 1021 int sect_index = osect - objfile->sections;; |
1014 | 1022 |
1015 if (strncmp (bfd_sect_name, "LC_SEGMENT.", 11) == 0) | 1023 if (strncmp (bfd_sect_name, "LC_SEGMENT.", 11) == 0) |
1016 bfd_sect_name += 11; | 1024 bfd_sect_name += 11; |
1017 if (strcmp (bfd_sect_name, "__TEXT") == 0 | 1025 if (strcmp (bfd_sect_name, "__TEXT") == 0 |
1018 || strcmp (bfd_sect_name, "__TEXT.__text") == 0) | 1026 || strcmp (bfd_sect_name, "__TEXT.__text") == 0) |
1019 objfile->sect_index_text = sect_index; | 1027 objfile->sect_index_text = sect_index; |
1020 } | 1028 } |
1021 } | 1029 } |
1022 | 1030 |
1023 static const struct sym_fns macho_sym_fns = { | 1031 static const struct sym_fns macho_sym_fns = { |
1024 bfd_target_mach_o_flavour, | |
1025 | |
1026 macho_new_init, /* init anything gbl to entire symtab */ | 1032 macho_new_init, /* init anything gbl to entire symtab */ |
1027 macho_symfile_init, /* read initial info, setup for sym_read() */ | 1033 macho_symfile_init, /* read initial info, setup for sym_read() */ |
1028 macho_symfile_read, /* read a symbol file into symtab */ | 1034 macho_symfile_read, /* read a symbol file into symtab */ |
1029 NULL, /* sym_read_psymbols */ | 1035 NULL, /* sym_read_psymbols */ |
1030 macho_symfile_finish, /* finished with file, cleanup */ | 1036 macho_symfile_finish, /* finished with file, cleanup */ |
1031 macho_symfile_offsets, /* xlate external to internal form */ | 1037 macho_symfile_offsets, /* xlate external to internal form */ |
1032 default_symfile_segments, /* Get segment information from a file. */ | 1038 default_symfile_segments, /* Get segment information from a file. */ |
1033 NULL, | 1039 NULL, |
1034 macho_symfile_relocate, /* Relocate a debug section. */ | 1040 macho_symfile_relocate, /* Relocate a debug section. */ |
1035 NULL, /* sym_get_probes */ | 1041 NULL, /* sym_get_probes */ |
1036 &psym_functions | 1042 &psym_functions |
1037 }; | 1043 }; |
1038 | 1044 |
1039 /* -Wmissing-prototypes */ | 1045 /* -Wmissing-prototypes */ |
1040 extern initialize_file_ftype _initialize_machoread; | 1046 extern initialize_file_ftype _initialize_machoread; |
1041 | 1047 |
1042 void | 1048 void |
1043 _initialize_machoread () | 1049 _initialize_machoread (void) |
1044 { | 1050 { |
1045 add_symtab_fns (&macho_sym_fns); | 1051 add_symtab_fns (bfd_target_mach_o_flavour, &macho_sym_fns); |
1046 | 1052 |
1047 add_setshow_zinteger_cmd ("mach-o", class_obscure, | 1053 add_setshow_zuinteger_cmd ("mach-o", class_obscure, |
1048 » » » &mach_o_debug_level, | 1054 » » » &mach_o_debug_level, |
1049 » » » _("Set if printing Mach-O symbols processing."), | 1055 » » » _("Set if printing Mach-O symbols processing."), |
1050 » » » _("Show if printing Mach-O symbols processing."), | 1056 » » » _("Show if printing Mach-O symbols processing."), |
1051 » » » NULL, NULL, NULL, | 1057 » » » NULL, NULL, NULL, |
1052 » » » &setdebuglist, &showdebuglist); | 1058 » » » &setdebuglist, &showdebuglist); |
1053 } | 1059 } |
OLD | NEW |