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