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