Remove make_cleanup_restore_current_ui
[deliverable/binutils-gdb.git] / gdb / machoread.c
1 /* Darwin support for GDB, the GNU debugger.
2 Copyright (C) 2008-2016 Free Software Foundation, Inc.
3
4 Contributed by AdaCore.
5
6 This file is part of GDB.
7
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
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
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/>. */
20
21 #include "defs.h"
22 #include "symtab.h"
23 #include "gdbtypes.h"
24 #include "bfd.h"
25 #include "symfile.h"
26 #include "objfiles.h"
27 #include "buildsym.h"
28 #include "gdbcmd.h"
29 #include "gdbcore.h"
30 #include "mach-o.h"
31 #include "aout/stab_gnu.h"
32 #include "vec.h"
33 #include "psympriv.h"
34 #include "complaints.h"
35 #include "gdb_bfd.h"
36 #include <string>
37
38 /* If non-zero displays debugging message. */
39 static unsigned int mach_o_debug_level = 0;
40
41 /* Dwarf debugging information are never in the final executable. They stay
42 in object files and the executable contains the list of object files read
43 during the link.
44 Each time an oso (other source) is found in the executable, the reader
45 creates such a structure. They are read after the processing of the
46 executable. */
47
48 typedef struct oso_el
49 {
50 /* Object file name. Can also be a member name. */
51 const char *name;
52
53 /* Associated time stamp. */
54 unsigned long mtime;
55
56 /* Stab symbols range for this OSO. */
57 asymbol **oso_sym;
58 asymbol **end_sym;
59
60 /* Number of interesting stabs in the range. */
61 unsigned int nbr_syms;
62 }
63 oso_el;
64
65 /* Vector of object files to be read after the executable. */
66 DEF_VEC_O (oso_el);
67
68 static void
69 macho_new_init (struct objfile *objfile)
70 {
71 }
72
73 static void
74 macho_symfile_init (struct objfile *objfile)
75 {
76 objfile->flags |= OBJF_REORDERED;
77 }
78
79 /* Add a new OSO to the vector of OSO to load. */
80
81 static void
82 macho_register_oso (VEC (oso_el) **oso_vector_ptr,
83 struct objfile *objfile,
84 asymbol **oso_sym, asymbol **end_sym,
85 unsigned int nbr_syms)
86 {
87 oso_el el;
88
89 el.name = (*oso_sym)->name;
90 el.mtime = (*oso_sym)->value;
91 el.oso_sym = oso_sym;
92 el.end_sym = end_sym;
93 el.nbr_syms = nbr_syms;
94 VEC_safe_push (oso_el, *oso_vector_ptr, &el);
95 }
96
97 /* Add symbol SYM to the minimal symbol table of OBJFILE. */
98
99 static void
100 macho_symtab_add_minsym (minimal_symbol_reader &reader,
101 struct objfile *objfile, const asymbol *sym)
102 {
103 if (sym->name == NULL || *sym->name == '\0')
104 {
105 /* Skip names that don't exist (shouldn't happen), or names
106 that are null strings (may happen). */
107 return;
108 }
109
110 if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK))
111 {
112 CORE_ADDR symaddr;
113 enum minimal_symbol_type ms_type;
114
115 /* Bfd symbols are section relative. */
116 symaddr = sym->value + sym->section->vma;
117
118 if (sym->section == bfd_abs_section_ptr)
119 ms_type = mst_abs;
120 else if (sym->section->flags & SEC_CODE)
121 {
122 if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
123 ms_type = mst_text;
124 else
125 ms_type = mst_file_text;
126 }
127 else if (sym->section->flags & SEC_ALLOC)
128 {
129 if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
130 {
131 if (sym->section->flags & SEC_LOAD)
132 ms_type = mst_data;
133 else
134 ms_type = mst_bss;
135 }
136 else if (sym->flags & BSF_LOCAL)
137 {
138 /* Not a special stabs-in-elf symbol, do regular
139 symbol processing. */
140 if (sym->section->flags & SEC_LOAD)
141 ms_type = mst_file_data;
142 else
143 ms_type = mst_file_bss;
144 }
145 else
146 ms_type = mst_unknown;
147 }
148 else
149 return; /* Skip this symbol. */
150
151 reader.record_with_info (sym->name, symaddr, ms_type,
152 gdb_bfd_section_index (objfile->obfd,
153 sym->section));
154 }
155 }
156
157 /* Build the minimal symbol table from SYMBOL_TABLE of length
158 NUMBER_OF_SYMBOLS for OBJFILE. Registers OSO filenames found. */
159
160 static void
161 macho_symtab_read (minimal_symbol_reader &reader,
162 struct objfile *objfile,
163 long number_of_symbols, asymbol **symbol_table,
164 VEC (oso_el) **oso_vector_ptr)
165 {
166 long i;
167 const asymbol *file_so = NULL;
168 asymbol **oso_file = NULL;
169 unsigned int nbr_syms = 0;
170
171 /* Current state while reading stabs. */
172 enum
173 {
174 /* Not within an SO part. Only non-debugging symbols should be present,
175 and will be added to the minimal symbols table. */
176 S_NO_SO,
177
178 /* First SO read. Introduce an SO section, and may be followed by a second
179 SO. The SO section should contain onl debugging symbols. */
180 S_FIRST_SO,
181
182 /* Second non-null SO found, just after the first one. Means that the first
183 is in fact a directory name. */
184 S_SECOND_SO,
185
186 /* Non-null OSO found. Debugging info are DWARF in this OSO file. */
187 S_DWARF_FILE,
188
189 S_STAB_FILE
190 } state = S_NO_SO;
191
192 for (i = 0; i < number_of_symbols; i++)
193 {
194 const asymbol *sym = symbol_table[i];
195 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
196
197 switch (state)
198 {
199 case S_NO_SO:
200 if (mach_o_sym->n_type == N_SO)
201 {
202 /* Start of object stab. */
203 if (sym->name == NULL || sym->name[0] == 0)
204 {
205 /* Unexpected empty N_SO. */
206 complaint (&symfile_complaints,
207 _("Unexpected empty N_SO stab"));
208 }
209 else
210 {
211 file_so = sym;
212 state = S_FIRST_SO;
213 }
214 }
215 else if (sym->flags & BSF_DEBUGGING)
216 {
217 if (mach_o_sym->n_type == N_OPT)
218 {
219 /* No complaint for OPT. */
220 break;
221 }
222
223 /* Debugging symbols are not expected here. */
224 complaint (&symfile_complaints,
225 _("%s: Unexpected debug stab outside SO markers"),
226 objfile_name (objfile));
227 }
228 else
229 {
230 /* Non-debugging symbols go to the minimal symbol table. */
231 macho_symtab_add_minsym (reader, objfile, sym);
232 }
233 break;
234
235 case S_FIRST_SO:
236 case S_SECOND_SO:
237 if (mach_o_sym->n_type == N_SO)
238 {
239 if (sym->name == NULL || sym->name[0] == 0)
240 {
241 /* Unexpected empty N_SO. */
242 complaint (&symfile_complaints, _("Empty SO section"));
243 state = S_NO_SO;
244 }
245 else if (state == S_FIRST_SO)
246 {
247 /* Second SO stab for the file name. */
248 file_so = sym;
249 state = S_SECOND_SO;
250 }
251 else
252 complaint (&symfile_complaints, _("Three SO in a raw"));
253 }
254 else if (mach_o_sym->n_type == N_OSO)
255 {
256 if (sym->name == NULL || sym->name[0] == 0)
257 {
258 /* Empty OSO. Means that this file was compiled with
259 stabs. */
260 state = S_STAB_FILE;
261 warning (_("stabs debugging not supported for %s"),
262 file_so->name);
263 }
264 else
265 {
266 /* Non-empty OSO for a Dwarf file. */
267 oso_file = symbol_table + i;
268 nbr_syms = 0;
269 state = S_DWARF_FILE;
270 }
271 }
272 else
273 complaint (&symfile_complaints,
274 _("Unexpected stab after SO"));
275 break;
276
277 case S_STAB_FILE:
278 case S_DWARF_FILE:
279 if (mach_o_sym->n_type == N_SO)
280 {
281 if (sym->name == NULL || sym->name[0] == 0)
282 {
283 /* End of file. */
284 if (state == S_DWARF_FILE)
285 macho_register_oso (oso_vector_ptr, objfile,
286 oso_file, symbol_table + i,
287 nbr_syms);
288 state = S_NO_SO;
289 }
290 else
291 {
292 complaint (&symfile_complaints, _("Missing nul SO"));
293 file_so = sym;
294 state = S_FIRST_SO;
295 }
296 }
297 else if (sym->flags & BSF_DEBUGGING)
298 {
299 if (state == S_STAB_FILE)
300 {
301 /* FIXME: to be implemented. */
302 }
303 else
304 {
305 switch (mach_o_sym->n_type)
306 {
307 case N_FUN:
308 if (sym->name == NULL || sym->name[0] == 0)
309 break;
310 /* Fall through. */
311 case N_STSYM:
312 /* Interesting symbol. */
313 nbr_syms++;
314 break;
315 case N_ENSYM:
316 case N_BNSYM:
317 case N_GSYM:
318 break;
319 default:
320 complaint (&symfile_complaints,
321 _("unhandled stab for dwarf OSO file"));
322 break;
323 }
324 }
325 }
326 else
327 complaint (&symfile_complaints,
328 _("non-debugging symbol within SO"));
329 break;
330 }
331 }
332
333 if (state != S_NO_SO)
334 complaint (&symfile_complaints, _("missing nul SO"));
335 }
336
337 /* If NAME describes an archive member (ie: ARCHIVE '(' MEMBER ')'),
338 returns the length of the archive name.
339 Returns -1 otherwise. */
340
341 static int
342 get_archive_prefix_len (const char *name)
343 {
344 const char *lparen;
345 int name_len = strlen (name);
346
347 if (name_len == 0 || name[name_len - 1] != ')')
348 return -1;
349
350 lparen = strrchr (name, '(');
351 if (lparen == NULL || lparen == name)
352 return -1;
353 return lparen - name;
354 }
355
356 /* Compare function to qsort OSOs, so that members of a library are
357 gathered. */
358
359 static int
360 oso_el_compare_name (const void *vl, const void *vr)
361 {
362 const oso_el *l = (const oso_el *)vl;
363 const oso_el *r = (const oso_el *)vr;
364
365 return strcmp (l->name, r->name);
366 }
367
368 /* Hash table entry structure for the stabs symbols in the main object file.
369 This is used to speed up lookup for symbols in the OSO. */
370
371 struct macho_sym_hash_entry
372 {
373 struct bfd_hash_entry base;
374 const asymbol *sym;
375 };
376
377 /* Routine to create an entry in the hash table. */
378
379 static struct bfd_hash_entry *
380 macho_sym_hash_newfunc (struct bfd_hash_entry *entry,
381 struct bfd_hash_table *table,
382 const char *string)
383 {
384 struct macho_sym_hash_entry *ret = (struct macho_sym_hash_entry *) entry;
385
386 /* Allocate the structure if it has not already been allocated by a
387 subclass. */
388 if (ret == NULL)
389 ret = (struct macho_sym_hash_entry *) bfd_hash_allocate (table,
390 sizeof (* ret));
391 if (ret == NULL)
392 return NULL;
393
394 /* Call the allocation method of the superclass. */
395 ret = (struct macho_sym_hash_entry *)
396 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string);
397
398 if (ret)
399 {
400 /* Initialize the local fields. */
401 ret->sym = NULL;
402 }
403
404 return (struct bfd_hash_entry *) ret;
405 }
406
407 /* Get the value of SYM from the minimal symtab of MAIN_OBJFILE. This is used
408 to get the value of global and common symbols. */
409
410 static CORE_ADDR
411 macho_resolve_oso_sym_with_minsym (struct objfile *main_objfile, asymbol *sym)
412 {
413 /* For common symbol and global symbols, use the min symtab. */
414 struct bound_minimal_symbol msym;
415 const char *name = sym->name;
416
417 if (name[0] == bfd_get_symbol_leading_char (main_objfile->obfd))
418 ++name;
419 msym = lookup_minimal_symbol (name, NULL, main_objfile);
420 if (msym.minsym == NULL)
421 {
422 warning (_("can't find symbol '%s' in minsymtab"), name);
423 return 0;
424 }
425 else
426 return BMSYMBOL_VALUE_ADDRESS (msym);
427 }
428
429 /* Add oso file OSO/ABFD as a symbol file. */
430
431 static void
432 macho_add_oso_symfile (oso_el *oso, bfd *abfd, const char *name,
433 struct objfile *main_objfile, int symfile_flags)
434 {
435 int storage;
436 int i;
437 asymbol **symbol_table;
438 asymbol **symp;
439 struct bfd_hash_table table;
440 int nbr_sections;
441 struct cleanup *cleanup;
442
443 /* Per section flag to mark which section have been rebased. */
444 unsigned char *sections_rebased;
445
446 if (mach_o_debug_level > 0)
447 printf_unfiltered
448 (_("Loading debugging symbols from oso: %s\n"), oso->name);
449
450 if (!bfd_check_format (abfd, bfd_object))
451 {
452 warning (_("`%s': can't read symbols: %s."), oso->name,
453 bfd_errmsg (bfd_get_error ()));
454 gdb_bfd_unref (abfd);
455 return;
456 }
457
458 if (abfd->my_archive == NULL && oso->mtime != bfd_get_mtime (abfd))
459 {
460 warning (_("`%s': file time stamp mismatch."), oso->name);
461 gdb_bfd_unref (abfd);
462 return;
463 }
464
465 if (!bfd_hash_table_init_n (&table, macho_sym_hash_newfunc,
466 sizeof (struct macho_sym_hash_entry),
467 oso->nbr_syms))
468 {
469 warning (_("`%s': can't create hash table"), oso->name);
470 gdb_bfd_unref (abfd);
471 return;
472 }
473
474 bfd_set_cacheable (abfd, 1);
475
476 /* Read symbols table. */
477 storage = bfd_get_symtab_upper_bound (abfd);
478 symbol_table = (asymbol **) xmalloc (storage);
479 bfd_canonicalize_symtab (abfd, symbol_table);
480
481 /* Init section flags. */
482 nbr_sections = bfd_count_sections (abfd);
483 sections_rebased = (unsigned char *) alloca (nbr_sections);
484 for (i = 0; i < nbr_sections; i++)
485 sections_rebased[i] = 0;
486
487 /* Put symbols for the OSO file in the hash table. */
488 for (symp = oso->oso_sym; symp != oso->end_sym; symp++)
489 {
490 const asymbol *sym = *symp;
491 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
492
493 switch (mach_o_sym->n_type)
494 {
495 case N_ENSYM:
496 case N_BNSYM:
497 case N_GSYM:
498 sym = NULL;
499 break;
500 case N_FUN:
501 if (sym->name == NULL || sym->name[0] == 0)
502 sym = NULL;
503 break;
504 case N_STSYM:
505 break;
506 default:
507 sym = NULL;
508 break;
509 }
510 if (sym != NULL)
511 {
512 struct macho_sym_hash_entry *ent;
513
514 ent = (struct macho_sym_hash_entry *)
515 bfd_hash_lookup (&table, sym->name, TRUE, FALSE);
516 if (ent->sym != NULL)
517 complaint (&symfile_complaints,
518 _("Duplicated symbol %s in symbol table"), sym->name);
519 else
520 {
521 if (mach_o_debug_level > 4)
522 {
523 struct gdbarch *arch = get_objfile_arch (main_objfile);
524 printf_unfiltered
525 (_("Adding symbol %s (addr: %s)\n"),
526 sym->name, paddress (arch, sym->value));
527 }
528 ent->sym = sym;
529 }
530 }
531 }
532
533 /* Relocate symbols of the OSO. */
534 for (i = 0; symbol_table[i]; i++)
535 {
536 asymbol *sym = symbol_table[i];
537 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
538
539 if (mach_o_sym->n_type & BFD_MACH_O_N_STAB)
540 continue;
541 if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF
542 && sym->value != 0)
543 {
544 /* For common symbol use the min symtab and modify the OSO
545 symbol table. */
546 CORE_ADDR res;
547
548 res = macho_resolve_oso_sym_with_minsym (main_objfile, sym);
549 if (res != 0)
550 {
551 sym->section = bfd_com_section_ptr;
552 sym->value = res;
553 }
554 }
555 else if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
556 {
557 /* Normal symbol. */
558 asection *sec = sym->section;
559 bfd_mach_o_section *msec;
560 unsigned int sec_type;
561
562 /* Skip buggy ones. */
563 if (sec == NULL || sections_rebased[sec->index] != 0)
564 continue;
565
566 /* Only consider regular, non-debugging sections. */
567 msec = bfd_mach_o_get_mach_o_section (sec);
568 sec_type = msec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
569 if ((sec_type == BFD_MACH_O_S_REGULAR
570 || sec_type == BFD_MACH_O_S_ZEROFILL)
571 && (msec->flags & BFD_MACH_O_S_ATTR_DEBUG) == 0)
572 {
573 CORE_ADDR addr = 0;
574
575 if ((mach_o_sym->n_type & BFD_MACH_O_N_EXT) != 0)
576 {
577 /* Use the min symtab for global symbols. */
578 addr = macho_resolve_oso_sym_with_minsym (main_objfile, sym);
579 }
580 else
581 {
582 struct macho_sym_hash_entry *ent;
583
584 ent = (struct macho_sym_hash_entry *)
585 bfd_hash_lookup (&table, sym->name, FALSE, FALSE);
586 if (ent != NULL)
587 addr = bfd_asymbol_value (ent->sym);
588 }
589
590 /* Adjust the section. */
591 if (addr != 0)
592 {
593 CORE_ADDR res = addr - sym->value;
594
595 if (mach_o_debug_level > 3)
596 {
597 struct gdbarch *arch = get_objfile_arch (main_objfile);
598 printf_unfiltered
599 (_("resolve sect %s with %s (set to %s)\n"),
600 sec->name, sym->name,
601 paddress (arch, res));
602 }
603 bfd_set_section_vma (abfd, sec, res);
604 sections_rebased[sec->index] = 1;
605 }
606 }
607 else
608 {
609 /* Mark the section as never rebased. */
610 sections_rebased[sec->index] = 2;
611 }
612 }
613 }
614
615 bfd_hash_table_free (&table);
616
617 /* We need to clear SYMFILE_MAINLINE to avoid interractive question
618 from symfile.c:symbol_file_add_with_addrs_or_offsets. */
619 cleanup = make_cleanup_bfd_unref (abfd);
620 symbol_file_add_from_bfd
621 (abfd, name, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), NULL,
622 main_objfile->flags & (OBJF_REORDERED | OBJF_SHARED
623 | OBJF_READNOW | OBJF_USERLOADED),
624 main_objfile);
625 do_cleanups (cleanup);
626 }
627
628 /* Read symbols from the vector of oso files.
629
630 Note that this function sorts OSO_VECTOR_PTR. */
631
632 static void
633 macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr,
634 struct objfile *main_objfile,
635 int symfile_flags)
636 {
637 int ix;
638 VEC (oso_el) *vec = *oso_vector_ptr;
639 oso_el *oso;
640
641 /* Sort oso by name so that files from libraries are gathered. */
642 qsort (VEC_address (oso_el, vec), VEC_length (oso_el, vec),
643 sizeof (oso_el), oso_el_compare_name);
644
645 for (ix = 0; VEC_iterate (oso_el, vec, ix, oso);)
646 {
647 int pfx_len;
648
649 /* Check if this is a library name. */
650 pfx_len = get_archive_prefix_len (oso->name);
651 if (pfx_len > 0)
652 {
653 bfd *archive_bfd;
654 bfd *member_bfd;
655 int last_ix;
656 oso_el *oso2;
657 int ix2;
658
659 std::string archive_name (oso->name, pfx_len);
660
661 /* Compute number of oso for this archive. */
662 for (last_ix = ix;
663 VEC_iterate (oso_el, vec, last_ix, oso2); last_ix++)
664 {
665 if (strncmp (oso2->name, archive_name.c_str (), pfx_len) != 0)
666 break;
667 }
668
669 /* Open the archive and check the format. */
670 archive_bfd = gdb_bfd_open (archive_name.c_str (), gnutarget, -1);
671 if (archive_bfd == NULL)
672 {
673 warning (_("Could not open OSO archive file \"%s\""),
674 archive_name.c_str ());
675 ix = last_ix;
676 continue;
677 }
678 if (!bfd_check_format (archive_bfd, bfd_archive))
679 {
680 warning (_("OSO archive file \"%s\" not an archive."),
681 archive_name.c_str ());
682 gdb_bfd_unref (archive_bfd);
683 ix = last_ix;
684 continue;
685 }
686
687 member_bfd = gdb_bfd_openr_next_archived_file (archive_bfd, NULL);
688
689 if (member_bfd == NULL)
690 {
691 warning (_("Could not read archive members out of "
692 "OSO archive \"%s\""), archive_name.c_str ());
693 gdb_bfd_unref (archive_bfd);
694 ix = last_ix;
695 continue;
696 }
697
698 /* Load all oso in this library. */
699 while (member_bfd != NULL)
700 {
701 bfd *prev;
702 const char *member_name = member_bfd->filename;
703 int member_len = strlen (member_name);
704
705 /* If this member is referenced, add it as a symfile. */
706 for (ix2 = ix; ix2 < last_ix; ix2++)
707 {
708 oso2 = VEC_index (oso_el, vec, ix2);
709
710 if (oso2->name
711 && strlen (oso2->name) == pfx_len + member_len + 2
712 && !memcmp (member_name, oso2->name + pfx_len + 1,
713 member_len))
714 {
715 macho_add_oso_symfile (oso2, member_bfd,
716 bfd_get_filename (member_bfd),
717 main_objfile, symfile_flags);
718 oso2->name = NULL;
719 break;
720 }
721 }
722
723 prev = member_bfd;
724 member_bfd = gdb_bfd_openr_next_archived_file (archive_bfd,
725 member_bfd);
726
727 /* Free previous member if not referenced by an oso. */
728 if (ix2 >= last_ix)
729 gdb_bfd_unref (prev);
730 }
731 for (ix2 = ix; ix2 < last_ix; ix2++)
732 {
733 oso_el *oso2 = VEC_index (oso_el, vec, ix2);
734
735 if (oso2->name != NULL)
736 warning (_("Could not find specified archive member "
737 "for OSO name \"%s\""), oso->name);
738 }
739 ix = last_ix;
740 }
741 else
742 {
743 bfd *abfd;
744
745 abfd = gdb_bfd_open (oso->name, gnutarget, -1);
746 if (!abfd)
747 warning (_("`%s': can't open to read symbols: %s."), oso->name,
748 bfd_errmsg (bfd_get_error ()));
749 else
750 macho_add_oso_symfile (oso, abfd, oso->name, main_objfile,
751 symfile_flags);
752
753 ix++;
754 }
755 }
756 }
757
758 /* DSYM (debug symbols) files contain the debug info of an executable.
759 This is a separate file created by dsymutil(1) and is similar to debug
760 link feature on ELF.
761 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the
762 executable name and the executable base name to get the DSYM file name. */
763 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
764
765 /* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it
766 and return *FILENAMEP with its original xmalloc-ated filename.
767 Return NULL if no valid dsym file is found (FILENAMEP is not used in
768 such case). */
769
770 static bfd *
771 macho_check_dsym (struct objfile *objfile, char **filenamep)
772 {
773 size_t name_len = strlen (objfile_name (objfile));
774 size_t dsym_len = strlen (DSYM_SUFFIX);
775 const char *base_name = lbasename (objfile_name (objfile));
776 size_t base_len = strlen (base_name);
777 char *dsym_filename = (char *) alloca (name_len + dsym_len + base_len + 1);
778 bfd *dsym_bfd;
779 bfd_mach_o_load_command *main_uuid;
780 bfd_mach_o_load_command *dsym_uuid;
781
782 strcpy (dsym_filename, objfile_name (objfile));
783 strcpy (dsym_filename + name_len, DSYM_SUFFIX);
784 strcpy (dsym_filename + name_len + dsym_len, base_name);
785
786 if (access (dsym_filename, R_OK) != 0)
787 return NULL;
788
789 if (bfd_mach_o_lookup_command (objfile->obfd,
790 BFD_MACH_O_LC_UUID, &main_uuid) == 0)
791 {
792 warning (_("can't find UUID in %s"), objfile_name (objfile));
793 return NULL;
794 }
795 dsym_bfd = gdb_bfd_openr (dsym_filename, gnutarget);
796 if (dsym_bfd == NULL)
797 {
798 warning (_("can't open dsym file %s"), dsym_filename);
799 return NULL;
800 }
801
802 if (!bfd_check_format (dsym_bfd, bfd_object))
803 {
804 gdb_bfd_unref (dsym_bfd);
805 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
806 return NULL;
807 }
808
809 if (bfd_mach_o_lookup_command (dsym_bfd,
810 BFD_MACH_O_LC_UUID, &dsym_uuid) == 0)
811 {
812 warning (_("can't find UUID in %s"), dsym_filename);
813 gdb_bfd_unref (dsym_bfd);
814 return NULL;
815 }
816 if (memcmp (dsym_uuid->command.uuid.uuid, main_uuid->command.uuid.uuid,
817 sizeof (main_uuid->command.uuid.uuid)))
818 {
819 warning (_("dsym file UUID doesn't match the one in %s"),
820 objfile_name (objfile));
821 gdb_bfd_unref (dsym_bfd);
822 return NULL;
823 }
824 *filenamep = xstrdup (dsym_filename);
825 return dsym_bfd;
826 }
827
828 static void
829 macho_symfile_read (struct objfile *objfile, int symfile_flags)
830 {
831 bfd *abfd = objfile->obfd;
832 long storage_needed;
833 bfd *dsym_bfd;
834 VEC (oso_el) *oso_vector = NULL;
835 struct cleanup *old_chain = make_cleanup (VEC_cleanup (oso_el), &oso_vector);
836
837 /* Get symbols from the symbol table only if the file is an executable.
838 The symbol table of object files is not relocated and is expected to
839 be in the executable. */
840 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
841 {
842 char *dsym_filename;
843
844 /* Process the normal symbol table first. */
845 storage_needed = bfd_get_symtab_upper_bound (objfile->obfd);
846 if (storage_needed < 0)
847 error (_("Can't read symbols from %s: %s"),
848 bfd_get_filename (objfile->obfd),
849 bfd_errmsg (bfd_get_error ()));
850
851 if (storage_needed > 0)
852 {
853 asymbol **symbol_table;
854 long symcount;
855
856 symbol_table = (asymbol **) xmalloc (storage_needed);
857 make_cleanup (xfree, symbol_table);
858
859 minimal_symbol_reader reader (objfile);
860
861 symcount = bfd_canonicalize_symtab (objfile->obfd, symbol_table);
862
863 if (symcount < 0)
864 error (_("Can't read symbols from %s: %s"),
865 bfd_get_filename (objfile->obfd),
866 bfd_errmsg (bfd_get_error ()));
867
868 macho_symtab_read (reader, objfile, symcount, symbol_table,
869 &oso_vector);
870
871 reader.install ();
872 }
873
874 /* Try to read .eh_frame / .debug_frame. */
875 /* First, locate these sections. We ignore the result status
876 as it only checks for debug info. */
877 dwarf2_has_info (objfile, NULL);
878 dwarf2_build_frame_info (objfile);
879
880 /* Check for DSYM file. */
881 dsym_bfd = macho_check_dsym (objfile, &dsym_filename);
882 if (dsym_bfd != NULL)
883 {
884 struct bfd_section *asect, *dsect;
885
886 make_cleanup (xfree, dsym_filename);
887
888 if (mach_o_debug_level > 0)
889 printf_unfiltered (_("dsym file found\n"));
890
891 /* Set dsym section size. */
892 for (asect = objfile->obfd->sections, dsect = dsym_bfd->sections;
893 asect && dsect;
894 asect = asect->next, dsect = dsect->next)
895 {
896 if (strcmp (asect->name, dsect->name) != 0)
897 break;
898 bfd_set_section_size (dsym_bfd, dsect,
899 bfd_get_section_size (asect));
900 }
901
902 /* Add the dsym file as a separate file. */
903 make_cleanup_bfd_unref (dsym_bfd);
904 symbol_file_add_separate (dsym_bfd, dsym_filename, symfile_flags,
905 objfile);
906
907 /* Don't try to read dwarf2 from main file or shared libraries. */
908 do_cleanups (old_chain);
909 return;
910 }
911 }
912
913 if (dwarf2_has_info (objfile, NULL))
914 {
915 /* DWARF 2 sections */
916 dwarf2_build_psymtabs (objfile);
917 }
918
919 /* Then the oso. */
920 if (oso_vector != NULL)
921 macho_symfile_read_all_oso (&oso_vector, objfile, symfile_flags);
922
923 do_cleanups (old_chain);
924 }
925
926 static bfd_byte *
927 macho_symfile_relocate (struct objfile *objfile, asection *sectp,
928 bfd_byte *buf)
929 {
930 bfd *abfd = objfile->obfd;
931
932 /* We're only interested in sections with relocation
933 information. */
934 if ((sectp->flags & SEC_RELOC) == 0)
935 return NULL;
936
937 if (mach_o_debug_level > 0)
938 printf_unfiltered (_("Relocate section '%s' of %s\n"),
939 sectp->name, objfile_name (objfile));
940
941 return bfd_simple_get_relocated_section_contents (abfd, sectp, buf, NULL);
942 }
943
944 static void
945 macho_symfile_finish (struct objfile *objfile)
946 {
947 }
948
949 static void
950 macho_symfile_offsets (struct objfile *objfile,
951 const struct section_addr_info *addrs)
952 {
953 unsigned int i;
954 struct obj_section *osect;
955
956 /* Allocate section_offsets. */
957 objfile->num_sections = bfd_count_sections (objfile->obfd);
958 objfile->section_offsets = (struct section_offsets *)
959 obstack_alloc (&objfile->objfile_obstack,
960 SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
961 memset (objfile->section_offsets, 0,
962 SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
963
964 /* This code is run when we first add the objfile with
965 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
966 passed in. The place in symfile.c where the addrs are applied
967 depends on the addrs having section names. But in the dyld code
968 we build an anonymous array of addrs, so that code is a no-op.
969 Because of that, we have to apply the addrs to the sections here.
970 N.B. if an objfile slides after we've already created it, then it
971 goes through objfile_relocate. */
972
973 for (i = 0; i < addrs->num_sections; i++)
974 {
975 ALL_OBJFILE_OSECTIONS (objfile, osect)
976 {
977 const char *bfd_sect_name = osect->the_bfd_section->name;
978
979 if (strcmp (bfd_sect_name, addrs->other[i].name) == 0)
980 {
981 obj_section_offset (osect) = addrs->other[i].addr;
982 break;
983 }
984 }
985 }
986
987 objfile->sect_index_text = 0;
988
989 ALL_OBJFILE_OSECTIONS (objfile, osect)
990 {
991 const char *bfd_sect_name = osect->the_bfd_section->name;
992 int sect_index = osect - objfile->sections;;
993
994 if (startswith (bfd_sect_name, "LC_SEGMENT."))
995 bfd_sect_name += 11;
996 if (strcmp (bfd_sect_name, "__TEXT") == 0
997 || strcmp (bfd_sect_name, "__TEXT.__text") == 0)
998 objfile->sect_index_text = sect_index;
999 }
1000 }
1001
1002 static const struct sym_fns macho_sym_fns = {
1003 macho_new_init, /* init anything gbl to entire symtab */
1004 macho_symfile_init, /* read initial info, setup for sym_read() */
1005 macho_symfile_read, /* read a symbol file into symtab */
1006 NULL, /* sym_read_psymbols */
1007 macho_symfile_finish, /* finished with file, cleanup */
1008 macho_symfile_offsets, /* xlate external to internal form */
1009 default_symfile_segments, /* Get segment information from a file. */
1010 NULL,
1011 macho_symfile_relocate, /* Relocate a debug section. */
1012 NULL, /* sym_get_probes */
1013 &psym_functions
1014 };
1015
1016 /* -Wmissing-prototypes */
1017 extern initialize_file_ftype _initialize_machoread;
1018
1019 void
1020 _initialize_machoread (void)
1021 {
1022 add_symtab_fns (bfd_target_mach_o_flavour, &macho_sym_fns);
1023
1024 add_setshow_zuinteger_cmd ("mach-o", class_obscure,
1025 &mach_o_debug_level,
1026 _("Set if printing Mach-O symbols processing."),
1027 _("Show if printing Mach-O symbols processing."),
1028 NULL, NULL, NULL,
1029 &setdebuglist, &showdebuglist);
1030 }
This page took 0.063214 seconds and 4 git commands to generate.