/* Mach-O support for BFD.
- Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+ Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+ 2009, 2010
Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
#define bfd_mach_o_object_p bfd_mach_o_gen_object_p
#define bfd_mach_o_core_p bfd_mach_o_gen_core_p
-#define bfd_mach_o_mkobject bfd_false
+#define bfd_mach_o_mkobject bfd_mach_o_gen_mkobject
#define FILE_ALIGN(off, algn) \
(((off) + ((file_ptr) 1 << (algn)) - 1) & ((file_ptr) -1 << (algn)))
{
const char *bfd_name;
const char *mach_o_name;
+ flagword flags;
};
static const struct mach_o_section_name_xlat dwarf_section_names_xlat[] =
{
- { ".debug_frame", "__debug_frame" },
- { ".debug_info", "__debug_info" },
- { ".debug_abbrev", "__debug_abbrev" },
- { ".debug_aranges", "__debug_aranges" },
- { ".debug_macinfo", "__debug_macinfo" },
- { ".debug_line", "__debug_line" },
- { ".debug_loc", "__debug_loc" },
- { ".debug_pubnames", "__debug_pubnames" },
- { ".debug_pubtypes", "__debug_pubtypes" },
- { ".debug_str", "__debug_str" },
- { ".debug_ranges", "__debug_ranges" },
- { NULL, NULL}
+ { ".debug_frame", "__debug_frame", SEC_DEBUGGING },
+ { ".debug_info", "__debug_info", SEC_DEBUGGING },
+ { ".debug_abbrev", "__debug_abbrev", SEC_DEBUGGING },
+ { ".debug_aranges", "__debug_aranges", SEC_DEBUGGING },
+ { ".debug_macinfo", "__debug_macinfo", SEC_DEBUGGING },
+ { ".debug_line", "__debug_line", SEC_DEBUGGING },
+ { ".debug_loc", "__debug_loc", SEC_DEBUGGING },
+ { ".debug_pubnames", "__debug_pubnames", SEC_DEBUGGING },
+ { ".debug_pubtypes", "__debug_pubtypes", SEC_DEBUGGING },
+ { ".debug_str", "__debug_str", SEC_DEBUGGING },
+ { ".debug_ranges", "__debug_ranges", SEC_DEBUGGING },
+ { NULL, NULL, 0}
};
static const struct mach_o_section_name_xlat text_section_names_xlat[] =
{
- { ".text", "__text" },
- { ".const", "__const" },
- { ".cstring", "__cstring" },
- { ".eh_frame", "__eh_frame" },
- { NULL, NULL}
+ { ".text", "__text", SEC_CODE | SEC_LOAD },
+ { ".const", "__const", SEC_READONLY | SEC_DATA | SEC_LOAD },
+ { ".cstring", "__cstring", SEC_READONLY | SEC_DATA | SEC_LOAD },
+ { ".eh_frame", "__eh_frame", SEC_READONLY | SEC_LOAD },
+ { NULL, NULL, 0}
};
static const struct mach_o_section_name_xlat data_section_names_xlat[] =
{
- { ".data", "__data" },
- { ".bss", "__bss" },
- { NULL, NULL}
+ { ".data", "__data", SEC_DATA | SEC_LOAD },
+ { ".const_data", "__const", SEC_DATA | SEC_LOAD },
+ { ".dyld", "__dyld", SEC_DATA | SEC_LOAD },
+ { ".lazy_symbol_ptr", "__la_symbol_ptr", SEC_DATA | SEC_LOAD },
+ { ".non_lazy_symbol_ptr", "__nl_symbol_ptr", SEC_DATA | SEC_LOAD },
+ { ".bss", "__bss", SEC_NO_FLAGS },
+ { NULL, NULL, 0}
};
struct mach_o_segment_name_xlat
/* Mach-O to bfd names. */
-static char *
-bfd_mach_o_convert_section_name_to_bfd (bfd *abfd, bfd_mach_o_section *section)
+static void
+bfd_mach_o_convert_section_name_to_bfd (bfd *abfd, bfd_mach_o_section *section,
+ char **name, flagword *flags)
{
const struct mach_o_segment_name_xlat *seg;
char *res;
unsigned int len;
const char *pfx = "";
+ *name = NULL;
+ *flags = SEC_NO_FLAGS;
+
for (seg = segsec_names_xlat; seg->segname; seg++)
{
if (strcmp (seg->segname, section->segname) == 0)
res = bfd_alloc (abfd, len + 1);
if (res == NULL)
- return NULL;
+ return;
strcpy (res, sec->bfd_name);
- return res;
+ *name = res;
+ *flags = sec->flags;
+ return;
}
}
}
res = bfd_alloc (abfd, len);
if (res == NULL)
- return NULL;
+ return;
snprintf (res, len, "%s%s.%s", pfx, section->segname, section->sectname);
- return res;
+ *name = res;
}
/* Convert a bfd section name to a Mach-O segment + section name. */
for (i = 0; i < mdata->nsects; i++)
{
bfd_mach_o_section *sec = mdata->sections[i];
- unsigned int j, first, last;
- bfd_mach_o_symtab_command *symtab = mdata->symtab;
+ unsigned int first, last;
bfd_vma addr;
bfd_vma entry_size;
void
bfd_mach_o_print_symbol (bfd *abfd,
- PTR afile,
+ void * afile,
asymbol *symbol,
bfd_print_symbol_type how)
{
fprintf (file, "%s", symbol->name);
break;
default:
- bfd_print_symbol_vandf (abfd, (PTR) file, symbol);
+ bfd_print_symbol_vandf (abfd, (void *) file, symbol);
if (asym->n_type & BFD_MACH_O_N_STAB)
name = bfd_get_stab_name (asym->n_type);
else
bfd_h_put_32 (abfd, header->reserved, buf + 28);
if (bfd_seek (abfd, 0, SEEK_SET) != 0
- || bfd_bwrite ((PTR) buf, size, abfd) != size)
+ || bfd_bwrite ((void *) buf, size, abfd) != size)
return FALSE;
return TRUE;
bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), buf + 4);
if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
- || bfd_bwrite ((PTR) buf, 8, abfd) != 8)
+ || bfd_bwrite ((void *) buf, 8, abfd) != 8)
return -1;
offset += cmd->flavours[i].size + 8;
res->addend = 0;
res->address = addr;
if (symnum & BFD_MACH_O_R_EXTERN)
- sym = syms + num;
+ {
+ sym = syms + num;
+ reloc.r_extern = 1;
+ }
else
{
BFD_ASSERT (num != 0);
BFD_ASSERT (num <= mdata->nsects);
sym = mdata->sections[num - 1]->bfdsection->symbol_ptr_ptr;
+ /* For a symbol defined in section S, the addend (stored in the
+ binary) contains the address of the section. To comply with
+ bfd conventio, substract the section address.
+ Use the address from the header, so that the user can modify
+ the vma of the section. */
+ res->addend = -mdata->sections[num - 1]->addr;
+ reloc.r_extern = 0;
}
res->sym_ptr_ptr = sym;
reloc.r_type = BFD_MACH_O_GET_R_TYPE (symnum);
bfd_put_32 (abfd, v, buf + 4);
}
- if (bfd_bwrite ((PTR) buf, BFD_MACH_O_RELENT_SIZE, abfd)
+ if (bfd_bwrite ((void *) buf, BFD_MACH_O_RELENT_SIZE, abfd)
!= BFD_MACH_O_RELENT_SIZE)
return FALSE;
}
bfd_h_put_32 (abfd, section->reserved1, buf + 60);
bfd_h_put_32 (abfd, section->reserved2, buf + 64);
- if (bfd_bwrite ((PTR) buf, BFD_MACH_O_SECTION_SIZE, abfd)
+ if (bfd_bwrite ((void *) buf, BFD_MACH_O_SECTION_SIZE, abfd)
!= BFD_MACH_O_SECTION_SIZE)
return -1;
bfd_h_put_32 (abfd, section->reserved2, buf + 72);
bfd_h_put_32 (abfd, section->reserved3, buf + 76);
- if (bfd_bwrite ((PTR) buf, BFD_MACH_O_SECTION_64_SIZE, abfd)
+ if (bfd_bwrite ((void *) buf, BFD_MACH_O_SECTION_64_SIZE, abfd)
!= BFD_MACH_O_SECTION_64_SIZE)
return -1;
bfd_h_put_32 (abfd, seg->flags, buf + 44);
if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || (bfd_bwrite ((PTR) buf, BFD_MACH_O_LC_SEGMENT_SIZE - 8, abfd)
+ || (bfd_bwrite ((void *) buf, BFD_MACH_O_LC_SEGMENT_SIZE - 8, abfd)
!= BFD_MACH_O_LC_SEGMENT_SIZE - 8))
return -1;
bfd_h_put_32 (abfd, seg->flags, buf + 60);
if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || (bfd_bwrite ((PTR) buf, BFD_MACH_O_LC_SEGMENT_64_SIZE - 8, abfd)
+ || (bfd_bwrite ((void *) buf, BFD_MACH_O_LC_SEGMENT_64_SIZE - 8, abfd)
!= BFD_MACH_O_LC_SEGMENT_64_SIZE - 8))
return -1;
for (i = 0; i < sym->nsyms; i++)
{
- unsigned char buf[16];
- bfd_size_type index;
+ bfd_size_type str_index;
bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
/* Compute name index. */
/* An index of 0 always means the empty string. */
if (s->symbol.name == 0 || s->symbol.name[0] == '\0')
- index = 0;
+ str_index = 0;
else
{
- index = _bfd_stringtab_add (strtab, s->symbol.name, TRUE, FALSE);
- if (index == (bfd_size_type) -1)
+ str_index = _bfd_stringtab_add (strtab, s->symbol.name, TRUE, FALSE);
+ if (str_index == (bfd_size_type) -1)
goto err;
}
- bfd_h_put_32 (abfd, index, buf);
+ bfd_h_put_32 (abfd, str_index, buf);
bfd_h_put_8 (abfd, s->n_type, buf + 4);
bfd_h_put_8 (abfd, s->n_sect, buf + 5);
bfd_h_put_16 (abfd, s->n_desc, buf + 6);
else
bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value, buf + 8);
- if (bfd_bwrite ((PTR) buf, symlen, abfd) != symlen)
+ if (bfd_bwrite ((void *) buf, symlen, abfd) != symlen)
goto err;
}
sym->strsize = _bfd_stringtab_size (strtab);
bfd_h_put_32 (abfd, sym->strsize, buf + 12);
if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bwrite ((PTR) buf, 16, abfd) != 16)
+ || bfd_bwrite ((void *) buf, 16, abfd) != 16)
return FALSE;
return TRUE;
bfd_h_put_32 (abfd, cur->len, buf + 4);
if (bfd_seek (abfd, cur->offset, SEEK_SET) != 0
- || bfd_bwrite ((PTR) buf, 8, abfd) != 8)
+ || bfd_bwrite ((void *) buf, 8, abfd) != 8)
return FALSE;
switch (cur->type)
/* Just read the magic number. */
if (bfd_seek (abfd, 0, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, 4, abfd) != 4)
+ || bfd_bread ((void *) buf, 4, abfd) != 4)
return FALSE;
if (bfd_getb32 (buf) == BFD_MACH_O_MH_MAGIC)
BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
if (bfd_seek (abfd, 0, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, size, abfd) != size)
+ || bfd_bread ((void *) buf, size, abfd) != size)
return FALSE;
header->cputype = (*get32) (buf + 4);
char *sname;
flagword flags;
- sname = bfd_mach_o_convert_section_name_to_bfd (abfd, section);
+ bfd_mach_o_convert_section_name_to_bfd (abfd, section, &sname, &flags);
if (sname == NULL)
return NULL;
- if (section->flags & BFD_MACH_O_S_ATTR_DEBUG)
- flags = SEC_HAS_CONTENTS | SEC_DEBUGGING;
+ if (flags == SEC_NO_FLAGS)
+ {
+ /* Try to guess flags. */
+ if (section->flags & BFD_MACH_O_S_ATTR_DEBUG)
+ flags = SEC_DEBUGGING;
+ else
+ {
+ flags = SEC_ALLOC;
+ if ((section->flags & BFD_MACH_O_SECTION_TYPE_MASK)
+ != BFD_MACH_O_S_ZEROFILL)
+ {
+ flags |= SEC_LOAD;
+ if (prot & BFD_MACH_O_PROT_EXECUTE)
+ flags |= SEC_CODE;
+ if (prot & BFD_MACH_O_PROT_WRITE)
+ flags |= SEC_DATA;
+ else if (prot & BFD_MACH_O_PROT_READ)
+ flags |= SEC_READONLY;
+ }
+ }
+ }
else
{
- flags = SEC_ALLOC;
- if ((section->flags & BFD_MACH_O_SECTION_TYPE_MASK)
- != BFD_MACH_O_S_ZEROFILL)
- {
- flags |= SEC_HAS_CONTENTS | SEC_LOAD;
- if (prot & BFD_MACH_O_PROT_EXECUTE)
- flags |= SEC_CODE;
- if (prot & BFD_MACH_O_PROT_WRITE)
- flags |= SEC_DATA;
- else if (prot & BFD_MACH_O_PROT_READ)
- flags |= SEC_READONLY;
- }
+ if ((flags & SEC_DEBUGGING) == 0)
+ flags |= SEC_ALLOC;
}
+
+ if (section->offset != 0)
+ flags |= SEC_HAS_CONTENTS;
if (section->nreloc != 0)
flags |= SEC_RELOC;
unsigned char buf[BFD_MACH_O_SECTION_SIZE];
if (bfd_seek (abfd, offset, SEEK_SET) != 0
- || (bfd_bread ((PTR) buf, BFD_MACH_O_SECTION_SIZE, abfd)
+ || (bfd_bread ((void *) buf, BFD_MACH_O_SECTION_SIZE, abfd)
!= BFD_MACH_O_SECTION_SIZE))
return -1;
unsigned char buf[BFD_MACH_O_SECTION_64_SIZE];
if (bfd_seek (abfd, offset, SEEK_SET) != 0
- || (bfd_bread ((PTR) buf, BFD_MACH_O_SECTION_64_SIZE, abfd)
+ || (bfd_bread ((void *) buf, BFD_MACH_O_SECTION_64_SIZE, abfd)
!= BFD_MACH_O_SECTION_64_SIZE))
return -1;
BFD_ASSERT (sym->strtab != NULL);
if (bfd_seek (abfd, symoff, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, symwidth, abfd) != symwidth)
+ || bfd_bread ((void *) buf, symwidth, abfd) != symwidth)
{
fprintf (stderr, "bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %lu\n",
symwidth, (unsigned long) symoff);
return -1;
if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0
- || bfd_bread ((PTR) sym->strtab, sym->strsize, abfd) != sym->strsize)
+ || bfd_bread ((void *) sym->strtab, sym->strsize, abfd) != sym->strsize)
{
bfd_set_error (bfd_error_file_truncated);
return -1;
unsigned long i)
{
unsigned long isymoff = dysym->indirectsymoff + (i * 4);
- unsigned long symindex;
+ unsigned long sym_index;
unsigned char buf[4];
BFD_ASSERT (i < dysym->nindirectsyms);
if (bfd_seek (abfd, isymoff, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, 4, abfd) != 4)
+ || bfd_bread ((void *) buf, 4, abfd) != 4)
{
fprintf (stderr, "bfd_mach_o_read_dysymtab_symbol: unable to read %lu bytes at %lu\n",
(unsigned long) 4, isymoff);
return -1;
}
- symindex = bfd_h_get_32 (abfd, buf);
+ sym_index = bfd_h_get_32 (abfd, buf);
- return bfd_mach_o_read_symtab_symbol (abfd, sym, s, symindex);
+ return bfd_mach_o_read_symtab_symbol (abfd, sym, s, sym_index);
}
static const char *
|| (command->type == BFD_MACH_O_LC_LOAD_DYLINKER));
if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, 4, abfd) != 4)
+ || bfd_bread ((void *) buf, 4, abfd) != 4)
return -1;
nameoff = bfd_h_get_32 (abfd, buf + 0);
}
if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, 16, abfd) != 16)
+ || bfd_bread ((void *) buf, 16, abfd) != 16)
return -1;
nameoff = bfd_h_get_32 (abfd, buf + 0);
return -1;
if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, 8, abfd) != 8)
+ || bfd_bread ((void *) buf, 8, abfd) != 8)
return -1;
offset += 8 + bfd_h_get_32 (abfd, buf + 4) * 4;
return -1;
if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, 8, abfd) != 8)
+ || bfd_bread ((void *) buf, 8, abfd) != 8)
return -1;
cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, buf);
BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, 72, abfd) != 72)
+ || bfd_bread ((void *) buf, 72, abfd) != 72)
return -1;
cmd->ilocalsym = bfd_h_get_32 (abfd, buf + 0);
if (cmd->nmodtab != 0)
{
- char buf[56];
unsigned int i;
int wide = bfd_mach_o_wide_p (abfd);
unsigned int module_len = wide ? 56 : 52;
bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
unsigned long v;
- if (bfd_bread ((PTR) buf, module_len, abfd) != module_len)
+ if (bfd_bread ((void *) buf, module_len, abfd) != module_len)
return -1;
module->module_name_idx = bfd_h_get_32 (abfd, buf + 0);
if (cmd->ntoc != 0)
{
- char buf[8];
unsigned int i;
cmd->dylib_toc = bfd_alloc
{
bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
- if (bfd_bread ((PTR) buf, 8, abfd) != 8)
+ if (bfd_bread ((void *) buf, 8, abfd) != 8)
return -1;
toc->symbol_index = bfd_h_get_32 (abfd, buf + 0);
if (cmd->nindirectsyms != 0)
{
- char buf[4];
unsigned int i;
cmd->indirect_syms = bfd_alloc
{
unsigned int *is = &cmd->indirect_syms[i];
- if (bfd_bread ((PTR) buf, 4, abfd) != 4)
+ if (bfd_bread ((void *) buf, 4, abfd) != 4)
return -1;
*is = bfd_h_get_32 (abfd, buf + 0);
if (cmd->nextrefsyms != 0)
{
- char buf[4];
unsigned long v;
unsigned int i;
{
bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
- if (bfd_bread ((PTR) buf, 4, abfd) != 4)
+ if (bfd_bread ((void *) buf, 4, abfd) != 4)
return -1;
/* Fields isym and flags are written as bit-fields, thus we need
BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, 16, abfd) != 16)
+ || bfd_bread ((void *) buf, 16, abfd) != 16)
return -1;
symtab->symoff = bfd_h_get_32 (abfd, buf);
bfd_mach_o_read_uuid (bfd *abfd, bfd_mach_o_load_command *command)
{
bfd_mach_o_uuid_command *cmd = &command->command.uuid;
- asection *bfdsec;
- char *sname;
- static const char prefix[] = "LC_UUID";
BFD_ASSERT (command->type == BFD_MACH_O_LC_UUID);
if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((PTR) cmd->uuid, 16, abfd) != 16)
- return -1;
-
- sname = bfd_alloc (abfd, strlen (prefix) + 1);
- if (sname == NULL)
+ || bfd_bread ((void *) cmd->uuid, 16, abfd) != 16)
return -1;
- strcpy (sname, prefix);
-
- bfdsec = bfd_make_section_anyway_with_flags (abfd, sname, SEC_HAS_CONTENTS);
- if (bfdsec == NULL)
- return -1;
-
- bfdsec->vma = 0;
- bfdsec->lma = 0;
- bfdsec->size = command->len - 8;
- bfdsec->filepos = command->offset + 8;
- bfdsec->alignment_power = 0;
-
- cmd->section = bfdsec;
return 0;
}
char buf[8];
if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, 8, abfd) != 8)
+ || bfd_bread ((void *) buf, 8, abfd) != 8)
return -1;
cmd->dataoff = bfd_get_32 (abfd, buf + 0);
unsigned long off;
if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, 4, abfd) != 4)
+ || bfd_bread ((void *) buf, 4, abfd) != 4)
return -1;
off = bfd_get_32 (abfd, buf + 0);
if (cmd->str == NULL)
return -1;
if (bfd_seek (abfd, cmd->stroff, SEEK_SET) != 0
- || bfd_bread ((PTR) cmd->str, cmd->str_len, abfd) != cmd->str_len)
+ || bfd_bread ((void *) cmd->str, cmd->str_len, abfd) != cmd->str_len)
return -1;
return 0;
}
char buf[40];
if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, sizeof (buf), abfd) != sizeof (buf))
+ || bfd_bread ((void *) buf, sizeof (buf), abfd) != sizeof (buf))
return -1;
cmd->rebase_off = bfd_get_32 (abfd, buf + 0);
BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, 64, abfd) != 64)
+ || bfd_bread ((void *) buf, 64, abfd) != 64)
return -1;
memcpy (seg->segname, buf, 16);
BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, 48, abfd) != 48)
+ || bfd_bread ((void *) buf, 48, abfd) != 48)
return -1;
memcpy (seg->segname, buf, 16);
/* Read command type and length. */
if (bfd_seek (abfd, command->offset, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, 8, abfd) != 8)
+ || bfd_bread ((void *) buf, 8, abfd) != 8)
return -1;
command->type = bfd_h_get_32 (abfd, buf) & ~BFD_MACH_O_LC_REQ_DYLD;
case BFD_MACH_O_LC_SUB_UMBRELLA:
case BFD_MACH_O_LC_SUB_LIBRARY:
case BFD_MACH_O_LC_SUB_CLIENT:
+ case BFD_MACH_O_LC_RPATH:
if (bfd_mach_o_read_str (abfd, command) != 0)
return -1;
break;
return 0;
}
+bfd_boolean
+bfd_mach_o_set_arch_mach (bfd *abfd,
+ enum bfd_architecture arch,
+ unsigned long machine)
+{
+ bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
+
+ /* If this isn't the right architecture for this backend, and this
+ isn't the generic backend, fail. */
+ if (arch != bed->arch
+ && arch != bfd_arch_unknown
+ && bed->arch != bfd_arch_unknown)
+ return FALSE;
+
+ return bfd_default_set_arch_mach (abfd, arch, machine);
+}
+
int
bfd_mach_o_scan (bfd *abfd,
bfd_mach_o_header *header,
return TRUE;
}
+static bfd_boolean
+bfd_mach_o_gen_mkobject (bfd *abfd)
+{
+ bfd_mach_o_data_struct *mdata;
+
+ if (!bfd_mach_o_mkobject_init (abfd))
+ return FALSE;
+
+ mdata = bfd_mach_o_get_data (abfd);
+ mdata->header.magic = BFD_MACH_O_MH_MAGIC;
+ mdata->header.cputype = 0;
+ mdata->header.cpusubtype = 0;
+ mdata->header.byteorder = abfd->xvec->byteorder;
+ mdata->header.version = 1;
+
+ return TRUE;
+}
+
const bfd_target *
bfd_mach_o_header_p (bfd *abfd,
bfd_mach_o_filetype filetype,
unsigned long i;
if (bfd_seek (abfd, 0, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, 8, abfd) != 8)
+ || bfd_bread ((void *) buf, 8, abfd) != 8)
goto error;
adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
for (i = 0; i < adata->nfat_arch; i++)
{
if (bfd_seek (abfd, 8 + 20 * i, SEEK_SET) != 0
- || bfd_bread ((PTR) buf, 20, abfd) != 20)
+ || bfd_bread ((void *) buf, 20, abfd) != 20)
goto error;
adata->archentries[i].cputype = bfd_getb32 (buf);
adata->archentries[i].cpusubtype = bfd_getb32 (buf + 4);
}
bfd_boolean
-bfd_mach_o_bfd_print_private_bfd_data (bfd *abfd, PTR ptr)
+bfd_mach_o_bfd_print_private_bfd_data (bfd *abfd, void * ptr)
{
bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
FILE *file = (FILE *) ptr;
case BFD_MACH_O_LC_UUID:
{
bfd_mach_o_uuid_command *uuid = &cmd->command.uuid;
- unsigned int i;
+ unsigned int j;
- for (i = 0; i < sizeof (uuid->uuid); i++)
- fprintf (file, " %02x", uuid->uuid[i]);
+ for (j = 0; j < sizeof (uuid->uuid); j ++)
+ fprintf (file, " %02x", uuid->uuid[j]);
fputc ('\n', file);
}
break;
case BFD_MACH_O_LC_SUB_UMBRELLA:
case BFD_MACH_O_LC_SUB_LIBRARY:
case BFD_MACH_O_LC_SUB_CLIENT:
+ case BFD_MACH_O_LC_RPATH:
{
bfd_mach_o_str_command *str = &cmd->command.str;
fprintf (file, " %s\n", str->str);
#define TARGET_NAME mach_o_be_vec
#define TARGET_STRING "mach-o-be"
+#define TARGET_ARCHITECTURE bfd_arch_unknown
#define TARGET_BIG_ENDIAN 1
#define TARGET_ARCHIVE 0
#include "mach-o-target.c"
#undef TARGET_NAME
#undef TARGET_STRING
+#undef TARGET_ARCHITECTURE
#undef TARGET_BIG_ENDIAN
#undef TARGET_ARCHIVE
#define TARGET_NAME mach_o_le_vec
#define TARGET_STRING "mach-o-le"
+#define TARGET_ARCHITECTURE bfd_arch_unknown
#define TARGET_BIG_ENDIAN 0
#define TARGET_ARCHIVE 0
#undef TARGET_NAME
#undef TARGET_STRING
+#undef TARGET_ARCHITECTURE
#undef TARGET_BIG_ENDIAN
#undef TARGET_ARCHIVE
+/* Not yet handled: creating an archive. */
+#define bfd_mach_o_mkarchive _bfd_noarchive_mkarchive
+
+/* Not used. */
+#define bfd_mach_o_read_ar_hdr _bfd_noarchive_read_ar_hdr
+#define bfd_mach_o_write_ar_hdr _bfd_noarchive_write_ar_hdr
+#define bfd_mach_o_slurp_armap _bfd_noarchive_slurp_armap
+#define bfd_mach_o_slurp_extended_name_table _bfd_noarchive_slurp_extended_name_table
+#define bfd_mach_o_construct_extended_name_table _bfd_noarchive_construct_extended_name_table
+#define bfd_mach_o_truncate_arname _bfd_noarchive_truncate_arname
+#define bfd_mach_o_write_armap _bfd_noarchive_write_armap
+#define bfd_mach_o_get_elt_at_index _bfd_noarchive_get_elt_at_index
+#define bfd_mach_o_generic_stat_arch_elt _bfd_noarchive_generic_stat_arch_elt
+#define bfd_mach_o_update_armap_timestamp _bfd_noarchive_update_armap_timestamp
+
#define TARGET_NAME mach_o_fat_vec
#define TARGET_STRING "mach-o-fat"
+#define TARGET_ARCHITECTURE bfd_arch_unknown
#define TARGET_BIG_ENDIAN 1
#define TARGET_ARCHIVE 1
#undef TARGET_NAME
#undef TARGET_STRING
+#undef TARGET_ARCHITECTURE
#undef TARGET_BIG_ENDIAN
#undef TARGET_ARCHIVE