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