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