xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/machoread.c (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
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.  */
38 static 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 
51 struct 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 
76 static void
77 macho_new_init (struct objfile *objfile)
78 {
79 }
80 
81 static void
82 macho_symfile_init (struct objfile *objfile)
83 {
84   objfile->flags |= OBJF_REORDERED;
85 }
86 
87 /* Add symbol SYM to the minimal symbol table of OBJFILE.  */
88 
89 static void
90 macho_symtab_add_minsym (minimal_symbol_reader &reader,
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,
142 			       gdb_bfd_section_index (objfile->obfd.get (),
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 
150 static void
151 macho_symtab_read (minimal_symbol_reader &reader,
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"),
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 (_("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 
325 static int
326 get_archive_prefix_len (const char *name)
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 
343 static bool
344 oso_el_compare_name (const oso_el &l, const oso_el &r)
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 
352 struct macho_sym_hash_entry
353 {
354   struct bfd_hash_entry base;
355   const asymbol *sym;
356 };
357 
358 /* Routine to create an entry in the hash table.  */
359 
360 static struct bfd_hash_entry *
361 macho_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 
391 static CORE_ADDR
392 macho_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 
412 static void
413 macho_add_oso_symfile (oso_el *oso, const gdb_bfd_ref_ptr &abfd,
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.  */
586   symbol_file_add_from_bfd
587     (abfd, name, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE),
588      NULL,
589      main_objfile->flags & (OBJF_REORDERED | OBJF_SHARED
590 			    | OBJF_READNOW | OBJF_USERLOADED),
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 
598 static void
599 macho_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 (),
608 	     oso_el_compare_name);
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 	{
702 	  gdb_bfd_ref_ptr abfd (gdb_bfd_open (oso->name, gnutarget));
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 
727 static gdb_bfd_ref_ptr
728 macho_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"),
774 	       objfile_name (objfile));
775       return NULL;
776     }
777   *filenamep = std::string (dsym_filename);
778   return dsym_bfd;
779 }
780 
781 static void
782 macho_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 
811 	  minimal_symbol_reader reader (objfile);
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);
831       dwarf2_build_frame_info (objfile);
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 */
863       dwarf2_initialize_objfile (objfile);
864     }
865 
866   /* Then the oso.  */
867   if (!oso_vector.empty ())
868     macho_symfile_read_all_oso (&oso_vector, objfile, symfile_flags);
869 }
870 
871 static bfd_byte *
872 macho_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 
888 static void
889 macho_symfile_finish (struct objfile *objfile)
890 {
891 }
892 
893 static void
894 macho_symfile_offsets (struct objfile *objfile,
895 		       const section_addr_info &addrs)
896 {
897   unsigned int i;
898   struct obj_section *osect;
899 
900   /* Allocate section_offsets.  */
901   objfile->section_offsets.assign (gdb_bfd_count_sections (objfile->obfd.get ()), 0);
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     {
914       ALL_OBJFILE_OSECTIONS (objfile, osect)
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 
926   objfile->sect_index_text = 0;
927 
928   ALL_OBJFILE_OSECTIONS (objfile, osect)
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 
941 static 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 
953 void _initialize_machoread ();
954 void
955 _initialize_machoread ()
956 {
957   add_symtab_fns (bfd_target_mach_o_flavour, &macho_sym_fns);
958 
959   add_setshow_zuinteger_cmd ("mach-o", class_obscure,
960 			     &mach_o_debug_level,
961 			     _("Set if printing Mach-O symbols processing."),
962 			     _("Show if printing Mach-O symbols processing."),
963 			     NULL, NULL, NULL,
964 			     &setdebuglist, &showdebuglist);
965 }
966