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