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