/* Darwin support for GDB, the GNU debugger.
- Copyright (C) 2008-2020 Free Software Foundation, Inc.
+ Copyright (C) 2008-2022 Free Software Foundation, Inc.
Contributed by AdaCore.
#include "gdbcore.h"
#include "mach-o.h"
#include "aout/stab_gnu.h"
-#include "psympriv.h"
#include "complaints.h"
#include "gdb_bfd.h"
#include <string>
#include <algorithm>
+#include "dwarf2/public.h"
/* If non-zero displays debugging message. */
static unsigned int mach_o_debug_level = 0;
+#define macho_debug(LEVEL, FMT, ...) \
+ debug_prefixed_printf_cond_nofunc (mach_o_debug_level > LEVEL, \
+ "machoread", FMT, ## __VA_ARGS__)
+
/* Dwarf debugging information are never in the final executable. They stay
in object files and the executable contains the list of object files read
during the link.
if (sym->name == NULL || *sym->name == '\0')
{
/* Skip names that don't exist (shouldn't happen), or names
- that are null strings (may happen). */
+ that are null strings (may happen). */
return;
}
symaddr = sym->value + sym->section->vma;
if (sym->section == bfd_abs_section_ptr)
- ms_type = mst_abs;
+ ms_type = mst_abs;
else if (sym->section->flags & SEC_CODE)
- {
- if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
- ms_type = mst_text;
- else
- ms_type = mst_file_text;
- }
+ {
+ if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
+ ms_type = mst_text;
+ else
+ ms_type = mst_file_text;
+ }
else if (sym->section->flags & SEC_ALLOC)
- {
- if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
- {
- if (sym->section->flags & SEC_LOAD)
- ms_type = mst_data;
- else
- ms_type = mst_bss;
- }
- else if (sym->flags & BSF_LOCAL)
- {
- /* Not a special stabs-in-elf symbol, do regular
- symbol processing. */
- if (sym->section->flags & SEC_LOAD)
- ms_type = mst_file_data;
- else
- ms_type = mst_file_bss;
- }
- else
- ms_type = mst_unknown;
- }
+ {
+ if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
+ {
+ if (sym->section->flags & SEC_LOAD)
+ ms_type = mst_data;
+ else
+ ms_type = mst_bss;
+ }
+ else if (sym->flags & BSF_LOCAL)
+ {
+ /* Not a special stabs-in-elf symbol, do regular
+ symbol processing. */
+ if (sym->section->flags & SEC_LOAD)
+ ms_type = mst_file_data;
+ else
+ ms_type = mst_file_bss;
+ }
+ else
+ ms_type = mst_unknown;
+ }
else
- return; /* Skip this symbol. */
+ return; /* Skip this symbol. */
reader.record_with_info (sym->name, symaddr, ms_type,
gdb_bfd_section_index (objfile->obfd,
bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
switch (state)
- {
- case S_NO_SO:
+ {
+ case S_NO_SO:
if (mach_o_sym->n_type == N_SO)
- {
- /* Start of object stab. */
+ {
+ /* Start of object stab. */
if (sym->name == NULL || sym->name[0] == 0)
- {
- /* Unexpected empty N_SO. */
- complaint (_("Unexpected empty N_SO stab"));
- }
- else
- {
- file_so = sym;
- state = S_FIRST_SO;
- }
- }
- else if (sym->flags & BSF_DEBUGGING)
- {
- if (mach_o_sym->n_type == N_OPT)
- {
- /* No complaint for OPT. */
- break;
- }
-
- /* Debugging symbols are not expected here. */
- complaint (_("%s: Unexpected debug stab outside SO markers"),
- objfile_name (objfile));
- }
- else
- {
- /* Non-debugging symbols go to the minimal symbol table. */
- macho_symtab_add_minsym (reader, objfile, sym);
- }
- break;
-
- case S_FIRST_SO:
- case S_SECOND_SO:
+ {
+ /* Unexpected empty N_SO. */
+ complaint (_("Unexpected empty N_SO stab"));
+ }
+ else
+ {
+ file_so = sym;
+ state = S_FIRST_SO;
+ }
+ }
+ else if (sym->flags & BSF_DEBUGGING)
+ {
+ if (mach_o_sym->n_type == N_OPT)
+ {
+ /* No complaint for OPT. */
+ break;
+ }
+
+ /* Debugging symbols are not expected here. */
+ complaint (_("%s: Unexpected debug stab outside SO markers"),
+ objfile_name (objfile));
+ }
+ else
+ {
+ /* Non-debugging symbols go to the minimal symbol table. */
+ macho_symtab_add_minsym (reader, objfile, sym);
+ }
+ break;
+
+ case S_FIRST_SO:
+ case S_SECOND_SO:
if (mach_o_sym->n_type == N_SO)
- {
+ {
if (sym->name == NULL || sym->name[0] == 0)
- {
- /* Unexpected empty N_SO. */
- complaint (_("Empty SO section"));
- state = S_NO_SO;
- }
- else if (state == S_FIRST_SO)
- {
- /* Second SO stab for the file name. */
- file_so = sym;
- state = S_SECOND_SO;
- }
- else
- complaint (_("Three SO in a raw"));
- }
- else if (mach_o_sym->n_type == N_OSO)
- {
+ {
+ /* Unexpected empty N_SO. */
+ complaint (_("Empty SO section"));
+ state = S_NO_SO;
+ }
+ else if (state == S_FIRST_SO)
+ {
+ /* Second SO stab for the file name. */
+ file_so = sym;
+ state = S_SECOND_SO;
+ }
+ else
+ complaint (_("Three SO in a raw"));
+ }
+ else if (mach_o_sym->n_type == N_OSO)
+ {
if (sym->name == NULL || sym->name[0] == 0)
- {
- /* Empty OSO. Means that this file was compiled with
- stabs. */
- state = S_STAB_FILE;
- warning (_("stabs debugging not supported for %s"),
- file_so->name);
- }
- else
- {
- /* Non-empty OSO for a Dwarf file. */
- oso_file = symbol_table + i;
- nbr_syms = 0;
- state = S_DWARF_FILE;
- }
- }
- else
- complaint (_("Unexpected stab after SO"));
- break;
-
- case S_STAB_FILE:
- case S_DWARF_FILE:
+ {
+ /* Empty OSO. Means that this file was compiled with
+ stabs. */
+ state = S_STAB_FILE;
+ warning (_("stabs debugging not supported for %s"),
+ file_so->name);
+ }
+ else
+ {
+ /* Non-empty OSO for a Dwarf file. */
+ oso_file = symbol_table + i;
+ nbr_syms = 0;
+ state = S_DWARF_FILE;
+ }
+ }
+ else
+ complaint (_("Unexpected stab after SO"));
+ break;
+
+ case S_STAB_FILE:
+ case S_DWARF_FILE:
if (mach_o_sym->n_type == N_SO)
- {
+ {
if (sym->name == NULL || sym->name[0] == 0)
- {
- /* End of file. */
- if (state == S_DWARF_FILE)
+ {
+ /* End of file. */
+ if (state == S_DWARF_FILE)
oso_vector_ptr->emplace_back (oso_file, symbol_table + i,
nbr_syms);
- state = S_NO_SO;
- }
- else
- {
- complaint (_("Missing nul SO"));
- file_so = sym;
- state = S_FIRST_SO;
- }
- }
- else if (sym->flags & BSF_DEBUGGING)
- {
- if (state == S_STAB_FILE)
- {
- /* FIXME: to be implemented. */
- }
- else
- {
- switch (mach_o_sym->n_type)
- {
- case N_FUN:
- if (sym->name == NULL || sym->name[0] == 0)
- break;
- /* Fall through. */
- case N_STSYM:
- /* Interesting symbol. */
- nbr_syms++;
- break;
- case N_ENSYM:
- case N_BNSYM:
- case N_GSYM:
- break;
- default:
- complaint (_("unhandled stab for dwarf OSO file"));
- break;
- }
- }
- }
- else
- complaint (_("non-debugging symbol within SO"));
- break;
- }
+ state = S_NO_SO;
+ }
+ else
+ {
+ complaint (_("Missing nul SO"));
+ file_so = sym;
+ state = S_FIRST_SO;
+ }
+ }
+ else if (sym->flags & BSF_DEBUGGING)
+ {
+ if (state == S_STAB_FILE)
+ {
+ /* FIXME: to be implemented. */
+ }
+ else
+ {
+ switch (mach_o_sym->n_type)
+ {
+ case N_FUN:
+ if (sym->name == NULL || sym->name[0] == 0)
+ break;
+ /* Fall through. */
+ case N_STSYM:
+ /* Interesting symbol. */
+ nbr_syms++;
+ break;
+ case N_ENSYM:
+ case N_BNSYM:
+ case N_GSYM:
+ break;
+ default:
+ complaint (_("unhandled stab for dwarf OSO file"));
+ break;
+ }
+ }
+ }
+ else
+ complaint (_("non-debugging symbol within SO"));
+ break;
+ }
}
if (state != S_NO_SO)
static struct bfd_hash_entry *
macho_sym_hash_newfunc (struct bfd_hash_entry *entry,
- struct bfd_hash_table *table,
- const char *string)
+ struct bfd_hash_table *table,
+ const char *string)
{
struct macho_sym_hash_entry *ret = (struct macho_sym_hash_entry *) entry;
subclass. */
if (ret == NULL)
ret = (struct macho_sym_hash_entry *) bfd_hash_allocate (table,
- sizeof (* ret));
+ sizeof (* ret));
if (ret == NULL)
return NULL;
static void
macho_add_oso_symfile (oso_el *oso, const gdb_bfd_ref_ptr &abfd,
const char *name,
- struct objfile *main_objfile,
+ struct objfile *main_objfile,
symfile_add_flags symfile_flags)
{
int storage;
/* Per section flag to mark which section have been rebased. */
unsigned char *sections_rebased;
- if (mach_o_debug_level > 0)
- printf_unfiltered
- (_("Loading debugging symbols from oso: %s\n"), oso->name);
+ macho_debug (0, _("Loading debugging symbols from oso: %s\n"), oso->name);
if (!bfd_check_format (abfd.get (), bfd_object))
{
warning (_("`%s': can't read symbols: %s."), oso->name,
- bfd_errmsg (bfd_get_error ()));
+ bfd_errmsg (bfd_get_error ()));
return;
}
}
if (!bfd_hash_table_init_n (&table, macho_sym_hash_newfunc,
- sizeof (struct macho_sym_hash_entry),
- oso->nbr_syms))
+ sizeof (struct macho_sym_hash_entry),
+ oso->nbr_syms))
{
warning (_("`%s': can't create hash table"), oso->name);
return;
bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
switch (mach_o_sym->n_type)
- {
- case N_ENSYM:
- case N_BNSYM:
- case N_GSYM:
- sym = NULL;
- break;
- case N_FUN:
- if (sym->name == NULL || sym->name[0] == 0)
- sym = NULL;
- break;
- case N_STSYM:
- break;
- default:
- sym = NULL;
- break;
- }
+ {
+ case N_ENSYM:
+ case N_BNSYM:
+ case N_GSYM:
+ sym = NULL;
+ break;
+ case N_FUN:
+ if (sym->name == NULL || sym->name[0] == 0)
+ sym = NULL;
+ break;
+ case N_STSYM:
+ break;
+ default:
+ sym = NULL;
+ break;
+ }
if (sym != NULL)
- {
- struct macho_sym_hash_entry *ent;
-
- ent = (struct macho_sym_hash_entry *)
- bfd_hash_lookup (&table, sym->name, TRUE, FALSE);
- if (ent->sym != NULL)
- complaint (_("Duplicated symbol %s in symbol table"), sym->name);
- else
- {
- if (mach_o_debug_level > 4)
- {
- struct gdbarch *arch = get_objfile_arch (main_objfile);
- printf_unfiltered
- (_("Adding symbol %s (addr: %s)\n"),
- sym->name, paddress (arch, sym->value));
- }
- ent->sym = sym;
- }
- }
+ {
+ struct macho_sym_hash_entry *ent;
+
+ ent = (struct macho_sym_hash_entry *)
+ bfd_hash_lookup (&table, sym->name, TRUE, FALSE);
+ if (ent->sym != NULL)
+ complaint (_("Duplicated symbol %s in symbol table"), sym->name);
+ else
+ {
+ macho_debug (4, _("Adding symbol %s (addr: %s)\n"),
+ sym->name, paddress (main_objfile->arch (),
+ sym->value));
+ ent->sym = sym;
+ }
+ }
}
/* Relocate symbols of the OSO. */
bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
if (mach_o_sym->n_type & BFD_MACH_O_N_STAB)
- continue;
+ continue;
if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF
- && sym->value != 0)
- {
- /* For common symbol use the min symtab and modify the OSO
- symbol table. */
- CORE_ADDR res;
-
- res = macho_resolve_oso_sym_with_minsym (main_objfile, sym);
- if (res != 0)
- {
- sym->section = bfd_com_section_ptr;
- sym->value = res;
- }
- }
+ && sym->value != 0)
+ {
+ /* For common symbol use the min symtab and modify the OSO
+ symbol table. */
+ CORE_ADDR res;
+
+ res = macho_resolve_oso_sym_with_minsym (main_objfile, sym);
+ if (res != 0)
+ {
+ sym->section = bfd_com_section_ptr;
+ sym->value = res;
+ }
+ }
else if ((mach_o_sym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
- {
- /* Normal symbol. */
- asection *sec = sym->section;
- bfd_mach_o_section *msec;
- unsigned int sec_type;
-
- /* Skip buggy ones. */
- if (sec == NULL || sections_rebased[sec->index] != 0)
- continue;
-
- /* Only consider regular, non-debugging sections. */
- msec = bfd_mach_o_get_mach_o_section (sec);
- sec_type = msec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
- if ((sec_type == BFD_MACH_O_S_REGULAR
- || sec_type == BFD_MACH_O_S_ZEROFILL)
- && (msec->flags & BFD_MACH_O_S_ATTR_DEBUG) == 0)
- {
- CORE_ADDR addr = 0;
-
- if ((mach_o_sym->n_type & BFD_MACH_O_N_EXT) != 0)
- {
- /* Use the min symtab for global symbols. */
- addr = macho_resolve_oso_sym_with_minsym (main_objfile, sym);
- }
- else
- {
- struct macho_sym_hash_entry *ent;
-
- ent = (struct macho_sym_hash_entry *)
- bfd_hash_lookup (&table, sym->name, FALSE, FALSE);
- if (ent != NULL)
- addr = bfd_asymbol_value (ent->sym);
- }
-
- /* Adjust the section. */
- if (addr != 0)
- {
- CORE_ADDR res = addr - sym->value;
-
- if (mach_o_debug_level > 3)
- {
- struct gdbarch *arch = get_objfile_arch (main_objfile);
- printf_unfiltered
- (_("resolve sect %s with %s (set to %s)\n"),
- sec->name, sym->name,
- paddress (arch, res));
- }
- bfd_set_section_vma (sec, res);
- sections_rebased[sec->index] = 1;
- }
- }
- else
- {
- /* Mark the section as never rebased. */
- sections_rebased[sec->index] = 2;
- }
- }
+ {
+ /* Normal symbol. */
+ asection *sec = sym->section;
+ bfd_mach_o_section *msec;
+ unsigned int sec_type;
+
+ /* Skip buggy ones. */
+ if (sec == NULL || sections_rebased[sec->index] != 0)
+ continue;
+
+ /* Only consider regular, non-debugging sections. */
+ msec = bfd_mach_o_get_mach_o_section (sec);
+ sec_type = msec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
+ if ((sec_type == BFD_MACH_O_S_REGULAR
+ || sec_type == BFD_MACH_O_S_ZEROFILL)
+ && (msec->flags & BFD_MACH_O_S_ATTR_DEBUG) == 0)
+ {
+ CORE_ADDR addr = 0;
+
+ if ((mach_o_sym->n_type & BFD_MACH_O_N_EXT) != 0)
+ {
+ /* Use the min symtab for global symbols. */
+ addr = macho_resolve_oso_sym_with_minsym (main_objfile, sym);
+ }
+ else
+ {
+ struct macho_sym_hash_entry *ent;
+
+ ent = (struct macho_sym_hash_entry *)
+ bfd_hash_lookup (&table, sym->name, FALSE, FALSE);
+ if (ent != NULL)
+ addr = bfd_asymbol_value (ent->sym);
+ }
+
+ /* Adjust the section. */
+ if (addr != 0)
+ {
+ CORE_ADDR res = addr - sym->value;
+
+ macho_debug (3, _("resolve sect %s with %s (set to %s)\n"),
+ sec->name, sym->name,
+ paddress (main_objfile->arch (), res));
+ bfd_set_section_vma (sec, res);
+ sections_rebased[sec->index] = 1;
+ }
+ }
+ else
+ {
+ /* Mark the section as never rebased. */
+ sections_rebased[sec->index] = 2;
+ }
+ }
}
bfd_hash_table_free (&table);
pfx_len = get_archive_prefix_len (oso->name);
if (pfx_len > 0)
{
- int last_ix;
- oso_el *oso2;
- int ix2;
+ int last_ix;
+ oso_el *oso2;
+ int ix2;
std::string archive_name (oso->name, pfx_len);
- /* Compute number of oso for this archive. */
- for (last_ix = ix; last_ix < oso_vector_ptr->size (); last_ix++)
- {
+ /* Compute number of oso for this archive. */
+ for (last_ix = ix; last_ix < oso_vector_ptr->size (); last_ix++)
+ {
oso2 = &(*oso_vector_ptr)[last_ix];
- if (strncmp (oso2->name, archive_name.c_str (), pfx_len) != 0)
- break;
- }
+ if (strncmp (oso2->name, archive_name.c_str (), pfx_len) != 0)
+ break;
+ }
/* Open the archive and check the format. */
gdb_bfd_ref_ptr archive_bfd (gdb_bfd_open (archive_name.c_str (),
- gnutarget, -1));
+ gnutarget));
if (archive_bfd == NULL)
{
warning (_("Could not open OSO archive file \"%s\""),
archive_name.c_str ());
- ix = last_ix;
+ ix = last_ix;
continue;
}
if (!bfd_check_format (archive_bfd.get (), bfd_archive))
{
warning (_("OSO archive file \"%s\" not an archive."),
archive_name.c_str ());
- ix = last_ix;
+ ix = last_ix;
continue;
}
{
warning (_("Could not read archive members out of "
"OSO archive \"%s\""), archive_name.c_str ());
- ix = last_ix;
+ ix = last_ix;
continue;
}
- /* Load all oso in this library. */
+ /* Load all oso in this library. */
while (member_bfd != NULL)
{
const char *member_name = bfd_get_filename (member_bfd.get ());
- int member_len = strlen (member_name);
-
- /* If this member is referenced, add it as a symfile. */
- for (ix2 = ix; ix2 < last_ix; ix2++)
- {
- oso2 = &(*oso_vector_ptr)[ix2];
-
- if (oso2->name
- && strlen (oso2->name) == pfx_len + member_len + 2
- && !memcmp (member_name, oso2->name + pfx_len + 1,
- member_len))
- {
- macho_add_oso_symfile (oso2, member_bfd,
+ int member_len = strlen (member_name);
+
+ /* If this member is referenced, add it as a symfile. */
+ for (ix2 = ix; ix2 < last_ix; ix2++)
+ {
+ oso2 = &(*oso_vector_ptr)[ix2];
+
+ if (oso2->name
+ && strlen (oso2->name) == pfx_len + member_len + 2
+ && !memcmp (member_name, oso2->name + pfx_len + 1,
+ member_len))
+ {
+ macho_add_oso_symfile (oso2, member_bfd,
bfd_get_filename (member_bfd.get ()),
- main_objfile, symfile_flags);
- oso2->name = NULL;
- break;
- }
- }
+ main_objfile, symfile_flags);
+ oso2->name = NULL;
+ break;
+ }
+ }
member_bfd = gdb_bfd_openr_next_archived_file (archive_bfd.get (),
member_bfd.get ());
}
- for (ix2 = ix; ix2 < last_ix; ix2++)
- {
- oso2 = &(*oso_vector_ptr)[ix2];
-
- if (oso2->name != NULL)
- warning (_("Could not find specified archive member "
- "for OSO name \"%s\""), oso->name);
- }
- ix = last_ix;
+ for (ix2 = ix; ix2 < last_ix; ix2++)
+ {
+ oso2 = &(*oso_vector_ptr)[ix2];
+
+ if (oso2->name != NULL)
+ warning (_("Could not find specified archive member "
+ "for OSO name \"%s\""), oso->name);
+ }
+ ix = last_ix;
}
else
{
- gdb_bfd_ref_ptr abfd (gdb_bfd_open (oso->name, gnutarget, -1));
+ gdb_bfd_ref_ptr abfd (gdb_bfd_open (oso->name, gnutarget));
if (abfd == NULL)
- warning (_("`%s': can't open to read symbols: %s."), oso->name,
- bfd_errmsg (bfd_get_error ()));
- else
- macho_add_oso_symfile (oso, abfd, oso->name, main_objfile,
+ warning (_("`%s': can't open to read symbols: %s."), oso->name,
+ bfd_errmsg (bfd_get_error ()));
+ else
+ macho_add_oso_symfile (oso, abfd, oso->name, main_objfile,
symfile_flags);
- ix++;
- }
+ ix++;
+ }
}
}
return NULL;
if (bfd_mach_o_lookup_command (objfile->obfd,
- BFD_MACH_O_LC_UUID, &main_uuid) == 0)
+ BFD_MACH_O_LC_UUID, &main_uuid) == 0)
{
warning (_("can't find UUID in %s"), objfile_name (objfile));
return NULL;
}
if (bfd_mach_o_lookup_command (dsym_bfd.get (),
- BFD_MACH_O_LC_UUID, &dsym_uuid) == 0)
+ BFD_MACH_O_LC_UUID, &dsym_uuid) == 0)
{
warning (_("can't find UUID in %s"), dsym_filename);
return NULL;
}
if (memcmp (dsym_uuid->command.uuid.uuid, main_uuid->command.uuid.uuid,
- sizeof (main_uuid->command.uuid.uuid)))
+ sizeof (main_uuid->command.uuid.uuid)))
{
warning (_("dsym file UUID doesn't match the one in %s"),
objfile_name (objfile));
symbol_table.resize (storage_needed / sizeof (asymbol *));
- minimal_symbol_reader reader (objfile);
+ minimal_symbol_reader reader (objfile);
symcount = bfd_canonicalize_symtab (objfile->obfd,
symbol_table.data ());
macho_symtab_read (reader, objfile, symcount, symbol_table.data (),
&oso_vector);
- reader.install ();
+ reader.install ();
}
/* Try to read .eh_frame / .debug_frame. */
gdb_bfd_ref_ptr dsym_bfd (macho_check_dsym (objfile, &dsym_filename));
if (dsym_bfd != NULL)
{
- struct bfd_section *asect, *dsect;
+ struct bfd_section *asect, *dsect;
- if (mach_o_debug_level > 0)
- printf_unfiltered (_("dsym file found\n"));
+ macho_debug (0, _("dsym file found\n"));
- /* Set dsym section size. */
- for (asect = objfile->obfd->sections, dsect = dsym_bfd->sections;
- asect && dsect;
- asect = asect->next, dsect = dsect->next)
- {
- if (strcmp (asect->name, dsect->name) != 0)
- break;
- bfd_set_section_size (dsect, bfd_section_size (asect));
- }
+ /* Set dsym section size. */
+ for (asect = objfile->obfd->sections, dsect = dsym_bfd->sections;
+ asect && dsect;
+ asect = asect->next, dsect = dsect->next)
+ {
+ if (strcmp (asect->name, dsect->name) != 0)
+ break;
+ bfd_set_section_size (dsect, bfd_section_size (asect));
+ }
/* Add the dsym file as a separate file. */
- symbol_file_add_separate (dsym_bfd.get (), dsym_filename.c_str (),
+ symbol_file_add_separate (dsym_bfd.get (), dsym_filename.c_str (),
symfile_flags, objfile);
/* Don't try to read dwarf2 from main file or shared libraries. */
- return;
+ return;
}
}
static bfd_byte *
macho_symfile_relocate (struct objfile *objfile, asection *sectp,
- bfd_byte *buf)
+ bfd_byte *buf)
{
bfd *abfd = objfile->obfd;
if ((sectp->flags & SEC_RELOC) == 0)
return NULL;
- if (mach_o_debug_level > 0)
- printf_unfiltered (_("Relocate section '%s' of %s\n"),
- sectp->name, objfile_name (objfile));
+ macho_debug (0, _("Relocate section '%s' of %s\n"),
+ sectp->name, objfile_name (objfile));
return bfd_simple_get_relocated_section_contents (abfd, sectp, buf, NULL);
}
static void
macho_symfile_offsets (struct objfile *objfile,
- const section_addr_info &addrs)
+ const section_addr_info &addrs)
{
unsigned int i;
struct obj_section *osect;
/* Allocate section_offsets. */
- objfile->num_sections = bfd_count_sections (objfile->obfd);
- objfile->section_offsets = (struct section_offsets *)
- obstack_alloc (&objfile->objfile_obstack,
- SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
- memset (objfile->section_offsets, 0,
- SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
+ objfile->section_offsets.assign (gdb_bfd_count_sections (objfile->obfd), 0);
/* This code is run when we first add the objfile with
symfile_add_with_addrs_or_offsets, when "addrs" not "offsets" are
if (bfd_sect_name == addrs[i].name)
{
- obj_section_offset (osect) = addrs[i].addr;
+ osect->set_offset (addrs[i].addr);
break;
}
}
macho_new_init, /* init anything gbl to entire symtab */
macho_symfile_init, /* read initial info, setup for sym_read() */
macho_symfile_read, /* read a symbol file into symtab */
- NULL, /* sym_read_psymbols */
macho_symfile_finish, /* finished with file, cleanup */
macho_symfile_offsets, /* xlate external to internal form */
default_symfile_segments, /* Get segment information from a file. */
NULL,
macho_symfile_relocate, /* Relocate a debug section. */
NULL, /* sym_get_probes */
- &psym_functions
};
+void _initialize_machoread ();
void
-_initialize_machoread (void)
+_initialize_machoread ()
{
add_symtab_fns (bfd_target_mach_o_flavour, &macho_sym_fns);