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