* cli/cli-dump.c (bfd_openr_with_cleanup): Use gdb_bfd_openr.
[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   /* We need to clear SYMFILE_MAINLINE to avoid interractive question
633      from symfile.c:symbol_file_add_with_addrs_or_offsets.  */
634   symbol_file_add_from_bfd
635     (abfd, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), NULL,
636      main_objfile->flags & (OBJF_REORDERED | OBJF_SHARED
637                             | OBJF_READNOW | OBJF_USERLOADED),
638      main_objfile);
639 }
640
641 /* Read symbols from the vector of oso files.  */
642
643 static void
644 macho_symfile_read_all_oso (struct objfile *main_objfile, int symfile_flags)
645 {
646   int ix;
647   VEC (oso_el) *vec;
648   oso_el *oso;
649   struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
650
651   vec = oso_vector;
652   oso_vector = NULL;
653
654   /* Sort oso by name so that files from libraries are gathered.  */
655   qsort (VEC_address (oso_el, vec), VEC_length (oso_el, vec),
656          sizeof (oso_el), oso_el_compare_name);
657
658   for (ix = 0; VEC_iterate (oso_el, vec, ix, oso);)
659     {
660       int pfx_len;
661
662       /* Check if this is a library name.  */
663       pfx_len = get_archive_prefix_len (oso->name);
664       if (pfx_len > 0)
665         {
666           bfd *archive_bfd;
667           bfd *member_bfd;
668           char *archive_name = XNEWVEC (char, pfx_len + 1);
669           int last_ix;
670           oso_el *oso2;
671           int ix2;
672
673           memcpy (archive_name, oso->name, pfx_len);
674           archive_name[pfx_len] = '\0';
675
676           make_cleanup (xfree, archive_name);
677
678           /* Compute number of oso for this archive.  */
679           for (last_ix = ix;
680                VEC_iterate (oso_el, vec, last_ix, oso2); last_ix++)
681             {
682               if (strncmp (oso2->name, archive_name, pfx_len) != 0)
683                 break;
684             }
685
686           /* Open the archive and check the format.  */
687           archive_bfd = gdb_bfd_openr (archive_name, gnutarget);
688           if (archive_bfd == NULL)
689             {
690               warning (_("Could not open OSO archive file \"%s\""),
691                        archive_name);
692               ix = last_ix;
693               continue;
694             }
695           if (!bfd_check_format (archive_bfd, bfd_archive))
696             {
697               warning (_("OSO archive file \"%s\" not an archive."),
698                        archive_name);
699               gdb_bfd_unref (archive_bfd);
700               ix = last_ix;
701               continue;
702             }
703
704           member_bfd = gdb_bfd_openr_next_archived_file (archive_bfd, NULL);
705
706           if (member_bfd == NULL)
707             {
708               warning (_("Could not read archive members out of "
709                          "OSO archive \"%s\""), archive_name);
710               gdb_bfd_unref (archive_bfd);
711               ix = last_ix;
712               continue;
713             }
714
715           /* Load all oso in this library.  */
716           while (member_bfd != NULL)
717             {
718               bfd *prev;
719               const char *member_name = member_bfd->filename;
720               int member_len = strlen (member_name);
721
722               /* If this member is referenced, add it as a symfile.  */
723               for (ix2 = ix; ix2 < last_ix; ix2++)
724                 {
725                   oso2 = VEC_index (oso_el, vec, ix2);
726
727                   if (oso2->name
728                       && strlen (oso2->name) == pfx_len + member_len + 2
729                       && !memcmp (member_name, oso2->name + pfx_len + 1,
730                                   member_len))
731                     {
732                       macho_add_oso_symfile (oso2, member_bfd,
733                                              main_objfile, symfile_flags);
734                       oso2->name = NULL;
735                       break;
736                     }
737                 }
738
739               prev = member_bfd;
740               member_bfd = gdb_bfd_openr_next_archived_file (archive_bfd,
741                                                              member_bfd);
742
743               /* Free previous member if not referenced by an oso.  */
744               if (ix2 >= last_ix)
745                 gdb_bfd_unref (prev);
746             }
747           for (ix2 = ix; ix2 < last_ix; ix2++)
748             {
749               oso_el *oso2 = VEC_index (oso_el, vec, ix2);
750
751               if (oso2->name != NULL)
752                 warning (_("Could not find specified archive member "
753                            "for OSO name \"%s\""), oso->name);
754             }
755           ix = last_ix;
756         }
757       else
758         {
759           bfd *abfd;
760
761           abfd = gdb_bfd_openr (oso->name, gnutarget);
762           if (!abfd)
763             warning (_("`%s': can't open to read symbols: %s."), oso->name,
764                      bfd_errmsg (bfd_get_error ()));
765           else
766             macho_add_oso_symfile (oso, abfd, main_objfile, symfile_flags);
767
768           ix++;
769         }
770     }
771
772   VEC_free (oso_el, vec);
773   do_cleanups (cleanup);
774 }
775
776 /* DSYM (debug symbols) files contain the debug info of an executable.
777    This is a separate file created by dsymutil(1) and is similar to debug
778    link feature on ELF.
779    DSYM files are located in a subdirectory.  Append DSYM_SUFFIX to the
780    executable name and the executable base name to get the DSYM file name.  */
781 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
782
783 /* Check if a dsym file exists for OBJFILE.  If so, returns a bfd for it.
784    Return NULL if no valid dsym file is found.  */
785
786 static bfd *
787 macho_check_dsym (struct objfile *objfile)
788 {
789   size_t name_len = strlen (objfile->name);
790   size_t dsym_len = strlen (DSYM_SUFFIX);
791   const char *base_name = lbasename (objfile->name);
792   size_t base_len = strlen (base_name);
793   char *dsym_filename = alloca (name_len + dsym_len + base_len + 1);
794   bfd *dsym_bfd;
795   bfd_mach_o_load_command *main_uuid;
796   bfd_mach_o_load_command *dsym_uuid;
797
798   strcpy (dsym_filename, objfile->name);
799   strcpy (dsym_filename + name_len, DSYM_SUFFIX);
800   strcpy (dsym_filename + name_len + dsym_len, base_name);
801
802   if (access (dsym_filename, R_OK) != 0)
803     return NULL;
804
805   if (bfd_mach_o_lookup_command (objfile->obfd,
806                                  BFD_MACH_O_LC_UUID, &main_uuid) == 0)
807     {
808       warning (_("can't find UUID in %s"), objfile->name);
809       return NULL;
810     }
811   dsym_bfd = gdb_bfd_openr (dsym_filename, gnutarget);
812   if (dsym_bfd == NULL)
813     {
814       warning (_("can't open dsym file %s"), dsym_filename);
815       return NULL;
816     }
817
818   if (!bfd_check_format (dsym_bfd, bfd_object))
819     {
820       gdb_bfd_unref (dsym_bfd);
821       warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
822       return NULL;
823     }
824
825   if (bfd_mach_o_lookup_command (dsym_bfd,
826                                  BFD_MACH_O_LC_UUID, &dsym_uuid) == 0)
827     {
828       warning (_("can't find UUID in %s"), dsym_filename);
829       gdb_bfd_unref (dsym_bfd);
830       return NULL;
831     }
832   if (memcmp (dsym_uuid->command.uuid.uuid, main_uuid->command.uuid.uuid,
833               sizeof (main_uuid->command.uuid.uuid)))
834     {
835       warning (_("dsym file UUID doesn't match the one in %s"), objfile->name);
836       gdb_bfd_unref (dsym_bfd);
837       return NULL;
838     }
839   return dsym_bfd;
840 }
841
842 static void
843 macho_symfile_read (struct objfile *objfile, int symfile_flags)
844 {
845   bfd *abfd = objfile->obfd;
846   CORE_ADDR offset;
847   long storage_needed;
848   bfd *dsym_bfd;
849
850   /* Get symbols from the symbol table only if the file is an executable.
851      The symbol table of object files is not relocated and is expected to
852      be in the executable.  */
853   if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
854     {
855       /* Process the normal symbol table first.  */
856       storage_needed = bfd_get_symtab_upper_bound (objfile->obfd);
857       if (storage_needed < 0)
858         error (_("Can't read symbols from %s: %s"),
859                bfd_get_filename (objfile->obfd),
860                bfd_errmsg (bfd_get_error ()));
861
862       if (storage_needed > 0)
863         {
864           asymbol **symbol_table;
865           long symcount;
866           struct cleanup *back_to;
867
868           symbol_table = (asymbol **) xmalloc (storage_needed);
869           make_cleanup (xfree, symbol_table);
870
871           init_minimal_symbol_collection ();
872           back_to = make_cleanup_discard_minimal_symbols ();
873
874           symcount = bfd_canonicalize_symtab (objfile->obfd, symbol_table);
875
876           if (symcount < 0)
877             error (_("Can't read symbols from %s: %s"),
878                    bfd_get_filename (objfile->obfd),
879                    bfd_errmsg (bfd_get_error ()));
880
881           macho_symtab_read (objfile, symcount, symbol_table);
882
883           install_minimal_symbols (objfile);
884           do_cleanups (back_to);
885         }
886
887       /* Try to read .eh_frame / .debug_frame.  */
888       /* First, locate these sections.  We ignore the result status
889          as it only checks for debug info.  */
890       dwarf2_has_info (objfile, NULL);
891       dwarf2_build_frame_info (objfile);
892
893       /* Check for DSYM file.  */
894       dsym_bfd = macho_check_dsym (objfile);
895       if (dsym_bfd != NULL)
896         {
897           int ix;
898           oso_el *oso;
899           struct bfd_section *asect, *dsect;
900
901           if (mach_o_debug_level > 0)
902             printf_unfiltered (_("dsym file found\n"));
903
904           /* Remove oso.  They won't be used.  */
905           VEC_free (oso_el, oso_vector);
906           oso_vector = NULL;
907
908           /* Set dsym section size.  */
909           for (asect = objfile->obfd->sections, dsect = dsym_bfd->sections;
910                asect && dsect;
911                asect = asect->next, dsect = dsect->next)
912             {
913               if (strcmp (asect->name, dsect->name) != 0)
914                 break;
915               bfd_set_section_size (dsym_bfd, dsect,
916                                     bfd_get_section_size (asect));
917             }
918
919           /* Add the dsym file as a separate file.  */
920           symbol_file_add_separate (dsym_bfd, symfile_flags, objfile);
921
922           /* Don't try to read dwarf2 from main file or shared libraries.  */
923           return;
924         }
925     }
926
927   if (dwarf2_has_info (objfile, NULL))
928     {
929       /* DWARF 2 sections */
930       dwarf2_build_psymtabs (objfile);
931     }
932
933   /* Then the oso.  */
934   if (oso_vector != NULL)
935     macho_symfile_read_all_oso (objfile, symfile_flags);
936 }
937
938 static bfd_byte *
939 macho_symfile_relocate (struct objfile *objfile, asection *sectp,
940                         bfd_byte *buf)
941 {
942   bfd *abfd = objfile->obfd;
943
944   /* We're only interested in sections with relocation
945      information.  */
946   if ((sectp->flags & SEC_RELOC) == 0)
947     return NULL;
948
949   if (mach_o_debug_level > 0)
950     printf_unfiltered (_("Relocate section '%s' of %s\n"),
951                        sectp->name, objfile->name);
952
953   return bfd_simple_get_relocated_section_contents (abfd, sectp, buf, NULL);
954 }
955
956 static void
957 macho_symfile_finish (struct objfile *objfile)
958 {
959 }
960
961 static void
962 macho_symfile_offsets (struct objfile *objfile,
963                        struct section_addr_info *addrs)
964 {
965   unsigned int i;
966   unsigned int num_sections;
967   struct obj_section *osect;
968
969   /* Allocate section_offsets.  */
970   objfile->num_sections = bfd_count_sections (objfile->obfd);
971   objfile->section_offsets = (struct section_offsets *)
972     obstack_alloc (&objfile->objfile_obstack,
973                    SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
974   memset (objfile->section_offsets, 0,
975           SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
976
977   /* This code is run when we first add the objfile with
978      symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
979      passed in.  The place in symfile.c where the addrs are applied
980      depends on the addrs having section names.  But in the dyld code
981      we build an anonymous array of addrs, so that code is a no-op.
982      Because of that, we have to apply the addrs to the sections here.
983      N.B. if an objfile slides after we've already created it, then it
984      goes through objfile_relocate.  */
985
986   for (i = 0; i < addrs->num_sections; i++)
987     {
988       if (addrs->other[i].name == NULL)
989         continue;
990
991       ALL_OBJFILE_OSECTIONS (objfile, osect)
992         {
993           const char *bfd_sect_name = osect->the_bfd_section->name;
994
995           if (strcmp (bfd_sect_name, addrs->other[i].name) == 0)
996             {
997               obj_section_offset (osect) = addrs->other[i].addr;
998               break;
999             }
1000         }
1001     }
1002
1003   objfile->sect_index_text = 0;
1004
1005   ALL_OBJFILE_OSECTIONS (objfile, osect)
1006     {
1007       const char *bfd_sect_name = osect->the_bfd_section->name;
1008       int sect_index = osect->the_bfd_section->index;
1009
1010       if (strncmp (bfd_sect_name, "LC_SEGMENT.", 11) == 0)
1011         bfd_sect_name += 11;
1012       if (strcmp (bfd_sect_name, "__TEXT") == 0
1013           || strcmp (bfd_sect_name, "__TEXT.__text") == 0)
1014         objfile->sect_index_text = sect_index;
1015     }
1016 }
1017
1018 static const struct sym_fns macho_sym_fns = {
1019   bfd_target_mach_o_flavour,
1020
1021   macho_new_init,               /* init anything gbl to entire symtab */
1022   macho_symfile_init,           /* read initial info, setup for sym_read() */
1023   macho_symfile_read,           /* read a symbol file into symtab */
1024   NULL,                         /* sym_read_psymbols */
1025   macho_symfile_finish,         /* finished with file, cleanup */
1026   macho_symfile_offsets,        /* xlate external to internal form */
1027   default_symfile_segments,     /* Get segment information from a file.  */
1028   NULL,
1029   macho_symfile_relocate,       /* Relocate a debug section.  */
1030   NULL,                         /* sym_get_probes */
1031   &psym_functions
1032 };
1033
1034 /* -Wmissing-prototypes */
1035 extern initialize_file_ftype _initialize_machoread;
1036
1037 void
1038 _initialize_machoread ()
1039 {
1040   add_symtab_fns (&macho_sym_fns);
1041
1042   add_setshow_zinteger_cmd ("mach-o", class_obscure,
1043                             &mach_o_debug_level,
1044                             _("Set if printing Mach-O symbols processing."),
1045                             _("Show if printing Mach-O symbols processing."),
1046                             NULL, NULL, NULL,
1047                             &setdebuglist, &showdebuglist);
1048 }