#include "libbfd.h"
#include "libiberty.h"
#include "aout/stab_gnu.h"
+#include "mach-o/reloc.h"
+#include "mach-o/external.h"
#include <ctype.h>
#define bfd_mach_o_object_p bfd_mach_o_gen_object_p
static bfd_boolean
bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
{
- unsigned char buf[32];
+ struct mach_o_header_external raw;
unsigned int size;
size = mach_o_wide_p (header) ?
BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
- bfd_h_put_32 (abfd, header->magic, buf + 0);
- bfd_h_put_32 (abfd, header->cputype, buf + 4);
- bfd_h_put_32 (abfd, header->cpusubtype, buf + 8);
- bfd_h_put_32 (abfd, header->filetype, buf + 12);
- bfd_h_put_32 (abfd, header->ncmds, buf + 16);
- bfd_h_put_32 (abfd, header->sizeofcmds, buf + 20);
- bfd_h_put_32 (abfd, header->flags, buf + 24);
+ bfd_h_put_32 (abfd, header->magic, raw.magic);
+ bfd_h_put_32 (abfd, header->cputype, raw.cputype);
+ bfd_h_put_32 (abfd, header->cpusubtype, raw.cpusubtype);
+ bfd_h_put_32 (abfd, header->filetype, raw.filetype);
+ bfd_h_put_32 (abfd, header->ncmds, raw.ncmds);
+ bfd_h_put_32 (abfd, header->sizeofcmds, raw.sizeofcmds);
+ bfd_h_put_32 (abfd, header->flags, raw.flags);
if (mach_o_wide_p (header))
- bfd_h_put_32 (abfd, header->reserved, buf + 28);
+ bfd_h_put_32 (abfd, header->reserved, raw.reserved);
if (bfd_seek (abfd, 0, SEEK_SET) != 0
- || bfd_bwrite ((void *) buf, size, abfd) != size)
+ || bfd_bwrite (&raw, size, abfd) != size)
return FALSE;
return TRUE;
{
bfd_mach_o_thread_command *cmd = &command->command.thread;
unsigned int i;
- unsigned char buf[8];
+ struct mach_o_thread_command_external raw;
unsigned int offset;
BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
for (i = 0; i < cmd->nflavours; i++)
{
BFD_ASSERT ((cmd->flavours[i].size % 4) == 0);
- BFD_ASSERT (cmd->flavours[i].offset == (command->offset + offset + 8));
+ BFD_ASSERT (cmd->flavours[i].offset ==
+ (command->offset + offset + BFD_MACH_O_LC_SIZE));
- bfd_h_put_32 (abfd, cmd->flavours[i].flavour, buf);
- bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), buf + 4);
+ bfd_h_put_32 (abfd, cmd->flavours[i].flavour, raw.flavour);
+ bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), raw.count);
if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
- || bfd_bwrite ((void *) buf, 8, abfd) != 8)
+ || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
return -1;
- offset += cmd->flavours[i].size + 8;
+ offset += cmd->flavours[i].size + sizeof (raw);
}
return 0;
}
static int
-bfd_mach_o_canonicalize_one_reloc (bfd *abfd, char *buf,
+bfd_mach_o_canonicalize_one_reloc (bfd *abfd,
+ struct mach_o_reloc_info_external *raw,
arelent *res, asymbol **syms)
{
bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
bfd_vma symnum;
asymbol **sym;
- addr = bfd_get_32 (abfd, buf + 0);
- symnum = bfd_get_32 (abfd, buf + 4);
+ addr = bfd_get_32 (abfd, raw->r_address);
+ symnum = bfd_get_32 (abfd, raw->r_symbolnum);
if (addr & BFD_MACH_O_SR_SCATTERED)
{
arelent *res, asymbol **syms)
{
unsigned long i;
- char *native_relocs;
+ struct mach_o_reloc_info_external *native_relocs;
bfd_size_type native_size;
/* Allocate and read relocs. */
native_size = count * BFD_MACH_O_RELENT_SIZE;
- native_relocs = bfd_malloc (native_size);
+ native_relocs =
+ (struct mach_o_reloc_info_external *) bfd_malloc (native_size);
if (native_relocs == NULL)
return -1;
for (i = 0; i < count; i++)
{
- char *buf = native_relocs + BFD_MACH_O_RELENT_SIZE * i;
-
- if (bfd_mach_o_canonicalize_one_reloc (abfd, buf, &res[i], syms) < 0)
+ if (bfd_mach_o_canonicalize_one_reloc (abfd, &native_relocs[i],
+ &res[i], syms) < 0)
goto err;
}
free (native_relocs);
for (i = 0; i < section->nreloc; i++)
{
arelent *rel = entries[i];
- char buf[8];
+ struct mach_o_reloc_info_external raw;
bfd_mach_o_reloc_info info, *pinfo = &info;
/* Convert relocation to an intermediate representation. */
| BFD_MACH_O_SET_SR_LENGTH(pinfo->r_length)
| BFD_MACH_O_SET_SR_TYPE(pinfo->r_type)
| BFD_MACH_O_SET_SR_ADDRESS(pinfo->r_address);
- bfd_put_32 (abfd, v, buf);
- bfd_put_32 (abfd, pinfo->r_value, buf + 4);
+ /* Note: scattered relocs have field in reverse order... */
+ bfd_put_32 (abfd, v, raw.r_address);
+ bfd_put_32 (abfd, pinfo->r_value, raw.r_symbolnum);
}
else
{
unsigned long v;
- bfd_put_32 (abfd, pinfo->r_address, buf);
+ bfd_put_32 (abfd, pinfo->r_address, raw.r_address);
v = BFD_MACH_O_SET_R_SYMBOLNUM (pinfo->r_value)
| (pinfo->r_pcrel ? BFD_MACH_O_R_PCREL : 0)
| BFD_MACH_O_SET_R_LENGTH (pinfo->r_length)
| (pinfo->r_extern ? BFD_MACH_O_R_EXTERN : 0)
| BFD_MACH_O_SET_R_TYPE (pinfo->r_type);
- bfd_put_32 (abfd, v, buf + 4);
+ bfd_put_32 (abfd, v, raw.r_symbolnum);
}
- if (bfd_bwrite ((void *) buf, BFD_MACH_O_RELENT_SIZE, abfd)
+ if (bfd_bwrite (&raw, BFD_MACH_O_RELENT_SIZE, abfd)
!= BFD_MACH_O_RELENT_SIZE)
return FALSE;
}
static int
bfd_mach_o_write_section_32 (bfd *abfd, bfd_mach_o_section *section)
{
- unsigned char buf[BFD_MACH_O_SECTION_SIZE];
-
- memcpy (buf, section->sectname, 16);
- memcpy (buf + 16, section->segname, 16);
- bfd_h_put_32 (abfd, section->addr, buf + 32);
- bfd_h_put_32 (abfd, section->size, buf + 36);
- bfd_h_put_32 (abfd, section->offset, buf + 40);
- bfd_h_put_32 (abfd, section->align, buf + 44);
- bfd_h_put_32 (abfd, section->reloff, buf + 48);
- bfd_h_put_32 (abfd, section->nreloc, buf + 52);
- bfd_h_put_32 (abfd, section->flags, buf + 56);
- bfd_h_put_32 (abfd, section->reserved1, buf + 60);
- bfd_h_put_32 (abfd, section->reserved2, buf + 64);
-
- if (bfd_bwrite ((void *) buf, BFD_MACH_O_SECTION_SIZE, abfd)
+ struct mach_o_section_32_external raw;
+
+ memcpy (raw.sectname, section->sectname, 16);
+ memcpy (raw.segname + 16, section->segname, 16);
+ bfd_h_put_32 (abfd, section->addr, raw.addr);
+ bfd_h_put_32 (abfd, section->size, raw.size);
+ bfd_h_put_32 (abfd, section->offset, raw.offset);
+ bfd_h_put_32 (abfd, section->align, raw.align);
+ bfd_h_put_32 (abfd, section->reloff, raw.reloff);
+ bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
+ bfd_h_put_32 (abfd, section->flags, raw.flags);
+ bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
+ bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
+
+ if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
!= BFD_MACH_O_SECTION_SIZE)
return -1;
static int
bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section)
{
- unsigned char buf[BFD_MACH_O_SECTION_64_SIZE];
-
- memcpy (buf, section->sectname, 16);
- memcpy (buf + 16, section->segname, 16);
- bfd_h_put_64 (abfd, section->addr, buf + 32);
- bfd_h_put_64 (abfd, section->size, buf + 40);
- bfd_h_put_32 (abfd, section->offset, buf + 48);
- bfd_h_put_32 (abfd, section->align, buf + 52);
- bfd_h_put_32 (abfd, section->reloff, buf + 56);
- bfd_h_put_32 (abfd, section->nreloc, buf + 60);
- bfd_h_put_32 (abfd, section->flags, buf + 64);
- bfd_h_put_32 (abfd, section->reserved1, buf + 68);
- bfd_h_put_32 (abfd, section->reserved2, buf + 72);
- bfd_h_put_32 (abfd, section->reserved3, buf + 76);
-
- if (bfd_bwrite ((void *) buf, BFD_MACH_O_SECTION_64_SIZE, abfd)
+ struct mach_o_section_64_external raw;
+
+ memcpy (raw.sectname, section->sectname, 16);
+ memcpy (raw.segname, section->segname, 16);
+ bfd_h_put_64 (abfd, section->addr, raw.addr);
+ bfd_h_put_64 (abfd, section->size, raw.size);
+ bfd_h_put_32 (abfd, section->offset, raw.offset);
+ bfd_h_put_32 (abfd, section->align, raw.align);
+ bfd_h_put_32 (abfd, section->reloff, raw.reloff);
+ bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
+ bfd_h_put_32 (abfd, section->flags, raw.flags);
+ bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
+ bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
+ bfd_h_put_32 (abfd, section->reserved3, raw.reserved3);
+
+ if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
!= BFD_MACH_O_SECTION_64_SIZE)
return -1;
static int
bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
{
- unsigned char buf[BFD_MACH_O_LC_SEGMENT_SIZE];
+ struct mach_o_segment_command_32_external raw;
bfd_mach_o_segment_command *seg = &command->command.segment;
unsigned long i;
if (!bfd_mach_o_write_relocs (abfd, &seg->sections[i]))
return -1;
- memcpy (buf, seg->segname, 16);
- bfd_h_put_32 (abfd, seg->vmaddr, buf + 16);
- bfd_h_put_32 (abfd, seg->vmsize, buf + 20);
- bfd_h_put_32 (abfd, seg->fileoff, buf + 24);
- bfd_h_put_32 (abfd, seg->filesize, buf + 28);
- bfd_h_put_32 (abfd, seg->maxprot, buf + 32);
- bfd_h_put_32 (abfd, seg->initprot, buf + 36);
- bfd_h_put_32 (abfd, seg->nsects, buf + 40);
- bfd_h_put_32 (abfd, seg->flags, buf + 44);
+ memcpy (raw.segname, seg->segname, 16);
+ bfd_h_put_32 (abfd, seg->vmaddr, raw.vmaddr);
+ bfd_h_put_32 (abfd, seg->vmsize, raw.vmsize);
+ bfd_h_put_32 (abfd, seg->fileoff, raw.fileoff);
+ bfd_h_put_32 (abfd, seg->filesize, raw.filesize);
+ bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
+ bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
+ bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
+ bfd_h_put_32 (abfd, seg->flags, raw.flags);
- if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || (bfd_bwrite ((void *) buf, BFD_MACH_O_LC_SEGMENT_SIZE - 8, abfd)
- != BFD_MACH_O_LC_SEGMENT_SIZE - 8))
+ if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
+ || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
return -1;
for (i = 0; i < seg->nsects; i++)
static int
bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
{
- unsigned char buf[BFD_MACH_O_LC_SEGMENT_64_SIZE];
+ struct mach_o_segment_command_64_external raw;
bfd_mach_o_segment_command *seg = &command->command.segment;
unsigned long i;
if (!bfd_mach_o_write_relocs (abfd, &seg->sections[i]))
return -1;
- memcpy (buf, seg->segname, 16);
- bfd_h_put_64 (abfd, seg->vmaddr, buf + 16);
- bfd_h_put_64 (abfd, seg->vmsize, buf + 24);
- bfd_h_put_64 (abfd, seg->fileoff, buf + 32);
- bfd_h_put_64 (abfd, seg->filesize, buf + 40);
- bfd_h_put_32 (abfd, seg->maxprot, buf + 48);
- bfd_h_put_32 (abfd, seg->initprot, buf + 52);
- bfd_h_put_32 (abfd, seg->nsects, buf + 56);
- bfd_h_put_32 (abfd, seg->flags, buf + 60);
-
- if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || (bfd_bwrite ((void *) buf, BFD_MACH_O_LC_SEGMENT_64_SIZE - 8, abfd)
- != BFD_MACH_O_LC_SEGMENT_64_SIZE - 8))
+ memcpy (raw.segname, seg->segname, 16);
+ bfd_h_put_64 (abfd, seg->vmaddr, raw.vmaddr);
+ bfd_h_put_64 (abfd, seg->vmsize, raw.vmsize);
+ bfd_h_put_64 (abfd, seg->fileoff, raw.fileoff);
+ bfd_h_put_64 (abfd, seg->filesize, raw.filesize);
+ bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
+ bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
+ bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
+ bfd_h_put_32 (abfd, seg->flags, raw.flags);
+
+ if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
+ || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
return -1;
for (i = 0; i < seg->nsects; i++)
{
bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
bfd_mach_o_symtab_command *sym = &command->command.symtab;
- unsigned char buf[16];
unsigned long i;
unsigned int wide = bfd_mach_o_wide_p (abfd);
unsigned int symlen = wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
if (str_index == (bfd_size_type) -1)
goto err;
}
- 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);
+
if (wide)
- bfd_h_put_64 (abfd, s->symbol.section->vma + s->symbol.value, buf + 8);
+ {
+ struct mach_o_nlist_64_external raw;
+
+ bfd_h_put_32 (abfd, str_index, raw.n_strx);
+ bfd_h_put_8 (abfd, s->n_type, raw.n_type);
+ bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
+ bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
+ bfd_h_put_64 (abfd, s->symbol.section->vma + s->symbol.value,
+ raw.n_value);
+
+ if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
+ goto err;
+ }
else
- bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value, buf + 8);
+ {
+ struct mach_o_nlist_external raw;
- if (bfd_bwrite ((void *) buf, symlen, abfd) != symlen)
- goto err;
+ bfd_h_put_32 (abfd, str_index, raw.n_strx);
+ bfd_h_put_8 (abfd, s->n_type, raw.n_type);
+ bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
+ bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
+ bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value,
+ raw.n_value);
+
+ if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
+ goto err;
+ }
}
sym->strsize = _bfd_stringtab_size (strtab);
sym->stroff = mdata->filelen;
_bfd_stringtab_free (strtab);
/* The command. */
- bfd_h_put_32 (abfd, sym->symoff, buf);
- bfd_h_put_32 (abfd, sym->nsyms, buf + 4);
- bfd_h_put_32 (abfd, sym->stroff, buf + 8);
- bfd_h_put_32 (abfd, sym->strsize, buf + 12);
+ {
+ struct mach_o_symtab_command_external raw;
- if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bwrite ((void *) buf, 16, abfd) != 16)
- return FALSE;
+ bfd_h_put_32 (abfd, sym->symoff, raw.symoff);
+ bfd_h_put_32 (abfd, sym->nsyms, raw.nsyms);
+ bfd_h_put_32 (abfd, sym->stroff, raw.stroff);
+ bfd_h_put_32 (abfd, sym->strsize, raw.strsize);
+
+ if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
+ || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
+ return FALSE;
+ }
return TRUE;
for (i = 0; i < mdata->header.ncmds; i++)
{
- unsigned char buf[8];
+ struct mach_o_load_command_external raw;
bfd_mach_o_load_command *cur = &mdata->commands[i];
unsigned long typeflag;
typeflag = cur->type | (cur->type_required ? BFD_MACH_O_LC_REQ_DYLD : 0);
- bfd_h_put_32 (abfd, typeflag, buf);
- bfd_h_put_32 (abfd, cur->len, buf + 4);
+ bfd_h_put_32 (abfd, typeflag, raw.cmd);
+ bfd_h_put_32 (abfd, cur->len, raw.cmdsize);
if (bfd_seek (abfd, cur->offset, SEEK_SET) != 0
- || bfd_bwrite ((void *) buf, 8, abfd) != 8)
+ || bfd_bwrite (&raw, BFD_MACH_O_LC_SIZE, abfd) != 8)
return FALSE;
switch (cur->type)
static bfd_boolean
bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
{
- unsigned char buf[32];
+ struct mach_o_header_external raw;
unsigned int size;
bfd_vma (*get32) (const void *) = NULL;
/* Just read the magic number. */
if (bfd_seek (abfd, 0, SEEK_SET) != 0
- || bfd_bread ((void *) buf, 4, abfd) != 4)
+ || bfd_bread (raw.magic, sizeof (raw.magic), abfd) != 4)
return FALSE;
- if (bfd_getb32 (buf) == BFD_MACH_O_MH_MAGIC)
+ if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
{
header->byteorder = BFD_ENDIAN_BIG;
header->magic = BFD_MACH_O_MH_MAGIC;
header->version = 1;
get32 = bfd_getb32;
}
- else if (bfd_getl32 (buf) == BFD_MACH_O_MH_MAGIC)
+ else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
{
header->byteorder = BFD_ENDIAN_LITTLE;
header->magic = BFD_MACH_O_MH_MAGIC;
header->version = 1;
get32 = bfd_getl32;
}
- else if (bfd_getb32 (buf) == BFD_MACH_O_MH_MAGIC_64)
+ else if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
{
header->byteorder = BFD_ENDIAN_BIG;
header->magic = BFD_MACH_O_MH_MAGIC_64;
header->version = 2;
get32 = bfd_getb32;
}
- else if (bfd_getl32 (buf) == BFD_MACH_O_MH_MAGIC_64)
+ else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
{
header->byteorder = BFD_ENDIAN_LITTLE;
header->magic = BFD_MACH_O_MH_MAGIC_64;
BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
if (bfd_seek (abfd, 0, SEEK_SET) != 0
- || bfd_bread ((void *) buf, size, abfd) != size)
+ || bfd_bread (&raw, size, abfd) != size)
return FALSE;
- header->cputype = (*get32) (buf + 4);
- header->cpusubtype = (*get32) (buf + 8);
- header->filetype = (*get32) (buf + 12);
- header->ncmds = (*get32) (buf + 16);
- header->sizeofcmds = (*get32) (buf + 20);
- header->flags = (*get32) (buf + 24);
+ header->cputype = (*get32) (raw.cputype);
+ header->cpusubtype = (*get32) (raw.cpusubtype);
+ header->filetype = (*get32) (raw.filetype);
+ header->ncmds = (*get32) (raw.ncmds);
+ header->sizeofcmds = (*get32) (raw.sizeofcmds);
+ header->flags = (*get32) (raw.flags);
if (mach_o_wide_p (header))
- header->reserved = (*get32) (buf + 28);
+ header->reserved = (*get32) (raw.reserved);
return TRUE;
}
unsigned int offset,
unsigned long prot)
{
- unsigned char buf[BFD_MACH_O_SECTION_SIZE];
+ struct mach_o_section_32_external raw;
if (bfd_seek (abfd, offset, SEEK_SET) != 0
- || (bfd_bread ((void *) buf, BFD_MACH_O_SECTION_SIZE, abfd)
+ || (bfd_bread (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
!= BFD_MACH_O_SECTION_SIZE))
return -1;
- memcpy (section->sectname, buf, 16);
+ memcpy (section->sectname, raw.sectname, 16);
section->sectname[16] = '\0';
- memcpy (section->segname, buf + 16, 16);
+ memcpy (section->segname, raw.segname, 16);
section->segname[16] = '\0';
- section->addr = bfd_h_get_32 (abfd, buf + 32);
- section->size = bfd_h_get_32 (abfd, buf + 36);
- section->offset = bfd_h_get_32 (abfd, buf + 40);
- section->align = bfd_h_get_32 (abfd, buf + 44);
- section->reloff = bfd_h_get_32 (abfd, buf + 48);
- section->nreloc = bfd_h_get_32 (abfd, buf + 52);
- section->flags = bfd_h_get_32 (abfd, buf + 56);
- section->reserved1 = bfd_h_get_32 (abfd, buf + 60);
- section->reserved2 = bfd_h_get_32 (abfd, buf + 64);
+ section->addr = bfd_h_get_32 (abfd, raw.addr);
+ section->size = bfd_h_get_32 (abfd, raw.size);
+ section->offset = bfd_h_get_32 (abfd, raw.offset);
+ section->align = bfd_h_get_32 (abfd, raw.align);
+ section->reloff = bfd_h_get_32 (abfd, raw.reloff);
+ section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
+ section->flags = bfd_h_get_32 (abfd, raw.flags);
+ section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
+ section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
section->reserved3 = 0;
section->bfdsection = bfd_mach_o_make_bfd_section (abfd, section, prot);
unsigned int offset,
unsigned long prot)
{
- unsigned char buf[BFD_MACH_O_SECTION_64_SIZE];
+ struct mach_o_section_64_external raw;
if (bfd_seek (abfd, offset, SEEK_SET) != 0
- || (bfd_bread ((void *) buf, BFD_MACH_O_SECTION_64_SIZE, abfd)
+ || (bfd_bread (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
!= BFD_MACH_O_SECTION_64_SIZE))
return -1;
- memcpy (section->sectname, buf, 16);
+ memcpy (section->sectname, raw.sectname, 16);
section->sectname[16] = '\0';
- memcpy (section->segname, buf + 16, 16);
+ memcpy (section->segname, raw.segname, 16);
section->segname[16] = '\0';
- section->addr = bfd_h_get_64 (abfd, buf + 32);
- section->size = bfd_h_get_64 (abfd, buf + 40);
- section->offset = bfd_h_get_32 (abfd, buf + 48);
- section->align = bfd_h_get_32 (abfd, buf + 52);
- section->reloff = bfd_h_get_32 (abfd, buf + 56);
- section->nreloc = bfd_h_get_32 (abfd, buf + 60);
- section->flags = bfd_h_get_32 (abfd, buf + 64);
- section->reserved1 = bfd_h_get_32 (abfd, buf + 68);
- section->reserved2 = bfd_h_get_32 (abfd, buf + 72);
- section->reserved3 = bfd_h_get_32 (abfd, buf + 76);
+ section->addr = bfd_h_get_64 (abfd, raw.addr);
+ section->size = bfd_h_get_64 (abfd, raw.size);
+ section->offset = bfd_h_get_32 (abfd, raw.offset);
+ section->align = bfd_h_get_32 (abfd, raw.align);
+ section->reloff = bfd_h_get_32 (abfd, raw.reloff);
+ section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
+ section->flags = bfd_h_get_32 (abfd, raw.flags);
+ section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
+ section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
+ section->reserved3 = bfd_h_get_32 (abfd, raw.reserved3);
section->bfdsection = bfd_mach_o_make_bfd_section (abfd, section, prot);
if (section->bfdsection == NULL)
unsigned int symwidth =
wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
unsigned int symoff = sym->symoff + (i * symwidth);
- unsigned char buf[16];
+ struct mach_o_nlist_64_external raw;
unsigned char type = -1;
unsigned char section = -1;
short desc = -1;
BFD_ASSERT (sym->strtab != NULL);
if (bfd_seek (abfd, symoff, SEEK_SET) != 0
- || bfd_bread ((void *) buf, symwidth, abfd) != symwidth)
+ || bfd_bread (&raw, symwidth, abfd) != symwidth)
{
- (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %lu"),
- symwidth, (unsigned long) symoff);
+ (*_bfd_error_handler)
+ (_("bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %lu"),
+ symwidth, (unsigned long) symoff);
return -1;
}
- stroff = bfd_h_get_32 (abfd, buf);
- type = bfd_h_get_8 (abfd, buf + 4);
+ stroff = bfd_h_get_32 (abfd, raw.n_strx);
+ type = bfd_h_get_8 (abfd, raw.n_type);
symtype = type & BFD_MACH_O_N_TYPE;
- section = bfd_h_get_8 (abfd, buf + 5);
- desc = bfd_h_get_16 (abfd, buf + 6);
+ section = bfd_h_get_8 (abfd, raw.n_sect);
+ desc = bfd_h_get_16 (abfd, raw.n_desc);
if (wide)
- value = bfd_h_get_64 (abfd, buf + 8);
+ value = bfd_h_get_64 (abfd, raw.n_value);
else
- value = bfd_h_get_32 (abfd, buf + 8);
+ value = bfd_h_get_32 (abfd, raw.n_value);
if (stroff >= sym->strsize)
{
- (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: symbol name out of range (%lu >= %lu)"),
- (unsigned long) stroff,
- (unsigned long) sym->strsize);
+ (*_bfd_error_handler)
+ (_("bfd_mach_o_read_symtab_symbol: name out of range (%lu >= %lu)"),
+ (unsigned long) stroff,
+ (unsigned long) sym->strsize);
return -1;
}
{
unsigned long isymoff = dysym->indirectsymoff + (i * 4);
unsigned long sym_index;
- unsigned char buf[4];
+ unsigned char raw[4];
BFD_ASSERT (i < dysym->nindirectsyms);
if (bfd_seek (abfd, isymoff, SEEK_SET) != 0
- || bfd_bread ((void *) buf, 4, abfd) != 4)
+ || bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
{
- (*_bfd_error_handler) (_("bfd_mach_o_read_dysymtab_symbol: unable to read %lu bytes at %lu"),
- (unsigned long) 4, isymoff);
+ (*_bfd_error_handler)
+ (_("bfd_mach_o_read_dysymtab_symbol: unable to read %lu bytes at %lu"),
+ (unsigned long) sizeof (raw), isymoff);
return -1;
}
- sym_index = bfd_h_get_32 (abfd, buf);
+ sym_index = bfd_h_get_32 (abfd, raw);
return bfd_mach_o_read_symtab_symbol (abfd, sym, s, sym_index);
}
bfd_mach_o_read_dylinker (bfd *abfd, bfd_mach_o_load_command *command)
{
bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
- unsigned char buf[4];
+ struct mach_o_str_command_external raw;
unsigned int nameoff;
BFD_ASSERT ((command->type == BFD_MACH_O_LC_ID_DYLINKER)
|| (command->type == BFD_MACH_O_LC_LOAD_DYLINKER));
- if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((void *) buf, 4, abfd) != 4)
+ if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
+ || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
return -1;
- nameoff = bfd_h_get_32 (abfd, buf + 0);
+ nameoff = bfd_h_get_32 (abfd, raw.str);
cmd->name_offset = command->offset + nameoff;
cmd->name_len = command->len - nameoff;
bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
{
bfd_mach_o_dylib_command *cmd = &command->command.dylib;
- unsigned char buf[16];
+ struct mach_o_dylib_command_external raw;
unsigned int nameoff;
switch (command->type)
return -1;
}
- if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((void *) buf, 16, abfd) != 16)
+ if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
+ || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
return -1;
- nameoff = bfd_h_get_32 (abfd, buf + 0);
- cmd->timestamp = bfd_h_get_32 (abfd, buf + 4);
- cmd->current_version = bfd_h_get_32 (abfd, buf + 8);
- cmd->compatibility_version = bfd_h_get_32 (abfd, buf + 12);
+ nameoff = bfd_h_get_32 (abfd, raw.name);
+ cmd->timestamp = bfd_h_get_32 (abfd, raw.timestamp);
+ cmd->current_version = bfd_h_get_32 (abfd, raw.current_version);
+ cmd->compatibility_version = bfd_h_get_32 (abfd, raw.compatibility_version);
cmd->name_offset = command->offset + nameoff;
cmd->name_len = command->len - nameoff;
{
bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
bfd_mach_o_thread_command *cmd = &command->command.thread;
- unsigned char buf[8];
unsigned int offset;
unsigned int nflavours;
unsigned int i;
nflavours = 0;
while (offset != command->len)
{
+ struct mach_o_thread_command_external raw;
+
if (offset >= command->len)
return -1;
if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
- || bfd_bread ((void *) buf, 8, abfd) != 8)
+ || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
return -1;
- offset += 8 + bfd_h_get_32 (abfd, buf + 4) * 4;
+ offset += sizeof (raw) + bfd_h_get_32 (abfd, raw.count) * 4;
nflavours++;
}
nflavours = 0;
while (offset != command->len)
{
+ struct mach_o_thread_command_external raw;
+
if (offset >= command->len)
return -1;
return -1;
if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
- || bfd_bread ((void *) buf, 8, abfd) != 8)
+ || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
return -1;
- cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, buf);
- cmd->flavours[nflavours].offset = command->offset + offset + 8;
- cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, buf + 4) * 4;
- offset += cmd->flavours[nflavours].size + 8;
+ cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, raw.flavour);
+ cmd->flavours[nflavours].offset = command->offset + offset + sizeof (raw);
+ cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, raw.count) * 4;
+ offset += cmd->flavours[nflavours].size + sizeof (raw);
nflavours++;
}
{
bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
- unsigned char buf[72];
BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
- if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((void *) buf, 72, abfd) != 72)
- return -1;
+ {
+ struct mach_o_dysymtab_command_external raw;
- cmd->ilocalsym = bfd_h_get_32 (abfd, buf + 0);
- cmd->nlocalsym = bfd_h_get_32 (abfd, buf + 4);
- cmd->iextdefsym = bfd_h_get_32 (abfd, buf + 8);
- cmd->nextdefsym = bfd_h_get_32 (abfd, buf + 12);
- cmd->iundefsym = bfd_h_get_32 (abfd, buf + 16);
- cmd->nundefsym = bfd_h_get_32 (abfd, buf + 20);
- cmd->tocoff = bfd_h_get_32 (abfd, buf + 24);
- cmd->ntoc = bfd_h_get_32 (abfd, buf + 28);
- cmd->modtaboff = bfd_h_get_32 (abfd, buf + 32);
- cmd->nmodtab = bfd_h_get_32 (abfd, buf + 36);
- cmd->extrefsymoff = bfd_h_get_32 (abfd, buf + 40);
- cmd->nextrefsyms = bfd_h_get_32 (abfd, buf + 44);
- cmd->indirectsymoff = bfd_h_get_32 (abfd, buf + 48);
- cmd->nindirectsyms = bfd_h_get_32 (abfd, buf + 52);
- cmd->extreloff = bfd_h_get_32 (abfd, buf + 56);
- cmd->nextrel = bfd_h_get_32 (abfd, buf + 60);
- cmd->locreloff = bfd_h_get_32 (abfd, buf + 64);
- cmd->nlocrel = bfd_h_get_32 (abfd, buf + 68);
+ if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
+ || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
+ return -1;
+
+ cmd->ilocalsym = bfd_h_get_32 (abfd, raw.ilocalsym);
+ cmd->nlocalsym = bfd_h_get_32 (abfd, raw.nlocalsym);
+ cmd->iextdefsym = bfd_h_get_32 (abfd, raw.iextdefsym);
+ cmd->nextdefsym = bfd_h_get_32 (abfd, raw.nextdefsym);
+ cmd->iundefsym = bfd_h_get_32 (abfd, raw.iundefsym);
+ cmd->nundefsym = bfd_h_get_32 (abfd, raw.nundefsym);
+ cmd->tocoff = bfd_h_get_32 (abfd, raw.tocoff);
+ cmd->ntoc = bfd_h_get_32 (abfd, raw.ntoc);
+ cmd->modtaboff = bfd_h_get_32 (abfd, raw.modtaboff);
+ cmd->nmodtab = bfd_h_get_32 (abfd, raw.nmodtab);
+ cmd->extrefsymoff = bfd_h_get_32 (abfd, raw.extrefsymoff);
+ cmd->nextrefsyms = bfd_h_get_32 (abfd, raw.nextrefsyms);
+ cmd->indirectsymoff = bfd_h_get_32 (abfd, raw.indirectsymoff);
+ cmd->nindirectsyms = bfd_h_get_32 (abfd, raw.nindirectsyms);
+ cmd->extreloff = bfd_h_get_32 (abfd, raw.extreloff);
+ cmd->nextrel = bfd_h_get_32 (abfd, raw.nextrel);
+ cmd->locreloff = bfd_h_get_32 (abfd, raw.locreloff);
+ cmd->nlocrel = bfd_h_get_32 (abfd, raw.nlocrel);
+ }
if (cmd->nmodtab != 0)
{
{
bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
unsigned long v;
+ unsigned char buf[56];
if (bfd_bread ((void *) buf, module_len, abfd) != module_len)
return -1;
for (i = 0; i < cmd->ntoc; i++)
{
+ struct mach_o_dylib_table_of_contents_external raw;
bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
- if (bfd_bread ((void *) buf, 8, abfd) != 8)
+ if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
return -1;
- toc->symbol_index = bfd_h_get_32 (abfd, buf + 0);
- toc->module_index = bfd_h_get_32 (abfd, buf + 4);
+ toc->symbol_index = bfd_h_get_32 (abfd, raw.symbol_index);
+ toc->module_index = bfd_h_get_32 (abfd, raw.module_index);
}
}
for (i = 0; i < cmd->nindirectsyms; i++)
{
+ unsigned char raw[4];
unsigned int *is = &cmd->indirect_syms[i];
- if (bfd_bread ((void *) buf, 4, abfd) != 4)
+ if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
return -1;
- *is = bfd_h_get_32 (abfd, buf + 0);
+ *is = bfd_h_get_32 (abfd, raw);
}
}
for (i = 0; i < cmd->nextrefsyms; i++)
{
+ unsigned char raw[4];
bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
- if (bfd_bread ((void *) buf, 4, abfd) != 4)
+ if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
return -1;
/* Fields isym and flags are written as bit-fields, thus we need
a specific processing for endianness. */
- v = bfd_h_get_32 (abfd, buf + 0);
+ v = bfd_h_get_32 (abfd, raw);
if (bfd_big_endian (abfd))
{
ref->isym = (v >> 8) & 0xffffff;
{
bfd_mach_o_symtab_command *symtab = &command->command.symtab;
bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
- unsigned char buf[16];
+ struct mach_o_symtab_command_external raw;
BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
- if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((void *) buf, 16, abfd) != 16)
+ if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
+ || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
return -1;
- symtab->symoff = bfd_h_get_32 (abfd, buf);
- symtab->nsyms = bfd_h_get_32 (abfd, buf + 4);
- symtab->stroff = bfd_h_get_32 (abfd, buf + 8);
- symtab->strsize = bfd_h_get_32 (abfd, buf + 12);
+ symtab->symoff = bfd_h_get_32 (abfd, raw.symoff);
+ symtab->nsyms = bfd_h_get_32 (abfd, raw.nsyms);
+ symtab->stroff = bfd_h_get_32 (abfd, raw.stroff);
+ symtab->strsize = bfd_h_get_32 (abfd, raw.strsize);
symtab->symbols = NULL;
symtab->strtab = NULL;
BFD_ASSERT (command->type == BFD_MACH_O_LC_UUID);
- if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((void *) cmd->uuid, 16, abfd) != 16)
+ if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
+ || bfd_bread (cmd->uuid, 16, abfd) != 16)
return -1;
return 0;
bfd_mach_o_read_linkedit (bfd *abfd, bfd_mach_o_load_command *command)
{
bfd_mach_o_linkedit_command *cmd = &command->command.linkedit;
- char buf[8];
+ struct mach_o_linkedit_data_command_external raw;
- if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((void *) buf, 8, abfd) != 8)
+ if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
+ || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
return -1;
- cmd->dataoff = bfd_get_32 (abfd, buf + 0);
- cmd->datasize = bfd_get_32 (abfd, buf + 4);
+ cmd->dataoff = bfd_get_32 (abfd, raw.dataoff);
+ cmd->datasize = bfd_get_32 (abfd, raw.datasize);
return 0;
}
bfd_mach_o_read_str (bfd *abfd, bfd_mach_o_load_command *command)
{
bfd_mach_o_str_command *cmd = &command->command.str;
- char buf[4];
+ struct mach_o_str_command_external raw;
unsigned long off;
- if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((void *) buf, 4, abfd) != 4)
+ if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
+ || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
return -1;
- off = bfd_get_32 (abfd, buf + 0);
+ off = bfd_get_32 (abfd, raw.str);
cmd->stroff = command->offset + off;
cmd->str_len = command->len - off;
cmd->str = bfd_alloc (abfd, cmd->str_len);
bfd_mach_o_read_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
{
bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info;
- char buf[40];
+ struct mach_o_dyld_info_command_external raw;
- if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((void *) buf, sizeof (buf), abfd) != sizeof (buf))
+ if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
+ || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
return -1;
- cmd->rebase_off = bfd_get_32 (abfd, buf + 0);
- cmd->rebase_size = bfd_get_32 (abfd, buf + 4);
- cmd->bind_off = bfd_get_32 (abfd, buf + 8);
- cmd->bind_size = bfd_get_32 (abfd, buf + 12);
- cmd->weak_bind_off = bfd_get_32 (abfd, buf + 16);
- cmd->weak_bind_size = bfd_get_32 (abfd, buf + 20);
- cmd->lazy_bind_off = bfd_get_32 (abfd, buf + 24);
- cmd->lazy_bind_size = bfd_get_32 (abfd, buf + 28);
- cmd->export_off = bfd_get_32 (abfd, buf + 32);
- cmd->export_size = bfd_get_32 (abfd, buf + 36);
+ cmd->rebase_off = bfd_get_32 (abfd, raw.rebase_off);
+ cmd->rebase_size = bfd_get_32 (abfd, raw.rebase_size);
+ cmd->bind_off = bfd_get_32 (abfd, raw.bind_off);
+ cmd->bind_size = bfd_get_32 (abfd, raw.bind_size);
+ cmd->weak_bind_off = bfd_get_32 (abfd, raw.weak_bind_off);
+ cmd->weak_bind_size = bfd_get_32 (abfd, raw.weak_bind_size);
+ cmd->lazy_bind_off = bfd_get_32 (abfd, raw.lazy_bind_off);
+ cmd->lazy_bind_size = bfd_get_32 (abfd, raw.lazy_bind_size);
+ cmd->export_off = bfd_get_32 (abfd, raw.export_off);
+ cmd->export_size = bfd_get_32 (abfd, raw.export_size);
return 0;
}
bfd_mach_o_load_command *command,
unsigned int wide)
{
- unsigned char buf[64];
bfd_mach_o_segment_command *seg = &command->command.segment;
unsigned long i;
if (wide)
{
+ struct mach_o_segment_command_64_external raw;
+
BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
- if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((void *) buf, 64, abfd) != 64)
- return -1;
+ if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
+ || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
+ return -1;
- memcpy (seg->segname, buf, 16);
+ memcpy (seg->segname, raw.segname, 16);
seg->segname[16] = '\0';
- seg->vmaddr = bfd_h_get_64 (abfd, buf + 16);
- seg->vmsize = bfd_h_get_64 (abfd, buf + 24);
- seg->fileoff = bfd_h_get_64 (abfd, buf + 32);
- seg->filesize = bfd_h_get_64 (abfd, buf + 40);
- seg->maxprot = bfd_h_get_32 (abfd, buf + 48);
- seg->initprot = bfd_h_get_32 (abfd, buf + 52);
- seg->nsects = bfd_h_get_32 (abfd, buf + 56);
- seg->flags = bfd_h_get_32 (abfd, buf + 60);
+ seg->vmaddr = bfd_h_get_64 (abfd, raw.vmaddr);
+ seg->vmsize = bfd_h_get_64 (abfd, raw.vmsize);
+ seg->fileoff = bfd_h_get_64 (abfd, raw.fileoff);
+ seg->filesize = bfd_h_get_64 (abfd, raw.filesize);
+ seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
+ seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
+ seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
+ seg->flags = bfd_h_get_32 (abfd, raw.flags);
}
else
{
+ struct mach_o_segment_command_32_external raw;
+
BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
- if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
- || bfd_bread ((void *) buf, 48, abfd) != 48)
- return -1;
+ if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
+ || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
+ return -1;
- memcpy (seg->segname, buf, 16);
+ memcpy (seg->segname, raw.segname, 16);
seg->segname[16] = '\0';
- seg->vmaddr = bfd_h_get_32 (abfd, buf + 16);
- seg->vmsize = bfd_h_get_32 (abfd, buf + 20);
- seg->fileoff = bfd_h_get_32 (abfd, buf + 24);
- seg->filesize = bfd_h_get_32 (abfd, buf + 28);
- seg->maxprot = bfd_h_get_32 (abfd, buf + 32);
- seg->initprot = bfd_h_get_32 (abfd, buf + 36);
- seg->nsects = bfd_h_get_32 (abfd, buf + 40);
- seg->flags = bfd_h_get_32 (abfd, buf + 44);
+ seg->vmaddr = bfd_h_get_32 (abfd, raw.vmaddr);
+ seg->vmsize = bfd_h_get_32 (abfd, raw.vmsize);
+ seg->fileoff = bfd_h_get_32 (abfd, raw.fileoff);
+ seg->filesize = bfd_h_get_32 (abfd, raw.filesize);
+ seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
+ seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
+ seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
+ seg->flags = bfd_h_get_32 (abfd, raw.flags);
}
if (seg->nsects != 0)
static int
bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
{
- unsigned char buf[8];
+ struct mach_o_load_command_external raw;
+ unsigned int cmd;
/* Read command type and length. */
if (bfd_seek (abfd, command->offset, SEEK_SET) != 0
- || bfd_bread ((void *) buf, 8, abfd) != 8)
+ || bfd_bread (&raw, BFD_MACH_O_LC_SIZE, abfd) != BFD_MACH_O_LC_SIZE)
return -1;
- command->type = bfd_h_get_32 (abfd, buf) & ~BFD_MACH_O_LC_REQ_DYLD;
- command->type_required = (bfd_h_get_32 (abfd, buf) & BFD_MACH_O_LC_REQ_DYLD
- ? TRUE : FALSE);
- command->len = bfd_h_get_32 (abfd, buf + 4);
+ cmd = bfd_h_get_32 (abfd, raw.cmd);
+ command->type = cmd & ~BFD_MACH_O_LC_REQ_DYLD;
+ command->type_required = cmd & BFD_MACH_O_LC_REQ_DYLD ? TRUE : FALSE;
+ command->len = bfd_h_get_32 (abfd, raw.cmdsize);
switch (command->type)
{
bfd_mach_o_archive_p (bfd *abfd)
{
mach_o_fat_data_struct *adata = NULL;
- unsigned char buf[20];
+ struct mach_o_fat_header_external hdr;
unsigned long i;
if (bfd_seek (abfd, 0, SEEK_SET) != 0
- || bfd_bread ((void *) buf, 8, abfd) != 8)
+ || bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
goto error;
adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
if (adata == NULL)
goto error;
- adata->magic = bfd_getb32 (buf);
- adata->nfat_arch = bfd_getb32 (buf + 4);
+ adata->magic = bfd_getb32 (hdr.magic);
+ adata->nfat_arch = bfd_getb32 (hdr.nfat_arch);
if (adata->magic != 0xcafebabe)
goto error;
/* Avoid matching Java bytecode files, which have the same magic number.
for (i = 0; i < adata->nfat_arch; i++)
{
- if (bfd_seek (abfd, 8 + 20 * i, SEEK_SET) != 0
- || bfd_bread ((void *) buf, 20, abfd) != 20)
+ struct mach_o_fat_arch_external arch;
+ if (bfd_bread (&arch, sizeof (arch), abfd) != sizeof (arch))
goto error;
- adata->archentries[i].cputype = bfd_getb32 (buf);
- adata->archentries[i].cpusubtype = bfd_getb32 (buf + 4);
- adata->archentries[i].offset = bfd_getb32 (buf + 8);
- adata->archentries[i].size = bfd_getb32 (buf + 12);
- adata->archentries[i].align = bfd_getb32 (buf + 16);
+ adata->archentries[i].cputype = bfd_getb32 (arch.cputype);
+ adata->archentries[i].cpusubtype = bfd_getb32 (arch.cpusubtype);
+ adata->archentries[i].offset = bfd_getb32 (arch.offset);
+ adata->archentries[i].size = bfd_getb32 (arch.size);
+ adata->archentries[i].align = bfd_getb32 (arch.align);
}
abfd->tdata.mach_o_fat_data = adata;
#ifndef _MACH_O_LOADER_H
#define _MACH_O_LOADER_H
-/* Symbol n_type values. */
-#define BFD_MACH_O_N_STAB 0xe0 /* If any of these bits set, a symbolic debugging entry. */
-#define BFD_MACH_O_N_PEXT 0x10 /* Private external symbol bit. */
-#define BFD_MACH_O_N_TYPE 0x0e /* Mask for the type bits. */
-#define BFD_MACH_O_N_EXT 0x01 /* External symbol bit, set for external symbols. */
-#define BFD_MACH_O_N_UNDF 0x00 /* Undefined, n_sect == NO_SECT. */
-#define BFD_MACH_O_N_ABS 0x02 /* Absolute, n_sect == NO_SECT. */
-#define BFD_MACH_O_N_INDR 0x0a /* Indirect. */
-#define BFD_MACH_O_N_PBUD 0x0c /* Prebound undefined (defined in a dylib). */
-#define BFD_MACH_O_N_SECT 0x0e /* Defined in section number n_sect. */
-
-#define BFD_MACH_O_NO_SECT 0 /* Symbol not in any section of the image. */
-
-/* Symbol n_desc reference flags. */
-#define BFD_MACH_O_REFERENCE_MASK 0x0f
-#define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_NON_LAZY 0x00
-#define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_LAZY 0x01
-#define BFD_MACH_O_REFERENCE_FLAG_DEFINED 0x02
-#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_DEFINED 0x03
-#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY 0x04
-#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY 0x05
-
-#define BFD_MACH_O_REFERENCED_DYNAMICALLY 0x10
-#define BFD_MACH_O_N_DESC_DISCARDED 0x20
-#define BFD_MACH_O_N_NO_DEAD_STRIP 0x20
-#define BFD_MACH_O_N_WEAK_REF 0x40
-#define BFD_MACH_O_N_WEAK_DEF 0x80
+/* Constants for header. */
typedef enum bfd_mach_o_mach_header_magic
{
}
bfd_mach_o_mach_header_magic;
-typedef enum bfd_mach_o_ppc_thread_flavour
+#define BFD_MACH_O_CPU_IS64BIT 0x1000000
+
+typedef enum bfd_mach_o_cpu_type
{
- BFD_MACH_O_PPC_THREAD_STATE = 1,
- BFD_MACH_O_PPC_FLOAT_STATE = 2,
- BFD_MACH_O_PPC_EXCEPTION_STATE = 3,
- BFD_MACH_O_PPC_VECTOR_STATE = 4,
- BFD_MACH_O_PPC_THREAD_STATE64 = 5,
- BFD_MACH_O_PPC_EXCEPTION_STATE64 = 6,
- BFD_MACH_O_PPC_THREAD_STATE_NONE = 7
+ BFD_MACH_O_CPU_TYPE_VAX = 1,
+ BFD_MACH_O_CPU_TYPE_MC680x0 = 6,
+ BFD_MACH_O_CPU_TYPE_I386 = 7,
+ BFD_MACH_O_CPU_TYPE_MIPS = 8,
+ BFD_MACH_O_CPU_TYPE_MC98000 = 10,
+ BFD_MACH_O_CPU_TYPE_HPPA = 11,
+ BFD_MACH_O_CPU_TYPE_ARM = 12,
+ BFD_MACH_O_CPU_TYPE_MC88000 = 13,
+ BFD_MACH_O_CPU_TYPE_SPARC = 14,
+ BFD_MACH_O_CPU_TYPE_I860 = 15,
+ BFD_MACH_O_CPU_TYPE_ALPHA = 16,
+ BFD_MACH_O_CPU_TYPE_POWERPC = 18,
+ BFD_MACH_O_CPU_TYPE_POWERPC_64 = (BFD_MACH_O_CPU_TYPE_POWERPC | BFD_MACH_O_CPU_IS64BIT),
+ BFD_MACH_O_CPU_TYPE_X86_64 = (BFD_MACH_O_CPU_TYPE_I386 | BFD_MACH_O_CPU_IS64BIT)
}
-bfd_mach_o_ppc_thread_flavour;
+bfd_mach_o_cpu_type;
-/* Defined in <mach/i386/thread_status.h> */
-typedef enum bfd_mach_o_i386_thread_flavour
+typedef enum bfd_mach_o_cpu_subtype
{
- BFD_MACH_O_x86_THREAD_STATE32 = 1,
- BFD_MACH_O_x86_FLOAT_STATE32 = 2,
- BFD_MACH_O_x86_EXCEPTION_STATE32 = 3,
- BFD_MACH_O_x86_THREAD_STATE64 = 4,
- BFD_MACH_O_x86_FLOAT_STATE64 = 5,
- BFD_MACH_O_x86_EXCEPTION_STATE64 = 6,
- BFD_MACH_O_x86_THREAD_STATE = 7,
- BFD_MACH_O_x86_FLOAT_STATE = 8,
- BFD_MACH_O_x86_EXCEPTION_STATE = 9,
- BFD_MACH_O_x86_DEBUG_STATE32 = 10,
- BFD_MACH_O_x86_DEBUG_STATE64 = 11,
- BFD_MACH_O_x86_DEBUG_STATE = 12,
- BFD_MACH_O_x86_THREAD_STATE_NONE = 13
+ BFD_MACH_O_CPU_SUBTYPE_X86_ALL = 3
}
-bfd_mach_o_i386_thread_flavour;
+bfd_mach_o_cpu_subtype;
+
+typedef enum bfd_mach_o_filetype
+{
+ BFD_MACH_O_MH_OBJECT = 0x01,
+ BFD_MACH_O_MH_EXECUTE = 0x02,
+ BFD_MACH_O_MH_FVMLIB = 0x03,
+ BFD_MACH_O_MH_CORE = 0x04,
+ BFD_MACH_O_MH_PRELOAD = 0x05,
+ BFD_MACH_O_MH_DYLIB = 0x06,
+ BFD_MACH_O_MH_DYLINKER = 0x07,
+ BFD_MACH_O_MH_BUNDLE = 0x08,
+ BFD_MACH_O_MH_DYLIB_STUB = 0x09,
+ BFD_MACH_O_MH_DSYM = 0x0a,
+ BFD_MACH_O_MH_KEXT_BUNDLE = 0x0b
+}
+bfd_mach_o_filetype;
+typedef enum bfd_mach_o_header_flags
+{
+ BFD_MACH_O_MH_NOUNDEFS = 0x0000001,
+ BFD_MACH_O_MH_INCRLINK = 0x0000002,
+ BFD_MACH_O_MH_DYLDLINK = 0x0000004,
+ BFD_MACH_O_MH_BINDATLOAD = 0x0000008,
+ BFD_MACH_O_MH_PREBOUND = 0x0000010,
+ BFD_MACH_O_MH_SPLIT_SEGS = 0x0000020,
+ BFD_MACH_O_MH_LAZY_INIT = 0x0000040,
+ BFD_MACH_O_MH_TWOLEVEL = 0x0000080,
+ BFD_MACH_O_MH_FORCE_FLAT = 0x0000100,
+ BFD_MACH_O_MH_NOMULTIDEFS = 0x0000200,
+ BFD_MACH_O_MH_NOFIXPREBINDING = 0x0000400,
+ BFD_MACH_O_MH_PREBINDABLE = 0x0000800,
+ BFD_MACH_O_MH_ALLMODSBOUND = 0x0001000,
+ BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS = 0x0002000,
+ BFD_MACH_O_MH_CANONICAL = 0x0004000,
+ BFD_MACH_O_MH_WEAK_DEFINES = 0x0008000,
+ BFD_MACH_O_MH_BINDS_TO_WEAK = 0x0010000,
+ BFD_MACH_O_MH_ALLOW_STACK_EXECUTION = 0x0020000,
+ BFD_MACH_O_MH_ROOT_SAFE = 0x0040000,
+ BFD_MACH_O_MH_SETUID_SAFE = 0x0080000,
+ BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS = 0x0100000,
+ BFD_MACH_O_MH_PIE = 0x0200000,
+ BFD_MACH_O_MH_DEAD_STRIPPABLE_DYLIB = 0x0400000,
+ BFD_MACH_O_MH_HAS_TLV_DESCRIPTORS = 0x0800000,
+ BFD_MACH_O_MH_NO_HEAP_EXECUTION = 0x1000000
+}
+bfd_mach_o_header_flags;
+\f
+/* Load command constants. */
#define BFD_MACH_O_LC_REQ_DYLD 0x80000000
typedef enum bfd_mach_o_load_command_type
BFD_MACH_O_LC_DYLD_INFO = 0x22 /* Compressed dyld information. */
}
bfd_mach_o_load_command_type;
-
-#define BFD_MACH_O_CPU_IS64BIT 0x1000000
-
-typedef enum bfd_mach_o_cpu_type
-{
- BFD_MACH_O_CPU_TYPE_VAX = 1,
- BFD_MACH_O_CPU_TYPE_MC680x0 = 6,
- BFD_MACH_O_CPU_TYPE_I386 = 7,
- BFD_MACH_O_CPU_TYPE_MIPS = 8,
- BFD_MACH_O_CPU_TYPE_MC98000 = 10,
- BFD_MACH_O_CPU_TYPE_HPPA = 11,
- BFD_MACH_O_CPU_TYPE_ARM = 12,
- BFD_MACH_O_CPU_TYPE_MC88000 = 13,
- BFD_MACH_O_CPU_TYPE_SPARC = 14,
- BFD_MACH_O_CPU_TYPE_I860 = 15,
- BFD_MACH_O_CPU_TYPE_ALPHA = 16,
- BFD_MACH_O_CPU_TYPE_POWERPC = 18,
- BFD_MACH_O_CPU_TYPE_POWERPC_64 = (BFD_MACH_O_CPU_TYPE_POWERPC | BFD_MACH_O_CPU_IS64BIT),
- BFD_MACH_O_CPU_TYPE_X86_64 = (BFD_MACH_O_CPU_TYPE_I386 | BFD_MACH_O_CPU_IS64BIT)
-}
-bfd_mach_o_cpu_type;
-
-typedef enum bfd_mach_o_cpu_subtype
-{
- BFD_MACH_O_CPU_SUBTYPE_X86_ALL = 3
-}
-bfd_mach_o_cpu_subtype;
-
-typedef enum bfd_mach_o_filetype
-{
- BFD_MACH_O_MH_OBJECT = 0x01,
- BFD_MACH_O_MH_EXECUTE = 0x02,
- BFD_MACH_O_MH_FVMLIB = 0x03,
- BFD_MACH_O_MH_CORE = 0x04,
- BFD_MACH_O_MH_PRELOAD = 0x05,
- BFD_MACH_O_MH_DYLIB = 0x06,
- BFD_MACH_O_MH_DYLINKER = 0x07,
- BFD_MACH_O_MH_BUNDLE = 0x08,
- BFD_MACH_O_MH_DYLIB_STUB = 0x09,
- BFD_MACH_O_MH_DSYM = 0x0a,
- BFD_MACH_O_MH_KEXT_BUNDLE = 0x0b
-}
-bfd_mach_o_filetype;
-
-typedef enum bfd_mach_o_header_flags
-{
- BFD_MACH_O_MH_NOUNDEFS = 0x000001,
- BFD_MACH_O_MH_INCRLINK = 0x000002,
- BFD_MACH_O_MH_DYLDLINK = 0x000004,
- BFD_MACH_O_MH_BINDATLOAD = 0x000008,
- BFD_MACH_O_MH_PREBOUND = 0x000010,
- BFD_MACH_O_MH_SPLIT_SEGS = 0x000020,
- BFD_MACH_O_MH_LAZY_INIT = 0x000040,
- BFD_MACH_O_MH_TWOLEVEL = 0x000080,
- BFD_MACH_O_MH_FORCE_FLAT = 0x000100,
- BFD_MACH_O_MH_NOMULTIDEFS = 0x000200,
- BFD_MACH_O_MH_NOFIXPREBINDING = 0x000400,
- BFD_MACH_O_MH_PREBINDABLE = 0x000800,
- BFD_MACH_O_MH_ALLMODSBOUND = 0x001000,
- BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS = 0x002000,
- BFD_MACH_O_MH_CANONICAL = 0x004000,
- BFD_MACH_O_MH_WEAK_DEFINES = 0x008000,
- BFD_MACH_O_MH_BINDS_TO_WEAK = 0x010000,
- BFD_MACH_O_MH_ALLOW_STACK_EXECUTION = 0x020000,
- BFD_MACH_O_MH_ROOT_SAFE = 0x040000,
- BFD_MACH_O_MH_SETUID_SAFE = 0x080000,
- BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS = 0x100000,
- BFD_MACH_O_MH_PIE = 0x200000
-}
-bfd_mach_o_header_flags;
-
+\f
+/* Section constants. */
/* Constants for the type of a section. */
typedef enum bfd_mach_o_section_type
BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS = 0x80000000
}
bfd_mach_o_section_attribute;
+\f
+/* Symbol constants. */
+
+/* Symbol n_type values. */
+#define BFD_MACH_O_N_STAB 0xe0 /* If any of these bits set, a symbolic debugging entry. */
+#define BFD_MACH_O_N_PEXT 0x10 /* Private external symbol bit. */
+#define BFD_MACH_O_N_TYPE 0x0e /* Mask for the type bits. */
+#define BFD_MACH_O_N_EXT 0x01 /* External symbol bit, set for external symbols. */
+#define BFD_MACH_O_N_UNDF 0x00 /* Undefined, n_sect == NO_SECT. */
+#define BFD_MACH_O_N_ABS 0x02 /* Absolute, n_sect == NO_SECT. */
+#define BFD_MACH_O_N_INDR 0x0a /* Indirect. */
+#define BFD_MACH_O_N_PBUD 0x0c /* Prebound undefined (defined in a dylib). */
+#define BFD_MACH_O_N_SECT 0x0e /* Defined in section number n_sect. */
+
+#define BFD_MACH_O_NO_SECT 0 /* Symbol not in any section of the image. */
+
+/* Symbol n_desc reference flags. */
+#define BFD_MACH_O_REFERENCE_MASK 0x0f
+#define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_NON_LAZY 0x00
+#define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_LAZY 0x01
+#define BFD_MACH_O_REFERENCE_FLAG_DEFINED 0x02
+#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_DEFINED 0x03
+#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY 0x04
+#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY 0x05
+
+#define BFD_MACH_O_REFERENCED_DYNAMICALLY 0x10
+#define BFD_MACH_O_N_DESC_DISCARDED 0x20
+#define BFD_MACH_O_N_NO_DEAD_STRIP 0x20
+#define BFD_MACH_O_N_WEAK_REF 0x40
+#define BFD_MACH_O_N_WEAK_DEF 0x80
+\f
+/* Thread constants. */
+
+typedef enum bfd_mach_o_ppc_thread_flavour
+{
+ BFD_MACH_O_PPC_THREAD_STATE = 1,
+ BFD_MACH_O_PPC_FLOAT_STATE = 2,
+ BFD_MACH_O_PPC_EXCEPTION_STATE = 3,
+ BFD_MACH_O_PPC_VECTOR_STATE = 4,
+ BFD_MACH_O_PPC_THREAD_STATE64 = 5,
+ BFD_MACH_O_PPC_EXCEPTION_STATE64 = 6,
+ BFD_MACH_O_PPC_THREAD_STATE_NONE = 7
+}
+bfd_mach_o_ppc_thread_flavour;
+
+/* Defined in <mach/i386/thread_status.h> */
+typedef enum bfd_mach_o_i386_thread_flavour
+{
+ BFD_MACH_O_x86_THREAD_STATE32 = 1,
+ BFD_MACH_O_x86_FLOAT_STATE32 = 2,
+ BFD_MACH_O_x86_EXCEPTION_STATE32 = 3,
+ BFD_MACH_O_x86_THREAD_STATE64 = 4,
+ BFD_MACH_O_x86_FLOAT_STATE64 = 5,
+ BFD_MACH_O_x86_EXCEPTION_STATE64 = 6,
+ BFD_MACH_O_x86_THREAD_STATE = 7,
+ BFD_MACH_O_x86_FLOAT_STATE = 8,
+ BFD_MACH_O_x86_EXCEPTION_STATE = 9,
+ BFD_MACH_O_x86_DEBUG_STATE32 = 10,
+ BFD_MACH_O_x86_DEBUG_STATE64 = 11,
+ BFD_MACH_O_x86_DEBUG_STATE = 12,
+ BFD_MACH_O_x86_THREAD_STATE_NONE = 13
+}
+bfd_mach_o_i386_thread_flavour;
#endif /* _MACH_O_LOADER_H */