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