Upgrade GDB from 7.4.1 to 7.6.1 on the vendor branch
[dragonfly.git] / contrib / gdb-7 / gdb / machoread.c
1 /* Darwin support for GDB, the GNU debugger.
2    Copyright (C) 2008-2013 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 #include "gdb_bfd.h"
38
39 #include <string.h>
40
41 /* If non-zero displays debugging message.  */
42 static unsigned int mach_o_debug_level = 0;
43
44 /* Dwarf debugging information are never in the final executable.  They stay
45    in object files and the executable contains the list of object files read
46    during the link.
47    Each time an oso (other source) is found in the executable, the reader
48    creates such a structure.  They are read after the processing of the
49    executable.  */
50
51 typedef struct oso_el
52 {
53   /* Object file name.  Can also be a member name.  */
54   const char *name;
55
56   /* Associated time stamp.  */
57   unsigned long mtime;
58
59   /* Stab symbols range for this OSO.  */
60   asymbol **oso_sym;
61   asymbol **end_sym;
62
63   /* Number of interesting stabs in the range.  */
64   unsigned int nbr_syms;
65 }
66 oso_el;
67
68 /* Vector of object files to be read after the executable.  This is one
69    global variable but it's life-time is the one of macho_symfile_read.  */
70 DEF_VEC_O (oso_el);
71 static VEC (oso_el) *oso_vector;
72
73 static void
74 macho_new_init (struct objfile *objfile)
75 {
76 }
77
78 static void
79 macho_symfile_init (struct objfile *objfile)
80 {
81   objfile->flags |= OBJF_REORDERED;
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   struct cleanup *cleanup;
458
459   /* Per section flag to mark which section have been rebased.  */
460   unsigned char *sections_rebased;
461
462   if (mach_o_debug_level > 0)
463     printf_unfiltered
464       (_("Loading debugging symbols from oso: %s\n"), oso->name);
465
466   if (!bfd_check_format (abfd, bfd_object))
467     {
468       warning (_("`%s': can't read symbols: %s."), oso->name,
469                bfd_errmsg (bfd_get_error ()));
470       gdb_bfd_unref (abfd);
471       return;
472     }
473
474   if (abfd->my_archive == NULL && oso->mtime != bfd_get_mtime (abfd))
475     {
476       warning (_("`%s': file time stamp mismatch."), oso->name);
477       gdb_bfd_unref (abfd);
478       return;
479     }
480
481   if (!bfd_hash_table_init_n (&table, macho_sym_hash_newfunc,
482                               sizeof (struct macho_sym_hash_entry),
483                               oso->nbr_syms))
484     {
485       warning (_("`%s': can't create hash table"), oso->name);
486       gdb_bfd_unref (abfd);
487       return;
488     }
489
490   bfd_set_cacheable (abfd, 1);
491
492   /* Read symbols table.  */
493   storage = bfd_get_symtab_upper_bound (abfd);
494   symbol_table = (asymbol **) xmalloc (storage);
495   bfd_canonicalize_symtab (abfd, symbol_table);
496
497   /* Init section flags.  */
498   nbr_sections = bfd_count_sections (abfd);
499   sections_rebased = (unsigned char *) alloca (nbr_sections);
500   for (i = 0; i < nbr_sections; i++)
501     sections_rebased[i] = 0;
502
503   /* Put symbols for the OSO file in the hash table.  */
504   for (symp = oso->oso_sym; symp != oso->end_sym; symp++)
505     {
506       const asymbol *sym = *symp;
507       bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
508
509       switch (mach_o_sym->n_type)
510         {
511         case N_ENSYM:
512         case N_BNSYM:
513         case N_GSYM:
514           sym = NULL;
515           break;
516         case N_FUN:
517           if (sym->name == NULL || sym->name[0] == 0)
518             sym = NULL;
519           break;
520         case N_STSYM:
521           break;
522         default:
523           sym = NULL;
524           break;
525         }
526       if (sym != NULL)
527         {
528           struct macho_sym_hash_entry *ent;
529
530           ent = (struct macho_sym_hash_entry *)
531             bfd_hash_lookup (&table, sym->name, TRUE, FALSE);
532           if (ent->sym != NULL)
533             complaint (&symfile_complaints,
534                        _("Duplicated symbol %s in symbol table"), sym->name);
535           else
536             {
537               if (mach_o_debug_level > 4)
538                 {
539                   struct gdbarch *arch = get_objfile_arch (main_objfile);
540                   printf_unfiltered
541                     (_("Adding symbol %s (addr: %s)\n"),
542                      sym->name, paddress (arch, sym->value));
543                 }
544               ent->sym = sym;
545             }
546         }
547     }
548
549   /* Relocate symbols of the OSO.  */
550   for (i = 0; symbol_table[i]; i++)
551     {
552       asymbol *sym = symbol_table[i];
553       bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
554
555       if (mach_o_sym->n_type & BFD_MACH_O_N_STAB)
556         continue;
557       if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF
558            && sym->value != 0)
559         {
560           /* For common symbol use the min symtab and modify the OSO
561              symbol table.  */
562           CORE_ADDR res;
563
564           res = macho_resolve_oso_sym_with_minsym (main_objfile, sym);
565           if (res != 0)
566             {
567               sym->section = bfd_com_section_ptr;
568               sym->value = res;
569             }
570         }
571       else if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
572         {
573           /* Normal symbol.  */
574           asection *sec = sym->section;
575           bfd_mach_o_section *msec;
576           unsigned int sec_type;
577
578           /* Skip buggy ones.  */
579           if (sec == NULL || sections_rebased[sec->index] != 0)
580             continue;
581
582           /* Only consider regular, non-debugging sections.  */
583           msec = bfd_mach_o_get_mach_o_section (sec);
584           sec_type = msec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
585           if ((sec_type == BFD_MACH_O_S_REGULAR
586                || sec_type == BFD_MACH_O_S_ZEROFILL)
587               && (msec->flags & BFD_MACH_O_S_ATTR_DEBUG) == 0)
588             {
589               CORE_ADDR addr = 0;
590
591               if ((mach_o_sym->n_type & BFD_MACH_O_N_EXT) != 0)
592                 {
593                   /* Use the min symtab for global symbols.  */
594                   addr = macho_resolve_oso_sym_with_minsym (main_objfile, sym);
595                 }
596               else
597                 {
598                   struct macho_sym_hash_entry *ent;
599
600                   ent = (struct macho_sym_hash_entry *)
601                     bfd_hash_lookup (&table, sym->name, FALSE, FALSE);
602                   if (ent != NULL)
603                     addr = bfd_asymbol_value (ent->sym);
604                 }
605
606               /* Adjust the section.  */
607               if (addr != 0)
608                 {
609                   CORE_ADDR res = addr - sym->value;
610
611                   if (mach_o_debug_level > 3)
612                     {
613                       struct gdbarch *arch = get_objfile_arch (main_objfile);
614                       printf_unfiltered
615                         (_("resolve sect %s with %s (set to %s)\n"),
616                          sec->name, sym->name,
617                          paddress (arch, res));
618                     }
619                   bfd_set_section_vma (abfd, sec, res);
620                   sections_rebased[sec->index] = 1;
621                 }
622             }
623           else
624             {
625               /* Mark the section as never rebased.  */
626               sections_rebased[sec->index] = 2;
627             }
628         }
629     }
630
631   bfd_hash_table_free (&table);
632
633   /* We need to clear SYMFILE_MAINLINE to avoid interractive question
634      from symfile.c:symbol_file_add_with_addrs_or_offsets.  */
635   cleanup = make_cleanup_bfd_unref (abfd);
636   symbol_file_add_from_bfd
637     (abfd, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), NULL,
638      main_objfile->flags & (OBJF_REORDERED | OBJF_SHARED
639                             | OBJF_READNOW | OBJF_USERLOADED),
640      main_objfile);
641   do_cleanups (cleanup);
642 }
643
644 /* Read symbols from the vector of oso files.  */
645
646 static void
647 macho_symfile_read_all_oso (struct objfile *main_objfile, int symfile_flags)
648 {
649   int ix;
650   VEC (oso_el) *vec;
651   oso_el *oso;
652   struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
653
654   vec = oso_vector;
655   oso_vector = NULL;
656
657   /* Sort oso by name so that files from libraries are gathered.  */
658   qsort (VEC_address (oso_el, vec), VEC_length (oso_el, vec),
659          sizeof (oso_el), oso_el_compare_name);
660
661   for (ix = 0; VEC_iterate (oso_el, vec, ix, oso);)
662     {
663       int pfx_len;
664
665       /* Check if this is a library name.  */
666       pfx_len = get_archive_prefix_len (oso->name);
667       if (pfx_len > 0)
668         {
669           bfd *archive_bfd;
670           bfd *member_bfd;
671           char *archive_name = XNEWVEC (char, pfx_len + 1);
672           int last_ix;
673           oso_el *oso2;
674           int ix2;
675
676           memcpy (archive_name, oso->name, pfx_len);
677           archive_name[pfx_len] = '\0';
678
679           make_cleanup (xfree, archive_name);
680
681           /* Compute number of oso for this archive.  */
682           for (last_ix = ix;
683                VEC_iterate (oso_el, vec, last_ix, oso2); last_ix++)
684             {
685               if (strncmp (oso2->name, archive_name, pfx_len) != 0)
686                 break;
687             }
688
689           /* Open the archive and check the format.  */
690           archive_bfd = gdb_bfd_open (archive_name, gnutarget, -1);
691           if (archive_bfd == NULL)
692             {
693               warning (_("Could not open OSO archive file \"%s\""),
694                        archive_name);
695               ix = last_ix;
696               continue;
697             }
698           if (!bfd_check_format (archive_bfd, bfd_archive))
699             {
700               warning (_("OSO archive file \"%s\" not an archive."),
701                        archive_name);
702               gdb_bfd_unref (archive_bfd);
703               ix = last_ix;
704               continue;
705             }
706
707           member_bfd = gdb_bfd_openr_next_archived_file (archive_bfd, NULL);
708
709           if (member_bfd == NULL)
710             {
711               warning (_("Could not read archive members out of "
712                          "OSO archive \"%s\""), archive_name);
713               gdb_bfd_unref (archive_bfd);
714               ix = last_ix;
715               continue;
716             }
717
718           /* Load all oso in this library.  */
719           while (member_bfd != NULL)
720             {
721               bfd *prev;
722               const char *member_name = member_bfd->filename;
723               int member_len = strlen (member_name);
724
725               /* If this member is referenced, add it as a symfile.  */
726               for (ix2 = ix; ix2 < last_ix; ix2++)
727                 {
728                   oso2 = VEC_index (oso_el, vec, ix2);
729
730                   if (oso2->name
731                       && strlen (oso2->name) == pfx_len + member_len + 2
732                       && !memcmp (member_name, oso2->name + pfx_len + 1,
733                                   member_len))
734                     {
735                       macho_add_oso_symfile (oso2, member_bfd,
736                                              main_objfile, symfile_flags);
737                       oso2->name = NULL;
738                       break;
739                     }
740                 }
741
742               prev = member_bfd;
743               member_bfd = gdb_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_open (oso->name, gnutarget, -1);
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   do_cleanups (cleanup);
777 }
778
779 /* DSYM (debug symbols) files contain the debug info of an executable.
780    This is a separate file created by dsymutil(1) and is similar to debug
781    link feature on ELF.
782    DSYM files are located in a subdirectory.  Append DSYM_SUFFIX to the
783    executable name and the executable base name to get the DSYM file name.  */
784 #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
785
786 /* Check if a dsym file exists for OBJFILE.  If so, returns a bfd for it.
787    Return NULL if no valid dsym file is found.  */
788
789 static bfd *
790 macho_check_dsym (struct objfile *objfile)
791 {
792   size_t name_len = strlen (objfile->name);
793   size_t dsym_len = strlen (DSYM_SUFFIX);
794   const char *base_name = lbasename (objfile->name);
795   size_t base_len = strlen (base_name);
796   char *dsym_filename = alloca (name_len + dsym_len + base_len + 1);
797   bfd *dsym_bfd;
798   bfd_mach_o_load_command *main_uuid;
799   bfd_mach_o_load_command *dsym_uuid;
800
801   strcpy (dsym_filename, objfile->name);
802   strcpy (dsym_filename + name_len, DSYM_SUFFIX);
803   strcpy (dsym_filename + name_len + dsym_len, base_name);
804
805   if (access (dsym_filename, R_OK) != 0)
806     return NULL;
807
808   if (bfd_mach_o_lookup_command (objfile->obfd,
809                                  BFD_MACH_O_LC_UUID, &main_uuid) == 0)
810     {
811       warning (_("can't find UUID in %s"), objfile->name);
812       return NULL;
813     }
814   dsym_bfd = gdb_bfd_openr (dsym_filename, gnutarget);
815   if (dsym_bfd == NULL)
816     {
817       warning (_("can't open dsym file %s"), dsym_filename);
818       return NULL;
819     }
820
821   if (!bfd_check_format (dsym_bfd, bfd_object))
822     {
823       gdb_bfd_unref (dsym_bfd);
824       warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
825       return NULL;
826     }
827
828   if (bfd_mach_o_lookup_command (dsym_bfd,
829                                  BFD_MACH_O_LC_UUID, &dsym_uuid) == 0)
830     {
831       warning (_("can't find UUID in %s"), dsym_filename);
832       gdb_bfd_unref (dsym_bfd);
833       return NULL;
834     }
835   if (memcmp (dsym_uuid->command.uuid.uuid, main_uuid->command.uuid.uuid,
836               sizeof (main_uuid->command.uuid.uuid)))
837     {
838       warning (_("dsym file UUID doesn't match the one in %s"), objfile->name);
839       gdb_bfd_unref (dsym_bfd);
840       return NULL;
841     }
842   return dsym_bfd;
843 }
844
845 static void
846 macho_symfile_read (struct objfile *objfile, int symfile_flags)
847 {
848   bfd *abfd = objfile->obfd;
849   CORE_ADDR offset;
850   long storage_needed;
851   bfd *dsym_bfd;
852
853   /* Get symbols from the symbol table only if the file is an executable.
854      The symbol table of object files is not relocated and is expected to
855      be in the executable.  */
856   if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
857     {
858       /* Process the normal symbol table first.  */
859       storage_needed = bfd_get_symtab_upper_bound (objfile->obfd);
860       if (storage_needed < 0)
861         error (_("Can't read symbols from %s: %s"),
862                bfd_get_filename (objfile->obfd),
863                bfd_errmsg (bfd_get_error ()));
864
865       if (storage_needed > 0)
866         {
867           asymbol **symbol_table;
868           long symcount;
869           struct cleanup *back_to;
870
871           symbol_table = (asymbol **) xmalloc (storage_needed);
872           make_cleanup (xfree, symbol_table);
873
874           init_minimal_symbol_collection ();
875           back_to = make_cleanup_discard_minimal_symbols ();
876
877           symcount = bfd_canonicalize_symtab (objfile->obfd, symbol_table);
878
879           if (symcount < 0)
880             error (_("Can't read symbols from %s: %s"),
881                    bfd_get_filename (objfile->obfd),
882                    bfd_errmsg (bfd_get_error ()));
883
884           macho_symtab_read (objfile, symcount, symbol_table);
885
886           install_minimal_symbols (objfile);
887           do_cleanups (back_to);
888         }
889
890       /* Try to read .eh_frame / .debug_frame.  */
891       /* First, locate these sections.  We ignore the result status
892          as it only checks for debug info.  */
893       dwarf2_has_info (objfile, NULL);
894       dwarf2_build_frame_info (objfile);
895
896       /* Check for DSYM file.  */
897       dsym_bfd = macho_check_dsym (objfile);
898       if (dsym_bfd != NULL)
899         {
900           int ix;
901           oso_el *oso;
902           struct bfd_section *asect, *dsect;
903           struct cleanup *cleanup;
904
905           if (mach_o_debug_level > 0)
906             printf_unfiltered (_("dsym file found\n"));
907
908           /* Remove oso.  They won't be used.  */
909           VEC_free (oso_el, oso_vector);
910           oso_vector = NULL;
911
912           /* Set dsym section size.  */
913           for (asect = objfile->obfd->sections, dsect = dsym_bfd->sections;
914                asect && dsect;
915                asect = asect->next, dsect = dsect->next)
916             {
917               if (strcmp (asect->name, dsect->name) != 0)
918                 break;
919               bfd_set_section_size (dsym_bfd, dsect,
920                                     bfd_get_section_size (asect));
921             }
922
923           /* Add the dsym file as a separate file.  */
924           cleanup = make_cleanup_bfd_unref (dsym_bfd);
925           symbol_file_add_separate (dsym_bfd, symfile_flags, objfile);
926           do_cleanups (cleanup);
927
928           /* Don't try to read dwarf2 from main file or shared libraries.  */
929           return;
930         }
931     }
932
933   if (dwarf2_has_info (objfile, NULL))
934     {
935       /* DWARF 2 sections */
936       dwarf2_build_psymtabs (objfile);
937     }
938
939   /* Then the oso.  */
940   if (oso_vector != NULL)
941     macho_symfile_read_all_oso (objfile, symfile_flags);
942 }
943
944 static bfd_byte *
945 macho_symfile_relocate (struct objfile *objfile, asection *sectp,
946                         bfd_byte *buf)
947 {
948   bfd *abfd = objfile->obfd;
949
950   /* We're only interested in sections with relocation
951      information.  */
952   if ((sectp->flags & SEC_RELOC) == 0)
953     return NULL;
954
955   if (mach_o_debug_level > 0)
956     printf_unfiltered (_("Relocate section '%s' of %s\n"),
957                        sectp->name, objfile->name);
958
959   return bfd_simple_get_relocated_section_contents (abfd, sectp, buf, NULL);
960 }
961
962 static void
963 macho_symfile_finish (struct objfile *objfile)
964 {
965 }
966
967 static void
968 macho_symfile_offsets (struct objfile *objfile,
969                        struct section_addr_info *addrs)
970 {
971   unsigned int i;
972   unsigned int num_sections;
973   struct obj_section *osect;
974
975   /* Allocate section_offsets.  */
976   objfile->num_sections = bfd_count_sections (objfile->obfd);
977   objfile->section_offsets = (struct section_offsets *)
978     obstack_alloc (&objfile->objfile_obstack,
979                    SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
980   memset (objfile->section_offsets, 0,
981           SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
982
983   /* This code is run when we first add the objfile with
984      symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
985      passed in.  The place in symfile.c where the addrs are applied
986      depends on the addrs having section names.  But in the dyld code
987      we build an anonymous array of addrs, so that code is a no-op.
988      Because of that, we have to apply the addrs to the sections here.
989      N.B. if an objfile slides after we've already created it, then it
990      goes through objfile_relocate.  */
991
992   for (i = 0; i < addrs->num_sections; i++)
993     {
994       if (addrs->other[i].name == NULL)
995         continue;
996
997       ALL_OBJFILE_OSECTIONS (objfile, osect)
998         {
999           const char *bfd_sect_name = osect->the_bfd_section->name;
1000
1001           if (strcmp (bfd_sect_name, addrs->other[i].name) == 0)
1002             {
1003               obj_section_offset (osect) = addrs->other[i].addr;
1004               break;
1005             }
1006         }
1007     }
1008
1009   objfile->sect_index_text = 0;
1010
1011   ALL_OBJFILE_OSECTIONS (objfile, osect)
1012     {
1013       const char *bfd_sect_name = osect->the_bfd_section->name;
1014       int sect_index = osect->the_bfd_section->index;
1015
1016       if (strncmp (bfd_sect_name, "LC_SEGMENT.", 11) == 0)
1017         bfd_sect_name += 11;
1018       if (strcmp (bfd_sect_name, "__TEXT") == 0
1019           || strcmp (bfd_sect_name, "__TEXT.__text") == 0)
1020         objfile->sect_index_text = sect_index;
1021     }
1022 }
1023
1024 static const struct sym_fns macho_sym_fns = {
1025   bfd_target_mach_o_flavour,
1026
1027   macho_new_init,               /* init anything gbl to entire symtab */
1028   macho_symfile_init,           /* read initial info, setup for sym_read() */
1029   macho_symfile_read,           /* read a symbol file into symtab */
1030   NULL,                         /* sym_read_psymbols */
1031   macho_symfile_finish,         /* finished with file, cleanup */
1032   macho_symfile_offsets,        /* xlate external to internal form */
1033   default_symfile_segments,     /* Get segment information from a file.  */
1034   NULL,
1035   macho_symfile_relocate,       /* Relocate a debug section.  */
1036   NULL,                         /* sym_get_probes */
1037   &psym_functions
1038 };
1039
1040 /* -Wmissing-prototypes */
1041 extern initialize_file_ftype _initialize_machoread;
1042
1043 void
1044 _initialize_machoread ()
1045 {
1046   add_symtab_fns (&macho_sym_fns);
1047
1048   add_setshow_zuinteger_cmd ("mach-o", class_obscure,
1049                              &mach_o_debug_level,
1050                              _("Set if printing Mach-O symbols processing."),
1051                              _("Show if printing Mach-O symbols processing."),
1052                              NULL, NULL, NULL,
1053                              &setdebuglist, &showdebuglist);
1054 }