+ const asymbol *sym = *symp;
+ 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;
+ }
+ 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 (&symfile_complaints,
+ _("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;
+ }
+ }
+ }
+
+ /* Relocate symbols of the OSO. */
+ for (i = 0; symbol_table[i]; i++)
+ {
+ asymbol *sym = symbol_table[i];
+ bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
+
+ if (mach_o_sym->n_type & BFD_MACH_O_N_STAB)
+ 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;
+ }
+ }
+ 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 (abfd, sec, res);
+ sections_rebased[sec->index] = 1;
+ }
+ }
+ else
+ {
+ /* Mark the section as never rebased. */
+ sections_rebased[sec->index] = 2;
+ }
+ }