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.  */
37static 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
46struct 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
71static void
72macho_new_init (struct objfile *objfile)
73{
74}
75
76static void
77macho_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
84static void
85macho_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
145static void
146macho_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
320static int
321get_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
338static bool
339oso_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
347struct 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
355static struct bfd_hash_entry *
356macho_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
386static CORE_ADDR
387macho_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
407static void
408macho_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
604static void
605macho_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
733static gdb_bfd_ref_ptr
734macho_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
787static void
788macho_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
878static bfd_byte *
879macho_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
896static void
897macho_symfile_finish (struct objfile *objfile)
898{
899}
900
901static void
902macho_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
949static 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
963void _initialize_machoread ();
964void
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}
976