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