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