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