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