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