2012-07-19 Pedro Alves <palves@redhat.com>
[deliverable/binutils-gdb.git] / gdb / machoread.c
CommitLineData
a80b95ba 1/* Darwin support for GDB, the GNU debugger.
0b302171 2 Copyright (C) 2008-2012 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. */
45dfa85a 129 if (sym->section != bfd_abs_section_ptr
e4c5f296
TG
130 && !(sym->section->flags & SEC_THREAD_LOCAL))
131 symaddr += offset;
132
45dfa85a 133 if (sym->section == bfd_abs_section_ptr)
e4c5f296
TG
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;
b0d32fb6 183 unsigned int nbr_syms = 0;
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 {
13b8d0c6
TG
232 if (mach_o_sym->n_type == N_OPT)
233 {
234 /* No complaint for OPT. */
235 break;
236 }
237
e4c5f296
TG
238 /* Debugging symbols are not expected here. */
239 complaint (&symfile_complaints,
13b8d0c6
TG
240 _("%s: Unexpected debug stab outside SO markers"),
241 objfile->name);
e4c5f296
TG
242 }
243 else
244 {
245 /* Non-debugging symbols go to the minimal symbol table. */
246 macho_symtab_add_minsym (objfile, sym);
247 }
248 break;
a80b95ba 249
e4c5f296
TG
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;
a80b95ba 292
e4c5f296
TG
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 }
a80b95ba
TG
347 }
348
e4c5f296
TG
349 if (state != S_NO_SO)
350 complaint (&symfile_complaints, _("missing nul SO"));
a80b95ba
TG
351}
352
353/* If NAME describes an archive member (ie: ARCHIVE '(' MEMBER ')'),
354 returns the length of the archive name.
355 Returns -1 otherwise. */
f192ea96 356
a80b95ba
TG
357static int
358get_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;
e4c5f296 365
a80b95ba
TG
366 lparen = strrchr (name, '(');
367 if (lparen == NULL || lparen == name)
368 return -1;
369 return lparen - name;
370}
371
e4c5f296
TG
372/* Compare function to qsort OSOs, so that members of a library are
373 gathered. */
374
f192ea96
TG
375static int
376oso_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
e4c5f296
TG
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. */
38947cca 386
e4c5f296
TG
387struct macho_sym_hash_entry
388{
389 struct bfd_hash_entry base;
390 const asymbol *sym;
391};
38947cca 392
e4c5f296 393/* Routine to create an entry in the hash table. */
38947cca 394
e4c5f296
TG
395static struct bfd_hash_entry *
396macho_sym_hash_newfunc (struct bfd_hash_entry *entry,
397 struct bfd_hash_table *table,
398 const char *string)
38947cca 399{
e4c5f296
TG
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;
38947cca 409
e4c5f296
TG
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);
38947cca 413
e4c5f296 414 if (ret)
38947cca 415 {
e4c5f296
TG
416 /* Initialize the local fields. */
417 ret->sym = NULL;
418 }
38947cca 419
e4c5f296
TG
420 return (struct bfd_hash_entry *) ret;
421}
38947cca 422
e4c5f296
TG
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. */
38947cca 425
e4c5f296
TG
426static CORE_ADDR
427macho_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;
38947cca 440 }
e4c5f296
TG
441 else
442 return SYMBOL_VALUE_ADDRESS (msym);
38947cca
JB
443}
444
e4c5f296 445/* Add oso file OSO/ABFD as a symbol file. */
f192ea96
TG
446
447static void
bdfed3bc
TG
448macho_add_oso_symfile (oso_el *oso, bfd *abfd,
449 struct objfile *main_objfile, int symfile_flags)
f192ea96 450{
e4c5f296 451 int storage;
f192ea96 452 int i;
e4c5f296
TG
453 asymbol **symbol_table;
454 asymbol **symp;
455 struct bfd_hash_table table;
456 int nbr_sections;
457
458 /* Per section flag to mark which section have been rebased. */
459 unsigned char *sections_rebased;
f192ea96
TG
460
461 if (mach_o_debug_level > 0)
e4c5f296
TG
462 printf_unfiltered
463 (_("Loading debugging symbols from oso: %s\n"), oso->name);
2d33f7b8 464
f192ea96
TG
465 if (!bfd_check_format (abfd, bfd_object))
466 {
467 warning (_("`%s': can't read symbols: %s."), oso->name,
468 bfd_errmsg (bfd_get_error ()));
cbb099e8 469 gdb_bfd_unref (abfd);
f192ea96
TG
470 return;
471 }
472
e4c5f296
TG
473 if (abfd->my_archive == NULL && oso->mtime != bfd_get_mtime (abfd))
474 {
475 warning (_("`%s': file time stamp mismatch."), oso->name);
cbb099e8 476 gdb_bfd_unref (abfd);
e4c5f296
TG
477 return;
478 }
479
480 if (!bfd_hash_table_init_n (&table, macho_sym_hash_newfunc,
481 sizeof (struct macho_sym_hash_entry),
482 oso->nbr_syms))
483 {
484 warning (_("`%s': can't create hash table"), oso->name);
cbb099e8 485 gdb_bfd_unref (abfd);
e4c5f296
TG
486 return;
487 }
488
f192ea96 489 bfd_set_cacheable (abfd, 1);
f18b4cab 490
e4c5f296
TG
491 /* Read symbols table. */
492 storage = bfd_get_symtab_upper_bound (abfd);
493 symbol_table = (asymbol **) xmalloc (storage);
494 bfd_canonicalize_symtab (abfd, symbol_table);
f192ea96 495
e4c5f296
TG
496 /* Init section flags. */
497 nbr_sections = bfd_count_sections (abfd);
498 sections_rebased = (unsigned char *) alloca (nbr_sections);
499 for (i = 0; i < nbr_sections; i++)
500 sections_rebased[i] = 0;
f192ea96 501
e4c5f296
TG
502 /* Put symbols for the OSO file in the hash table. */
503 for (symp = oso->oso_sym; symp != oso->end_sym; symp++)
f192ea96 504 {
e4c5f296
TG
505 const asymbol *sym = *symp;
506 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
f18b4cab 507
e4c5f296 508 switch (mach_o_sym->n_type)
f18b4cab 509 {
e4c5f296
TG
510 case N_ENSYM:
511 case N_BNSYM:
512 case N_GSYM:
513 sym = NULL;
514 break;
515 case N_FUN:
516 if (sym->name == NULL || sym->name[0] == 0)
517 sym = NULL;
518 break;
519 case N_STSYM:
520 break;
521 default:
522 sym = NULL;
523 break;
524 }
525 if (sym != NULL)
526 {
527 struct macho_sym_hash_entry *ent;
528
529 ent = (struct macho_sym_hash_entry *)
530 bfd_hash_lookup (&table, sym->name, TRUE, FALSE);
531 if (ent->sym != NULL)
532 complaint (&symfile_complaints,
533 _("Duplicated symbol %s in symbol table"), sym->name);
534 else
f18b4cab 535 {
e4c5f296
TG
536 if (mach_o_debug_level > 4)
537 {
538 struct gdbarch *arch = get_objfile_arch (main_objfile);
539 printf_unfiltered
540 (_("Adding symbol %s (addr: %s)\n"),
541 sym->name, paddress (arch, sym->value));
542 }
543 ent->sym = sym;
f18b4cab 544 }
f18b4cab 545 }
e4c5f296 546 }
f18b4cab 547
e4c5f296
TG
548 /* Relocate symbols of the OSO. */
549 for (i = 0; symbol_table[i]; i++)
550 {
551 asymbol *sym = symbol_table[i];
552 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
553
554 if (mach_o_sym->n_type & BFD_MACH_O_N_STAB)
555 continue;
556 if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF
557 && sym->value != 0)
f18b4cab 558 {
e4c5f296
TG
559 /* For common symbol use the min symtab and modify the OSO
560 symbol table. */
561 CORE_ADDR res;
562
563 res = macho_resolve_oso_sym_with_minsym (main_objfile, sym);
564 if (res != 0)
565 {
45dfa85a 566 sym->section = bfd_com_section_ptr;
e4c5f296
TG
567 sym->value = res;
568 }
f18b4cab 569 }
e4c5f296
TG
570 else if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
571 {
572 /* Normal symbol. */
573 asection *sec = sym->section;
574 bfd_mach_o_section *msec;
575 unsigned int sec_type;
576
577 /* Skip buggy ones. */
578 if (sec == NULL || sections_rebased[sec->index] != 0)
579 continue;
580
581 /* Only consider regular, non-debugging sections. */
582 msec = bfd_mach_o_get_mach_o_section (sec);
583 sec_type = msec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
584 if ((sec_type == BFD_MACH_O_S_REGULAR
585 || sec_type == BFD_MACH_O_S_ZEROFILL)
586 && (msec->flags & BFD_MACH_O_S_ATTR_DEBUG) == 0)
587 {
588 CORE_ADDR addr = 0;
589
590 if ((mach_o_sym->n_type & BFD_MACH_O_N_EXT) != 0)
591 {
592 /* Use the min symtab for global symbols. */
593 addr = macho_resolve_oso_sym_with_minsym (main_objfile, sym);
594 }
595 else
596 {
597 struct macho_sym_hash_entry *ent;
598
599 ent = (struct macho_sym_hash_entry *)
600 bfd_hash_lookup (&table, sym->name, FALSE, FALSE);
601 if (ent != NULL)
602 addr = bfd_asymbol_value (ent->sym);
603 }
f18b4cab 604
e4c5f296
TG
605 /* Adjust the section. */
606 if (addr != 0)
607 {
608 CORE_ADDR res = addr - sym->value;
609
610 if (mach_o_debug_level > 3)
611 {
612 struct gdbarch *arch = get_objfile_arch (main_objfile);
613 printf_unfiltered
614 (_("resolve sect %s with %s (set to %s)\n"),
615 sec->name, sym->name,
616 paddress (arch, res));
617 }
618 bfd_set_section_vma (abfd, sec, res);
619 sections_rebased[sec->index] = 1;
620 }
621 }
622 else
623 {
624 /* Mark the section as never rebased. */
625 sections_rebased[sec->index] = 2;
626 }
627 }
f192ea96
TG
628 }
629
e4c5f296 630 bfd_hash_table_free (&table);
38947cca 631
a4453b7e
TT
632 /* Make sure that the filename has the correct lifetime. The
633 current filename comes either from an OSO symbol name or from an
634 archive name. Memory for both is not managed by gdb. */
635 gdb_bfd_stash_filename (abfd);
bdfed3bc
TG
636
637 /* We need to clear SYMFILE_MAINLINE to avoid interractive question
638 from symfile.c:symbol_file_add_with_addrs_or_offsets. */
e4c5f296 639 symbol_file_add_from_bfd
f18b4cab 640 (abfd, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), NULL,
bdfed3bc 641 main_objfile->flags & (OBJF_REORDERED | OBJF_SHARED
63524580
JK
642 | OBJF_READNOW | OBJF_USERLOADED),
643 main_objfile);
f192ea96
TG
644}
645
a80b95ba 646/* Read symbols from the vector of oso files. */
f192ea96 647
a80b95ba 648static void
2d33f7b8 649macho_symfile_read_all_oso (struct objfile *main_objfile, int symfile_flags)
a80b95ba
TG
650{
651 int ix;
652 VEC (oso_el) *vec;
653 oso_el *oso;
a4453b7e 654 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
a80b95ba
TG
655
656 vec = oso_vector;
657 oso_vector = NULL;
e4c5f296 658
f192ea96
TG
659 /* Sort oso by name so that files from libraries are gathered. */
660 qsort (VEC_address (oso_el, vec), VEC_length (oso_el, vec),
661 sizeof (oso_el), oso_el_compare_name);
a80b95ba 662
f192ea96 663 for (ix = 0; VEC_iterate (oso_el, vec, ix, oso);)
a80b95ba 664 {
a80b95ba 665 int pfx_len;
e4c5f296 666
a80b95ba
TG
667 /* Check if this is a library name. */
668 pfx_len = get_archive_prefix_len (oso->name);
669 if (pfx_len > 0)
670 {
671 bfd *archive_bfd;
672 bfd *member_bfd;
f192ea96
TG
673 char *archive_name = XNEWVEC (char, pfx_len + 1);
674 int last_ix;
675 oso_el *oso2;
676 int ix2;
a80b95ba 677
a80b95ba
TG
678 memcpy (archive_name, oso->name, pfx_len);
679 archive_name[pfx_len] = '\0';
680
a4453b7e
TT
681 make_cleanup (xfree, archive_name);
682
f192ea96
TG
683 /* Compute number of oso for this archive. */
684 for (last_ix = ix;
685 VEC_iterate (oso_el, vec, last_ix, oso2); last_ix++)
686 {
687 if (strncmp (oso2->name, archive_name, pfx_len) != 0)
688 break;
689 }
e4c5f296 690
a80b95ba 691 /* Open the archive and check the format. */
cbb099e8 692 archive_bfd = gdb_bfd_ref (bfd_openr (archive_name, gnutarget));
a80b95ba
TG
693 if (archive_bfd == NULL)
694 {
695 warning (_("Could not open OSO archive file \"%s\""),
696 archive_name);
f192ea96 697 ix = last_ix;
a80b95ba
TG
698 continue;
699 }
700 if (!bfd_check_format (archive_bfd, bfd_archive))
701 {
702 warning (_("OSO archive file \"%s\" not an archive."),
703 archive_name);
cbb099e8 704 gdb_bfd_unref (archive_bfd);
f192ea96 705 ix = last_ix;
a80b95ba
TG
706 continue;
707 }
a4453b7e
TT
708
709 gdb_bfd_stash_filename (archive_bfd);
710
cbb099e8
TT
711 member_bfd = gdb_bfd_ref (bfd_openr_next_archived_file (archive_bfd,
712 NULL));
e4c5f296 713
a80b95ba
TG
714 if (member_bfd == NULL)
715 {
716 warning (_("Could not read archive members out of "
717 "OSO archive \"%s\""), archive_name);
cbb099e8 718 gdb_bfd_unref (archive_bfd);
f192ea96 719 ix = last_ix;
a80b95ba
TG
720 continue;
721 }
f192ea96
TG
722
723 /* Load all oso in this library. */
a80b95ba
TG
724 while (member_bfd != NULL)
725 {
f192ea96 726 bfd *prev;
a80b95ba 727 const char *member_name = member_bfd->filename;
f192ea96
TG
728 int member_len = strlen (member_name);
729
ab7e10a0 730 /* If this member is referenced, add it as a symfile. */
f192ea96
TG
731 for (ix2 = ix; ix2 < last_ix; ix2++)
732 {
733 oso2 = VEC_index (oso_el, vec, ix2);
734
735 if (oso2->name
736 && strlen (oso2->name) == pfx_len + member_len + 2
737 && !memcmp (member_name, oso2->name + pfx_len + 1,
738 member_len))
739 {
bdfed3bc
TG
740 macho_add_oso_symfile (oso2, member_bfd,
741 main_objfile, symfile_flags);
f192ea96
TG
742 oso2->name = NULL;
743 break;
744 }
745 }
746
747 prev = member_bfd;
cbb099e8
TT
748 member_bfd
749 = gdb_bfd_ref (bfd_openr_next_archived_file (archive_bfd,
750 member_bfd));
ab7e10a0
TG
751
752 /* Free previous member if not referenced by an oso. */
753 if (ix2 >= last_ix)
cbb099e8 754 gdb_bfd_unref (prev);
a80b95ba 755 }
f192ea96
TG
756 for (ix2 = ix; ix2 < last_ix; ix2++)
757 {
758 oso_el *oso2 = VEC_index (oso_el, vec, ix2);
759
760 if (oso2->name != NULL)
761 warning (_("Could not find specified archive member "
762 "for OSO name \"%s\""), oso->name);
763 }
764 ix = last_ix;
a80b95ba
TG
765 }
766 else
767 {
f192ea96 768 bfd *abfd;
a80b95ba 769
cbb099e8 770 abfd = gdb_bfd_ref (bfd_openr (oso->name, gnutarget));
a80b95ba 771 if (!abfd)
f192ea96
TG
772 warning (_("`%s': can't open to read symbols: %s."), oso->name,
773 bfd_errmsg (bfd_get_error ()));
774 else
bdfed3bc 775 macho_add_oso_symfile (oso, abfd, main_objfile, symfile_flags);
f192ea96
TG
776
777 ix++;
778 }
779 }
780
a80b95ba 781 VEC_free (oso_el, vec);
a4453b7e 782 do_cleanups (cleanup);
a80b95ba
TG
783}
784
785/* DSYM (debug symbols) files contain the debug info of an executable.
786 This is a separate file created by dsymutil(1) and is similar to debug
787 link feature on ELF.
788 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the
789 executable name and the executable base name to get the DSYM file name. */
790#define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
791
792/* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it.
793 Return NULL if no valid dsym file is found. */
f192ea96 794
a80b95ba
TG
795static bfd *
796macho_check_dsym (struct objfile *objfile)
797{
798 size_t name_len = strlen (objfile->name);
799 size_t dsym_len = strlen (DSYM_SUFFIX);
800 const char *base_name = lbasename (objfile->name);
801 size_t base_len = strlen (base_name);
802 char *dsym_filename = alloca (name_len + dsym_len + base_len + 1);
803 bfd *dsym_bfd;
65ccb109
TG
804 bfd_mach_o_load_command *main_uuid;
805 bfd_mach_o_load_command *dsym_uuid;
a80b95ba
TG
806
807 strcpy (dsym_filename, objfile->name);
808 strcpy (dsym_filename + name_len, DSYM_SUFFIX);
809 strcpy (dsym_filename + name_len + dsym_len, base_name);
810
811 if (access (dsym_filename, R_OK) != 0)
812 return NULL;
813
65ccb109
TG
814 if (bfd_mach_o_lookup_command (objfile->obfd,
815 BFD_MACH_O_LC_UUID, &main_uuid) == 0)
a80b95ba
TG
816 {
817 warning (_("can't find UUID in %s"), objfile->name);
818 return NULL;
819 }
cbb099e8 820 dsym_bfd = gdb_bfd_ref (bfd_openr (dsym_filename, gnutarget));
a80b95ba
TG
821 if (dsym_bfd == NULL)
822 {
823 warning (_("can't open dsym file %s"), dsym_filename);
a80b95ba
TG
824 return NULL;
825 }
a4453b7e 826 gdb_bfd_stash_filename (dsym_filename);
a80b95ba
TG
827
828 if (!bfd_check_format (dsym_bfd, bfd_object))
829 {
cbb099e8 830 gdb_bfd_unref (dsym_bfd);
a80b95ba 831 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
a80b95ba
TG
832 return NULL;
833 }
834
65ccb109
TG
835 if (bfd_mach_o_lookup_command (dsym_bfd,
836 BFD_MACH_O_LC_UUID, &dsym_uuid) == 0)
a80b95ba
TG
837 {
838 warning (_("can't find UUID in %s"), dsym_filename);
cbb099e8 839 gdb_bfd_unref (dsym_bfd);
a80b95ba
TG
840 return NULL;
841 }
65ccb109
TG
842 if (memcmp (dsym_uuid->command.uuid.uuid, main_uuid->command.uuid.uuid,
843 sizeof (main_uuid->command.uuid.uuid)))
a80b95ba
TG
844 {
845 warning (_("dsym file UUID doesn't match the one in %s"), objfile->name);
cbb099e8 846 gdb_bfd_unref (dsym_bfd);
a80b95ba
TG
847 return NULL;
848 }
849 return dsym_bfd;
a80b95ba
TG
850}
851
852static void
f4352531 853macho_symfile_read (struct objfile *objfile, int symfile_flags)
a80b95ba
TG
854{
855 bfd *abfd = objfile->obfd;
a80b95ba
TG
856 CORE_ADDR offset;
857 long storage_needed;
858 bfd *dsym_bfd;
859
a80b95ba
TG
860 /* Get symbols from the symbol table only if the file is an executable.
861 The symbol table of object files is not relocated and is expected to
862 be in the executable. */
cf1061c0 863 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
a80b95ba
TG
864 {
865 /* Process the normal symbol table first. */
866 storage_needed = bfd_get_symtab_upper_bound (objfile->obfd);
867 if (storage_needed < 0)
868 error (_("Can't read symbols from %s: %s"),
869 bfd_get_filename (objfile->obfd),
870 bfd_errmsg (bfd_get_error ()));
871
872 if (storage_needed > 0)
873 {
874 asymbol **symbol_table;
875 long symcount;
e4c5f296 876 struct cleanup *back_to;
a80b95ba
TG
877
878 symbol_table = (asymbol **) xmalloc (storage_needed);
879 make_cleanup (xfree, symbol_table);
e4c5f296
TG
880
881 init_minimal_symbol_collection ();
882 back_to = make_cleanup_discard_minimal_symbols ();
883
a80b95ba 884 symcount = bfd_canonicalize_symtab (objfile->obfd, symbol_table);
e4c5f296 885
a80b95ba
TG
886 if (symcount < 0)
887 error (_("Can't read symbols from %s: %s"),
888 bfd_get_filename (objfile->obfd),
889 bfd_errmsg (bfd_get_error ()));
e4c5f296 890
a80b95ba 891 macho_symtab_read (objfile, symcount, symbol_table);
e4c5f296
TG
892
893 install_minimal_symbols (objfile);
894 do_cleanups (back_to);
a80b95ba 895 }
a80b95ba 896
cf1061c0
TG
897 /* Try to read .eh_frame / .debug_frame. */
898 /* First, locate these sections. We ignore the result status
899 as it only checks for debug info. */
251d32d9 900 dwarf2_has_info (objfile, NULL);
cf1061c0 901 dwarf2_build_frame_info (objfile);
e4c5f296 902
a80b95ba
TG
903 /* Check for DSYM file. */
904 dsym_bfd = macho_check_dsym (objfile);
905 if (dsym_bfd != NULL)
906 {
907 int ix;
908 oso_el *oso;
6414f3fd 909 struct bfd_section *asect, *dsect;
a80b95ba
TG
910
911 if (mach_o_debug_level > 0)
912 printf_unfiltered (_("dsym file found\n"));
913
914 /* Remove oso. They won't be used. */
a80b95ba
TG
915 VEC_free (oso_el, oso_vector);
916 oso_vector = NULL;
917
6414f3fd
TG
918 /* Set dsym section size. */
919 for (asect = objfile->obfd->sections, dsect = dsym_bfd->sections;
920 asect && dsect;
921 asect = asect->next, dsect = dsect->next)
922 {
923 if (strcmp (asect->name, dsect->name) != 0)
924 break;
925 bfd_set_section_size (dsym_bfd, dsect,
926 bfd_get_section_size (asect));
927 }
928
2480cfa0
TG
929 /* Add the dsym file as a separate file. */
930 symbol_file_add_separate (dsym_bfd, symfile_flags, objfile);
e4c5f296 931
cf1061c0 932 /* Don't try to read dwarf2 from main file or shared libraries. */
2480cfa0 933 return;
a80b95ba
TG
934 }
935 }
936
251d32d9 937 if (dwarf2_has_info (objfile, NULL))
a80b95ba
TG
938 {
939 /* DWARF 2 sections */
f29dff0a 940 dwarf2_build_psymtabs (objfile);
a80b95ba
TG
941 }
942
a80b95ba
TG
943 /* Then the oso. */
944 if (oso_vector != NULL)
2d33f7b8 945 macho_symfile_read_all_oso (objfile, symfile_flags);
a80b95ba
TG
946}
947
f18b4cab
TG
948static bfd_byte *
949macho_symfile_relocate (struct objfile *objfile, asection *sectp,
950 bfd_byte *buf)
951{
952 bfd *abfd = objfile->obfd;
953
954 /* We're only interested in sections with relocation
955 information. */
956 if ((sectp->flags & SEC_RELOC) == 0)
957 return NULL;
958
959 if (mach_o_debug_level > 0)
960 printf_unfiltered (_("Relocate section '%s' of %s\n"),
961 sectp->name, objfile->name);
962
f18b4cab
TG
963 return bfd_simple_get_relocated_section_contents (abfd, sectp, buf, NULL);
964}
965
a80b95ba
TG
966static void
967macho_symfile_finish (struct objfile *objfile)
968{
969}
970
971static void
972macho_symfile_offsets (struct objfile *objfile,
973 struct section_addr_info *addrs)
974{
975 unsigned int i;
976 unsigned int num_sections;
977 struct obj_section *osect;
978
979 /* Allocate section_offsets. */
980 objfile->num_sections = bfd_count_sections (objfile->obfd);
981 objfile->section_offsets = (struct section_offsets *)
982 obstack_alloc (&objfile->objfile_obstack,
983 SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
984 memset (objfile->section_offsets, 0,
985 SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
986
987 /* This code is run when we first add the objfile with
988 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
989 passed in. The place in symfile.c where the addrs are applied
990 depends on the addrs having section names. But in the dyld code
991 we build an anonymous array of addrs, so that code is a no-op.
992 Because of that, we have to apply the addrs to the sections here.
993 N.B. if an objfile slides after we've already created it, then it
994 goes through objfile_relocate. */
995
996 for (i = 0; i < addrs->num_sections; i++)
997 {
998 if (addrs->other[i].name == NULL)
999 continue;
1000
1001 ALL_OBJFILE_OSECTIONS (objfile, osect)
1002 {
1003 const char *bfd_sect_name = osect->the_bfd_section->name;
1004
1005 if (strcmp (bfd_sect_name, addrs->other[i].name) == 0)
1006 {
1007 obj_section_offset (osect) = addrs->other[i].addr;
1008 break;
1009 }
1010 }
1011 }
1012
1013 objfile->sect_index_text = 0;
1014
1015 ALL_OBJFILE_OSECTIONS (objfile, osect)
1016 {
1017 const char *bfd_sect_name = osect->the_bfd_section->name;
1018 int sect_index = osect->the_bfd_section->index;
e4c5f296 1019
cf1061c0
TG
1020 if (strncmp (bfd_sect_name, "LC_SEGMENT.", 11) == 0)
1021 bfd_sect_name += 11;
1022 if (strcmp (bfd_sect_name, "__TEXT") == 0
1023 || strcmp (bfd_sect_name, "__TEXT.__text") == 0)
a80b95ba
TG
1024 objfile->sect_index_text = sect_index;
1025 }
1026}
1027
00b5771c 1028static const struct sym_fns macho_sym_fns = {
a80b95ba
TG
1029 bfd_target_mach_o_flavour,
1030
3e43a32a
MS
1031 macho_new_init, /* init anything gbl to entire symtab */
1032 macho_symfile_init, /* read initial info, setup for sym_read() */
1033 macho_symfile_read, /* read a symbol file into symtab */
b11896a5 1034 NULL, /* sym_read_psymbols */
3e43a32a
MS
1035 macho_symfile_finish, /* finished with file, cleanup */
1036 macho_symfile_offsets, /* xlate external to internal form */
1037 default_symfile_segments, /* Get segment information from a file. */
1038 NULL,
1039 macho_symfile_relocate, /* Relocate a debug section. */
55aa24fb 1040 NULL, /* sym_get_probes */
00b5771c 1041 &psym_functions
a80b95ba
TG
1042};
1043
c381a3f6
JB
1044/* -Wmissing-prototypes */
1045extern initialize_file_ftype _initialize_machoread;
1046
a80b95ba
TG
1047void
1048_initialize_machoread ()
1049{
1050 add_symtab_fns (&macho_sym_fns);
1051
1052 add_setshow_zinteger_cmd ("mach-o", class_obscure,
3e43a32a
MS
1053 &mach_o_debug_level,
1054 _("Set if printing Mach-O symbols processing."),
1055 _("Show if printing Mach-O symbols processing."),
1056 NULL, NULL, NULL,
a80b95ba
TG
1057 &setdebuglist, &showdebuglist);
1058}
This page took 0.439898 seconds and 4 git commands to generate.