2009-12-15 Tristan Gingold <gingold@adacore.com>
[deliverable/binutils-gdb.git] / gdb / machoread.c
CommitLineData
a80b95ba 1/* Darwin support for GDB, the GNU debugger.
0fb0cc75 2 Copyright (C) 2008, 2009 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
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22#include "defs.h"
23#include "symtab.h"
24#include "gdbtypes.h"
25#include "bfd.h"
26#include "symfile.h"
27#include "objfiles.h"
28#include "buildsym.h"
29#include "gdbcmd.h"
30#include "gdbcore.h"
31#include "mach-o.h"
32#include "gdb_assert.h"
33#include "aout/stab_gnu.h"
34#include "vec.h"
35
36#include <string.h>
37
38/* If non-zero displays debugging message. */
39static int mach_o_debug_level = 0;
40
41static void
42macho_new_init (struct objfile *objfile)
43{
44}
45
46static void
47macho_symfile_init (struct objfile *objfile)
48{
49 objfile->flags |= OBJF_REORDERED;
50 init_entry_point_info (objfile);
51}
52
53/* Dwarf debugging information are never in the final executable. They stay
54 in object files and the executable contains the list of object files read
55 during the link.
56 Each time an oso (other source) is found in the executable, the reader
57 creates such a structure. They are read after the processing of the
58 executable.
59*/
60typedef struct oso_el
61{
62 /* Object file name. */
63 const char *name;
64
65 /* Associated time stamp. */
66 unsigned long mtime;
67
68 /* Number of sections. This is the length of SYMBOLS and OFFSETS array. */
69 int num_sections;
70
71 /* Each seaction of the object file is represented by a symbol and its
3188d986
TG
72 offset. If the offset is 0, we assume that the symbol is at offset 0
73 in the OSO object file and a symbol lookup in the main file is
74 required to get the offset. */
a80b95ba
TG
75 asymbol **symbols;
76 bfd_vma *offsets;
77}
78oso_el;
79
80/* Vector of object files to be read after the executable. */
81DEF_VEC_O (oso_el);
82static VEC (oso_el) *oso_vector;
83
84/* Add a new OSO to the vector. */
f192ea96 85
a80b95ba
TG
86static void
87macho_add_oso (const asymbol *oso_sym, int nbr_sections,
88 asymbol **symbols, bfd_vma *offsets)
89{
90 oso_el el;
91
92 el.name = oso_sym->name;
93 el.mtime = oso_sym->value;
94 el.num_sections = nbr_sections;
95 el.symbols = symbols;
96 el.offsets = offsets;
97 VEC_safe_push (oso_el, oso_vector, &el);
98}
99
100/* Build the minimal symbol table from SYMBOL_TABLE of length
101 NUMBER_OF_SYMBOLS for OBJFILE.
102 Read OSO files at the end. */
f192ea96 103
a80b95ba
TG
104static void
105macho_symtab_read (struct objfile *objfile,
106 long number_of_symbols, asymbol **symbol_table)
107{
108 struct gdbarch *gdbarch = get_objfile_arch (objfile);
109 long storage_needed;
a80b95ba
TG
110 long i, j;
111 CORE_ADDR offset;
112 enum minimal_symbol_type ms_type;
113 unsigned int nbr_sections = bfd_count_sections (objfile->obfd);
114 asymbol **first_symbol = NULL;
115 bfd_vma *first_offset = NULL;
116 const asymbol *oso_file = NULL;
117
118 for (i = 0; i < number_of_symbols; i++)
119 {
bb00b29d
TG
120 asymbol *sym = symbol_table[i];
121 bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
122
a80b95ba
TG
123 offset = ANOFFSET (objfile->section_offsets, sym->section->index);
124
125 if (sym->flags & BSF_DEBUGGING)
126 {
a80b95ba
TG
127 bfd_vma addr;
128
3188d986
TG
129 /* Debugging symbols are used to collect OSO file names as well
130 as section offsets. */
131
bb00b29d 132 switch (mach_o_sym->n_type)
a80b95ba
TG
133 {
134 case N_SO:
3188d986
TG
135 /* An empty SO entry terminates a chunk for an OSO file. */
136 if ((sym->name == NULL || sym->name[0] == 0) && oso_file != NULL)
a80b95ba
TG
137 {
138 macho_add_oso (oso_file, nbr_sections,
3188d986 139 first_symbol, first_offset);
a80b95ba
TG
140 first_symbol = NULL;
141 first_offset = NULL;
142 oso_file = NULL;
143 }
144 break;
145 case N_FUN:
146 case N_STSYM:
147 if (sym->name == NULL || sym->name[0] == '\0')
148 break;
149 /* Fall through. */
150 case N_BNSYM:
151 gdb_assert (oso_file != NULL);
152 addr = sym->value
153 + bfd_get_section_vma (sym->section->bfd, sym->section);
154 if (addr != 0
155 && first_symbol[sym->section->index] == NULL)
156 {
3188d986 157 /* These STAB entries can directly relocate a section. */
a80b95ba
TG
158 first_symbol[sym->section->index] = sym;
159 first_offset[sym->section->index] = addr + offset;
160 }
161 break;
162 case N_GSYM:
163 gdb_assert (oso_file != NULL);
164 if (first_symbol[sym->section->index] == NULL)
3188d986
TG
165 {
166 /* This STAB entry needs a symbol look-up to relocate
167 the section. */
168 first_symbol[sym->section->index] = sym;
169 first_offset[sym->section->index] = 0;
170 }
a80b95ba
TG
171 break;
172 case N_OSO:
3188d986 173 /* New OSO file. */
a80b95ba
TG
174 gdb_assert (oso_file == NULL);
175 first_symbol = (asymbol **)xmalloc (nbr_sections
176 * sizeof (asymbol *));
177 first_offset = (bfd_vma *)xmalloc (nbr_sections
178 * sizeof (bfd_vma));
179 for (j = 0; j < nbr_sections; j++)
180 first_symbol[j] = NULL;
181 oso_file = sym;
182 break;
183 }
184 continue;
185 }
186
187 if (sym->name == NULL || *sym->name == '\0')
188 {
189 /* Skip names that don't exist (shouldn't happen), or names
190 that are null strings (may happen). */
191 continue;
192 }
193
194 if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK))
195 {
196 struct minimal_symbol *msym;
197 CORE_ADDR symaddr;
198
199 /* Bfd symbols are section relative. */
200 symaddr = sym->value + sym->section->vma;
201
202 /* Select global/local/weak symbols. Note that bfd puts abs
203 symbols in their own section, so all symbols we are
204 interested in will have a section. */
205 /* Relocate all non-absolute and non-TLS symbols by the
206 section offset. */
207 if (sym->section != &bfd_abs_section
208 && !(sym->section->flags & SEC_THREAD_LOCAL))
209 symaddr += offset;
210
211 if (sym->section == &bfd_abs_section)
212 ms_type = mst_abs;
213 else if (sym->section->flags & SEC_CODE)
214 {
215 if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
216 ms_type = mst_text;
217 else
218 ms_type = mst_file_text;
219 }
220 else if (sym->section->flags & SEC_ALLOC)
221 {
222 if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
223 {
224 if (sym->section->flags & SEC_LOAD)
225 ms_type = mst_data;
226 else
227 ms_type = mst_bss;
228 }
229 else if (sym->flags & BSF_LOCAL)
230 {
231 /* Not a special stabs-in-elf symbol, do regular
232 symbol processing. */
233 if (sym->section->flags & SEC_LOAD)
234 ms_type = mst_file_data;
235 else
236 ms_type = mst_file_bss;
237 }
238 else
239 ms_type = mst_unknown;
240 }
241 else
242 continue; /* Skip this symbol. */
243
244 gdb_assert (sym->section->index < nbr_sections);
245 if (oso_file != NULL
246 && first_symbol[sym->section->index] == NULL)
247 {
3188d986 248 /* Standard symbols can directly relocate sections. */
a80b95ba
TG
249 first_symbol[sym->section->index] = sym;
250 first_offset[sym->section->index] = symaddr;
251 }
252
253 msym = prim_record_minimal_symbol_and_info
254 (sym->name, symaddr, ms_type, sym->section->index,
255 sym->section, objfile);
256 }
257 }
258
3188d986 259 /* Just in case there is no trailing SO entry. */
a80b95ba
TG
260 if (oso_file != NULL)
261 macho_add_oso (oso_file, nbr_sections, first_symbol, first_offset);
262}
263
264/* If NAME describes an archive member (ie: ARCHIVE '(' MEMBER ')'),
265 returns the length of the archive name.
266 Returns -1 otherwise. */
f192ea96 267
a80b95ba
TG
268static int
269get_archive_prefix_len (const char *name)
270{
271 char *lparen;
272 int name_len = strlen (name);
273
274 if (name_len == 0 || name[name_len - 1] != ')')
275 return -1;
276
277 lparen = strrchr (name, '(');
278 if (lparen == NULL || lparen == name)
279 return -1;
280 return lparen - name;
281}
282
f192ea96
TG
283static int
284oso_el_compare_name (const void *vl, const void *vr)
285{
286 const oso_el *l = (const oso_el *)vl;
287 const oso_el *r = (const oso_el *)vr;
288
289 return strcmp (l->name, r->name);
290}
291
292/* Add an oso file as a symbol file. */
293
294static void
295macho_add_oso_symfile (oso_el *oso, bfd *abfd, struct objfile *main_objfile)
296{
297 struct section_addr_info *addrs;
298 int len;
299 int i;
300 char leading_char;
301
302 if (mach_o_debug_level > 0)
303 printf_unfiltered (_("Loading symbols from oso: %s\n"), oso->name);
304
305 if (!bfd_check_format (abfd, bfd_object))
306 {
307 warning (_("`%s': can't read symbols: %s."), oso->name,
308 bfd_errmsg (bfd_get_error ()));
309 bfd_close (abfd);
310 return;
311 }
312
313 bfd_set_cacheable (abfd, 1);
314
315 /* Compute addr length. */
316 len = 0;
317 for (i = 0; i < oso->num_sections; i++)
318 if (oso->symbols[i] != NULL)
319 len++;
320
321 addrs = alloc_section_addr_info (len);
322
323 leading_char = bfd_get_symbol_leading_char (main_objfile->obfd);
324
325 len = 0;
326 for (i = 0; i < oso->num_sections; i++)
327 if (oso->symbols[i] != NULL)
328 {
329 if (oso->offsets[i])
330 addrs->other[len].addr = oso->offsets[i];
331 else
332 {
333 struct minimal_symbol *msym;
334 const char *name = oso->symbols[i]->name;
335
336 if (name[0] == leading_char)
337 ++name;
338
339 if (mach_o_debug_level > 3)
340 printf_unfiltered (_("resolve sect %s with %s\n"),
341 oso->symbols[i]->section->name,
342 oso->symbols[i]->name);
343 msym = lookup_minimal_symbol (name, NULL, main_objfile);
344 if (msym == NULL)
345 {
346 warning (_("can't find symbol '%s' in minsymtab"),
347 oso->symbols[i]->name);
348 addrs->other[len].addr = 0;
349 }
350 else
351 addrs->other[len].addr = SYMBOL_VALUE_ADDRESS (msym);
352 }
353 addrs->other[len].name = (char *)oso->symbols[i]->section->name;
354 len++;
355 }
356
357 if (mach_o_debug_level > 1)
358 {
359 int j;
360 for (j = 0; j < addrs->num_sections; j++)
361 printf_unfiltered (_(" %s: %s\n"),
362 core_addr_to_string (addrs->other[j].addr),
363 addrs->other[j].name);
364 }
365
366 symbol_file_add_from_bfd (abfd, 0, addrs, 0);
367}
368
a80b95ba 369/* Read symbols from the vector of oso files. */
f192ea96 370
a80b95ba
TG
371static void
372macho_oso_symfile (struct objfile *main_objfile)
373{
374 int ix;
375 VEC (oso_el) *vec;
376 oso_el *oso;
a80b95ba
TG
377
378 vec = oso_vector;
379 oso_vector = NULL;
380
f192ea96
TG
381 /* Sort oso by name so that files from libraries are gathered. */
382 qsort (VEC_address (oso_el, vec), VEC_length (oso_el, vec),
383 sizeof (oso_el), oso_el_compare_name);
a80b95ba 384
f192ea96 385 for (ix = 0; VEC_iterate (oso_el, vec, ix, oso);)
a80b95ba 386 {
a80b95ba 387 int pfx_len;
a80b95ba
TG
388
389 /* Check if this is a library name. */
390 pfx_len = get_archive_prefix_len (oso->name);
391 if (pfx_len > 0)
392 {
393 bfd *archive_bfd;
394 bfd *member_bfd;
f192ea96
TG
395 char *archive_name = XNEWVEC (char, pfx_len + 1);
396 int last_ix;
397 oso_el *oso2;
398 int ix2;
a80b95ba 399
a80b95ba
TG
400 memcpy (archive_name, oso->name, pfx_len);
401 archive_name[pfx_len] = '\0';
402
f192ea96
TG
403 /* Compute number of oso for this archive. */
404 for (last_ix = ix;
405 VEC_iterate (oso_el, vec, last_ix, oso2); last_ix++)
406 {
407 if (strncmp (oso2->name, archive_name, pfx_len) != 0)
408 break;
409 }
410
a80b95ba
TG
411 /* Open the archive and check the format. */
412 archive_bfd = bfd_openr (archive_name, gnutarget);
413 if (archive_bfd == NULL)
414 {
415 warning (_("Could not open OSO archive file \"%s\""),
416 archive_name);
f192ea96 417 ix = last_ix;
a80b95ba
TG
418 continue;
419 }
420 if (!bfd_check_format (archive_bfd, bfd_archive))
421 {
422 warning (_("OSO archive file \"%s\" not an archive."),
423 archive_name);
424 bfd_close (archive_bfd);
f192ea96 425 ix = last_ix;
a80b95ba
TG
426 continue;
427 }
428 member_bfd = bfd_openr_next_archived_file (archive_bfd, NULL);
429
430 if (member_bfd == NULL)
431 {
432 warning (_("Could not read archive members out of "
433 "OSO archive \"%s\""), archive_name);
434 bfd_close (archive_bfd);
f192ea96 435 ix = last_ix;
a80b95ba
TG
436 continue;
437 }
f192ea96
TG
438
439 /* Load all oso in this library. */
a80b95ba
TG
440 while (member_bfd != NULL)
441 {
f192ea96 442 bfd *prev;
a80b95ba 443 const char *member_name = member_bfd->filename;
f192ea96
TG
444 int member_len = strlen (member_name);
445
ab7e10a0 446 /* If this member is referenced, add it as a symfile. */
f192ea96
TG
447 for (ix2 = ix; ix2 < last_ix; ix2++)
448 {
449 oso2 = VEC_index (oso_el, vec, ix2);
450
451 if (oso2->name
452 && strlen (oso2->name) == pfx_len + member_len + 2
453 && !memcmp (member_name, oso2->name + pfx_len + 1,
454 member_len))
455 {
456 macho_add_oso_symfile (oso2, member_bfd, main_objfile);
457 oso2->name = NULL;
458 break;
459 }
460 }
461
462 prev = member_bfd;
a80b95ba
TG
463 member_bfd = bfd_openr_next_archived_file
464 (archive_bfd, member_bfd);
ab7e10a0
TG
465
466 /* Free previous member if not referenced by an oso. */
467 if (ix2 >= last_ix)
f192ea96 468 bfd_close (prev);
a80b95ba 469 }
f192ea96
TG
470 for (ix2 = ix; ix2 < last_ix; ix2++)
471 {
472 oso_el *oso2 = VEC_index (oso_el, vec, ix2);
473
474 if (oso2->name != NULL)
475 warning (_("Could not find specified archive member "
476 "for OSO name \"%s\""), oso->name);
477 }
478 ix = last_ix;
a80b95ba
TG
479 }
480 else
481 {
f192ea96 482 bfd *abfd;
a80b95ba
TG
483
484 abfd = bfd_openr (oso->name, gnutarget);
485 if (!abfd)
f192ea96
TG
486 warning (_("`%s': can't open to read symbols: %s."), oso->name,
487 bfd_errmsg (bfd_get_error ()));
488 else
489 macho_add_oso_symfile (oso, abfd, main_objfile);
490
491 ix++;
492 }
493 }
494
495 for (ix = 0; VEC_iterate (oso_el, vec, ix, oso); ix++)
496 {
a80b95ba
TG
497 xfree (oso->symbols);
498 xfree (oso->offsets);
499 }
500 VEC_free (oso_el, vec);
501}
502
503/* DSYM (debug symbols) files contain the debug info of an executable.
504 This is a separate file created by dsymutil(1) and is similar to debug
505 link feature on ELF.
506 DSYM files are located in a subdirectory. Append DSYM_SUFFIX to the
507 executable name and the executable base name to get the DSYM file name. */
508#define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
509
510/* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it.
511 Return NULL if no valid dsym file is found. */
f192ea96 512
a80b95ba
TG
513static bfd *
514macho_check_dsym (struct objfile *objfile)
515{
516 size_t name_len = strlen (objfile->name);
517 size_t dsym_len = strlen (DSYM_SUFFIX);
518 const char *base_name = lbasename (objfile->name);
519 size_t base_len = strlen (base_name);
520 char *dsym_filename = alloca (name_len + dsym_len + base_len + 1);
521 bfd *dsym_bfd;
522 asection *sect;
523 bfd_byte main_uuid[16];
524 bfd_byte dsym_uuid[16];
525
526 strcpy (dsym_filename, objfile->name);
527 strcpy (dsym_filename + name_len, DSYM_SUFFIX);
528 strcpy (dsym_filename + name_len + dsym_len, base_name);
529
530 if (access (dsym_filename, R_OK) != 0)
531 return NULL;
532
533 sect = bfd_get_section_by_name (objfile->obfd, "LC_UUID");
534 if (sect == NULL)
535 {
536 warning (_("can't find UUID in %s"), objfile->name);
537 return NULL;
538 }
539 if (!bfd_get_section_contents (objfile->obfd, sect, main_uuid,
540 0, sizeof (main_uuid)))
541 {
542 warning (_("can't read UUID in %s"), objfile->name);
543 return NULL;
544 }
545
546 dsym_filename = xstrdup (dsym_filename);
547 dsym_bfd = bfd_openr (dsym_filename, gnutarget);
548 if (dsym_bfd == NULL)
549 {
550 warning (_("can't open dsym file %s"), dsym_filename);
551 xfree (dsym_filename);
552 return NULL;
553 }
554
555 if (!bfd_check_format (dsym_bfd, bfd_object))
556 {
557 bfd_close (dsym_bfd);
558 warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
559 xfree (dsym_filename);
560 return NULL;
561 }
562
563 sect = bfd_get_section_by_name (dsym_bfd, "LC_UUID");
564 if (sect == NULL)
565 {
566 warning (_("can't find UUID in %s"), dsym_filename);
567 bfd_close (dsym_bfd);
568 xfree (dsym_filename);
569 return NULL;
570 }
571 if (!bfd_get_section_contents (dsym_bfd, sect, dsym_uuid,
572 0, sizeof (dsym_uuid)))
573 {
574 warning (_("can't read UUID in %s"), dsym_filename);
575 bfd_close (dsym_bfd);
576 xfree (dsym_filename);
577 return NULL;
578 }
579 if (memcmp (dsym_uuid, main_uuid, sizeof (main_uuid)))
580 {
581 warning (_("dsym file UUID doesn't match the one in %s"), objfile->name);
582 bfd_close (dsym_bfd);
583 xfree (dsym_filename);
584 return NULL;
585 }
586 return dsym_bfd;
587
588}
589
590static void
f4352531 591macho_symfile_read (struct objfile *objfile, int symfile_flags)
a80b95ba
TG
592{
593 bfd *abfd = objfile->obfd;
594 struct cleanup *back_to;
595 CORE_ADDR offset;
596 long storage_needed;
597 bfd *dsym_bfd;
598
599 init_minimal_symbol_collection ();
600 back_to = make_cleanup_discard_minimal_symbols ();
601
602 /* Get symbols from the symbol table only if the file is an executable.
603 The symbol table of object files is not relocated and is expected to
604 be in the executable. */
cf1061c0 605 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
a80b95ba
TG
606 {
607 /* Process the normal symbol table first. */
608 storage_needed = bfd_get_symtab_upper_bound (objfile->obfd);
609 if (storage_needed < 0)
610 error (_("Can't read symbols from %s: %s"),
611 bfd_get_filename (objfile->obfd),
612 bfd_errmsg (bfd_get_error ()));
613
614 if (storage_needed > 0)
615 {
616 asymbol **symbol_table;
617 long symcount;
618
619 symbol_table = (asymbol **) xmalloc (storage_needed);
620 make_cleanup (xfree, symbol_table);
621 symcount = bfd_canonicalize_symtab (objfile->obfd, symbol_table);
622
623 if (symcount < 0)
624 error (_("Can't read symbols from %s: %s"),
625 bfd_get_filename (objfile->obfd),
626 bfd_errmsg (bfd_get_error ()));
627
628 macho_symtab_read (objfile, symcount, symbol_table);
629 }
630
631 install_minimal_symbols (objfile);
632
cf1061c0
TG
633 /* Try to read .eh_frame / .debug_frame. */
634 /* First, locate these sections. We ignore the result status
635 as it only checks for debug info. */
636 dwarf2_has_info (objfile);
637 dwarf2_build_frame_info (objfile);
638
a80b95ba
TG
639 /* Check for DSYM file. */
640 dsym_bfd = macho_check_dsym (objfile);
641 if (dsym_bfd != NULL)
642 {
643 int ix;
644 oso_el *oso;
645
646 if (mach_o_debug_level > 0)
647 printf_unfiltered (_("dsym file found\n"));
648
649 /* Remove oso. They won't be used. */
650 for (ix = 0; VEC_iterate (oso_el, oso_vector, ix, oso); ix++)
651 {
652 xfree (oso->symbols);
653 xfree (oso->offsets);
654 }
655 VEC_free (oso_el, oso_vector);
656 oso_vector = NULL;
657
2480cfa0
TG
658 /* Add the dsym file as a separate file. */
659 symbol_file_add_separate (dsym_bfd, symfile_flags, objfile);
a80b95ba 660
cf1061c0 661 /* Don't try to read dwarf2 from main file or shared libraries. */
2480cfa0 662 return;
a80b95ba
TG
663 }
664 }
665
666 if (dwarf2_has_info (objfile))
667 {
668 /* DWARF 2 sections */
f29dff0a 669 dwarf2_build_psymtabs (objfile);
a80b95ba
TG
670 }
671
cf1061c0
TG
672 /* Do not try to read .eh_frame/.debug_frame as they are not relocated
673 and dwarf2_build_frame_info cannot deal with unrelocated sections. */
a80b95ba
TG
674
675 /* Then the oso. */
676 if (oso_vector != NULL)
677 macho_oso_symfile (objfile);
678}
679
680static void
681macho_symfile_finish (struct objfile *objfile)
682{
683}
684
685static void
686macho_symfile_offsets (struct objfile *objfile,
687 struct section_addr_info *addrs)
688{
689 unsigned int i;
690 unsigned int num_sections;
691 struct obj_section *osect;
692
693 /* Allocate section_offsets. */
694 objfile->num_sections = bfd_count_sections (objfile->obfd);
695 objfile->section_offsets = (struct section_offsets *)
696 obstack_alloc (&objfile->objfile_obstack,
697 SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
698 memset (objfile->section_offsets, 0,
699 SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
700
701 /* This code is run when we first add the objfile with
702 symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
703 passed in. The place in symfile.c where the addrs are applied
704 depends on the addrs having section names. But in the dyld code
705 we build an anonymous array of addrs, so that code is a no-op.
706 Because of that, we have to apply the addrs to the sections here.
707 N.B. if an objfile slides after we've already created it, then it
708 goes through objfile_relocate. */
709
710 for (i = 0; i < addrs->num_sections; i++)
711 {
712 if (addrs->other[i].name == NULL)
713 continue;
714
715 ALL_OBJFILE_OSECTIONS (objfile, osect)
716 {
717 const char *bfd_sect_name = osect->the_bfd_section->name;
718
719 if (strcmp (bfd_sect_name, addrs->other[i].name) == 0)
720 {
721 obj_section_offset (osect) = addrs->other[i].addr;
722 break;
723 }
724 }
725 }
726
727 objfile->sect_index_text = 0;
728
729 ALL_OBJFILE_OSECTIONS (objfile, osect)
730 {
731 const char *bfd_sect_name = osect->the_bfd_section->name;
732 int sect_index = osect->the_bfd_section->index;
cf1061c0
TG
733
734 if (strncmp (bfd_sect_name, "LC_SEGMENT.", 11) == 0)
735 bfd_sect_name += 11;
736 if (strcmp (bfd_sect_name, "__TEXT") == 0
737 || strcmp (bfd_sect_name, "__TEXT.__text") == 0)
a80b95ba
TG
738 objfile->sect_index_text = sect_index;
739 }
740}
741
742static struct sym_fns macho_sym_fns = {
743 bfd_target_mach_o_flavour,
744
745 macho_new_init, /* sym_new_init: init anything gbl to entire symtab */
746 macho_symfile_init, /* sym_init: read initial info, setup for sym_read() */
747 macho_symfile_read, /* sym_read: read a symbol file into symtab */
748 macho_symfile_finish, /* sym_finish: finished with file, cleanup */
749 macho_symfile_offsets, /* sym_offsets: xlate external to internal form */
033c64b7
TG
750 default_symfile_segments, /* sym_segments: Get segment information from
751 a file. */
a80b95ba
TG
752 NULL /* next: pointer to next struct sym_fns */
753};
754
755void
756_initialize_machoread ()
757{
758 add_symtab_fns (&macho_sym_fns);
759
760 add_setshow_zinteger_cmd ("mach-o", class_obscure,
761 &mach_o_debug_level, _("\
762Set if printing Mach-O symbols processing."), _("\
763Show if printing Mach-O symbols processing."), NULL,
764 NULL, NULL,
765 &setdebuglist, &showdebuglist);
766}
This page took 0.139977 seconds and 4 git commands to generate.