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