aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog36
-rw-r--r--bfd/mach-o-i386.c1
-rw-r--r--bfd/mach-o-x86-64.c1
-rw-r--r--bfd/mach-o.c617
-rw-r--r--bfd/mach-o.h53
5 files changed, 367 insertions, 341 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 99f221b..9cad7fe 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,41 @@
2011-08-08 Tristan Gingold <gingold@adacore.com>
+ * mach-o.h: Move size macros to external.h
+ Move reloc macros to reloc.h and x86-64.h.
+ * mach-o-i386.c: Includes mach-o/reloc.h
+ * mach-o-x86-64.c: Ditto and includes mach-o/x86-64.h
+ * mach-o.c: Add includes.
+ (bfd_mach_o_write_header): Use structure from external.h to convert.
+ (bfd_mach_o_write_thread): Ditto.
+ (bfd_mach_o_write_relocs): Ditto.
+ (bfd_mach_o_write_section_32): Ditto.
+ (bfd_mach_o_write_section_64): Ditto.
+ (bfd_mach_o_write_segment_32): Ditto.
+ (bfd_mach_o_write_segment_64): Ditto.
+ (bfd_mach_o_write_symtab): Ditto.
+ (bfd_mach_o_write_contents): Ditto.
+ (bfd_mach_o_read_header): Ditto.
+ (bfd_mach_o_read_section_32): Ditto.
+ (bfd_mach_o_read_section_64): Ditto.
+ (bfd_mach_o_read_symtab_symbol): Ditto.
+ (bfd_mach_o_read_dylinker): Ditto.
+ (bfd_mach_o_read_dylib): Ditto.
+ (bfd_mach_o_read_dysymtab): Ditto.
+ (bfd_mach_o_read_symtab): Ditto.
+ (bfd_mach_o_read_linkedit): Ditto.
+ (bfd_mach_o_read_str): Ditto.
+ (bfd_mach_o_read_dyld_info): Ditto.
+ (bfd_mach_o_read_segment): Ditto.
+ (bfd_mach_o_read_command): Ditto.
+ (bfd_mach_o_archive_p): Ditto.
+ (bfd_mach_o_canonicalize_one_reloc): Ditto. Change the BUF parameter.
+ (bfd_mach_o_canonicalize_relocs): Adjust to call the above function.
+ (bfd_mach_o_read_dysymtab_symbol): Rename BUF variable.
+ (bfd_mach_o_read_uuid): Remove useless cast. Use a macro instead
+ of an hard-coded value.
+
+2011-08-08 Tristan Gingold <gingold@adacore.com>
+
* mach-o-x86-64.c (bfd_mach_o_x86_64_mkobject): Fix cut-and-past typos.
(bfd_mach_o_x86_64_swap_reloc_out): Handle BFD_RELOC_32_PCREL,
BFD_RELOC_MACH_O_X86_64_SUBTRACTOR64 and
diff --git a/bfd/mach-o-i386.c b/bfd/mach-o-i386.c
index e46cbc6..1191560 100644
--- a/bfd/mach-o-i386.c
+++ b/bfd/mach-o-i386.c
@@ -24,6 +24,7 @@
#include "bfd.h"
#include "libbfd.h"
#include "libiberty.h"
+#include "mach-o/reloc.h"
#define bfd_mach_o_object_p bfd_mach_o_i386_object_p
#define bfd_mach_o_core_p bfd_mach_o_i386_core_p
diff --git a/bfd/mach-o-x86-64.c b/bfd/mach-o-x86-64.c
index 561496b..2248d97 100644
--- a/bfd/mach-o-x86-64.c
+++ b/bfd/mach-o-x86-64.c
@@ -24,6 +24,7 @@
#include "bfd.h"
#include "libbfd.h"
#include "libiberty.h"
+#include "mach-o/x86-64.h"
#define bfd_mach_o_object_p bfd_mach_o_x86_64_object_p
#define bfd_mach_o_core_p bfd_mach_o_x86_64_core_p
diff --git a/bfd/mach-o.c b/bfd/mach-o.c
index 622cef5..5973df7 100644
--- a/bfd/mach-o.c
+++ b/bfd/mach-o.c
@@ -26,6 +26,8 @@
#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
@@ -614,25 +616,25 @@ bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype,
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;
@@ -643,7 +645,7 @@ bfd_mach_o_write_thread (bfd *abfd, bfd_mach_o_load_command *command)
{
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)
@@ -653,16 +655,17 @@ bfd_mach_o_write_thread (bfd *abfd, bfd_mach_o_load_command *command)
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;
@@ -676,7 +679,8 @@ bfd_mach_o_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
}
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);
@@ -686,8 +690,8 @@ bfd_mach_o_canonicalize_one_reloc (bfd *abfd, char *buf,
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)
{
@@ -754,12 +758,13 @@ bfd_mach_o_canonicalize_relocs (bfd *abfd, unsigned long filepos,
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;
@@ -769,9 +774,8 @@ bfd_mach_o_canonicalize_relocs (bfd *abfd, unsigned long filepos,
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);
@@ -901,7 +905,7 @@ bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section)
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. */
@@ -918,23 +922,24 @@ bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section)
| 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;
}
@@ -944,21 +949,21 @@ bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section)
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;
@@ -968,22 +973,22 @@ bfd_mach_o_write_section_32 (bfd *abfd, bfd_mach_o_section *section)
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;
@@ -993,7 +998,7 @@ bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section)
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;
@@ -1003,19 +1008,18 @@ bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
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++)
@@ -1028,7 +1032,7 @@ bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
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;
@@ -1038,19 +1042,18 @@ bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
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++)
@@ -1065,7 +1068,6 @@ bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
{
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;
@@ -1102,17 +1104,35 @@ bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
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;
@@ -1123,14 +1143,18 @@ bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
_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;
@@ -1215,17 +1239,17 @@ bfd_mach_o_write_contents (bfd *abfd)
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)
@@ -1436,37 +1460,37 @@ bfd_mach_o_make_empty_symbol (bfd *abfd)
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;
@@ -1484,18 +1508,18 @@ bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
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;
}
@@ -1566,26 +1590,26 @@ bfd_mach_o_read_section_32 (bfd *abfd,
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);
@@ -1601,27 +1625,27 @@ bfd_mach_o_read_section_64 (bfd *abfd,
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)
@@ -1654,7 +1678,7 @@ bfd_mach_o_read_symtab_symbol (bfd *abfd,
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;
@@ -1665,28 +1689,30 @@ bfd_mach_o_read_symtab_symbol (bfd *abfd,
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;
}
@@ -1883,18 +1909,19 @@ bfd_mach_o_read_dysymtab_symbol (bfd *abfd,
{
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);
}
@@ -1940,17 +1967,17 @@ static int
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;
@@ -1967,7 +1994,7 @@ static int
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)
@@ -1982,14 +2009,14 @@ bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
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;
@@ -2017,7 +2044,6 @@ bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
{
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;
@@ -2030,14 +2056,16 @@ bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
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++;
}
@@ -2052,6 +2080,8 @@ bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
nflavours = 0;
while (offset != command->len)
{
+ struct mach_o_thread_command_external raw;
+
if (offset >= command->len)
return -1;
@@ -2059,13 +2089,13 @@ bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
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++;
}
@@ -2125,32 +2155,35 @@ bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
{
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)
{
@@ -2170,6 +2203,7 @@ bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
{
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;
@@ -2216,13 +2250,14 @@ bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
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);
}
}
@@ -2240,12 +2275,13 @@ bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
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);
}
}
@@ -2264,14 +2300,15 @@ bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
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;
@@ -2297,18 +2334,18 @@ bfd_mach_o_read_symtab (bfd *abfd, bfd_mach_o_load_command *command)
{
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;
@@ -2328,8 +2365,8 @@ bfd_mach_o_read_uuid (bfd *abfd, bfd_mach_o_load_command *command)
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;
@@ -2339,14 +2376,14 @@ static int
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;
}
@@ -2354,14 +2391,14 @@ static int
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);
@@ -2377,22 +2414,22 @@ static int
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;
}
@@ -2401,49 +2438,52 @@ bfd_mach_o_read_segment (bfd *abfd,
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)
@@ -2487,17 +2527,18 @@ bfd_mach_o_read_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
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)
{
@@ -2951,19 +2992,19 @@ const bfd_target *
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.
@@ -2979,14 +3020,14 @@ bfd_mach_o_archive_p (bfd *abfd)
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;
diff --git a/bfd/mach-o.h b/bfd/mach-o.h
index 183076b..de9640a 100644
--- a/bfd/mach-o.h
+++ b/bfd/mach-o.h
@@ -41,9 +41,6 @@ typedef struct bfd_mach_o_header
}
bfd_mach_o_header;
-#define BFD_MACH_O_HEADER_SIZE 28
-#define BFD_MACH_O_HEADER_64_SIZE 32
-
typedef struct bfd_mach_o_section
{
/* Fields present in the file. */
@@ -64,8 +61,6 @@ typedef struct bfd_mach_o_section
asection *bfdsection;
}
bfd_mach_o_section;
-#define BFD_MACH_O_SECTION_SIZE 68
-#define BFD_MACH_O_SECTION_64_SIZE 80
typedef struct bfd_mach_o_segment_command
{
@@ -81,55 +76,12 @@ typedef struct bfd_mach_o_segment_command
bfd_mach_o_section *sections;
}
bfd_mach_o_segment_command;
-#define BFD_MACH_O_LC_SEGMENT_SIZE 56
-#define BFD_MACH_O_LC_SEGMENT_64_SIZE 72
/* Protection flags. */
#define BFD_MACH_O_PROT_READ 0x01
#define BFD_MACH_O_PROT_WRITE 0x02
#define BFD_MACH_O_PROT_EXECUTE 0x04
-/* Generic relocation types (used by i386). */
-#define BFD_MACH_O_GENERIC_RELOC_VANILLA 0
-#define BFD_MACH_O_GENERIC_RELOC_PAIR 1
-#define BFD_MACH_O_GENERIC_RELOC_SECTDIFF 2
-#define BFD_MACH_O_GENERIC_RELOC_PB_LA_PTR 3
-#define BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF 4
-
-/* X86-64 relocations. */
-#define BFD_MACH_O_X86_64_RELOC_UNSIGNED 0 /* Absolute addresses. */
-#define BFD_MACH_O_X86_64_RELOC_SIGNED 1 /* 32-bit disp. */
-#define BFD_MACH_O_X86_64_RELOC_BRANCH 2 /* 32-bit pcrel disp. */
-#define BFD_MACH_O_X86_64_RELOC_GOT_LOAD 3 /* Movq load of a GOT entry. */
-#define BFD_MACH_O_X86_64_RELOC_GOT 4 /* GOT reference. */
-#define BFD_MACH_O_X86_64_RELOC_SUBTRACTOR 5 /* Symbol difference. */
-#define BFD_MACH_O_X86_64_RELOC_SIGNED_1 6 /* 32-bit signed disp -1. */
-#define BFD_MACH_O_X86_64_RELOC_SIGNED_2 7 /* 32-bit signed disp -2. */
-#define BFD_MACH_O_X86_64_RELOC_SIGNED_4 8 /* 32-bit signed disp -4. */
-
-/* Size of a relocation entry. */
-#define BFD_MACH_O_RELENT_SIZE 8
-
-/* Fields for a normal (non-scattered) entry. */
-#define BFD_MACH_O_R_PCREL 0x01000000
-#define BFD_MACH_O_GET_R_LENGTH(s) (((s) >> 25) & 0x3)
-#define BFD_MACH_O_R_EXTERN 0x08000000
-#define BFD_MACH_O_GET_R_TYPE(s) (((s) >> 28) & 0x0f)
-#define BFD_MACH_O_GET_R_SYMBOLNUM(s) ((s) & 0x00ffffff)
-#define BFD_MACH_O_SET_R_LENGTH(l) (((l) & 0x3) << 25)
-#define BFD_MACH_O_SET_R_TYPE(t) (((t) & 0xf) << 28)
-#define BFD_MACH_O_SET_R_SYMBOLNUM(s) ((s) & 0x00ffffff)
-
-/* Fields for a scattered entry. */
-#define BFD_MACH_O_SR_SCATTERED 0x80000000
-#define BFD_MACH_O_SR_PCREL 0x40000000
-#define BFD_MACH_O_GET_SR_LENGTH(s) (((s) >> 28) & 0x3)
-#define BFD_MACH_O_GET_SR_TYPE(s) (((s) >> 24) & 0x0f)
-#define BFD_MACH_O_GET_SR_ADDRESS(s) ((s) & 0x00ffffff)
-#define BFD_MACH_O_SET_SR_LENGTH(l) (((l) & 0x3) << 28)
-#define BFD_MACH_O_SET_SR_TYPE(t) (((t) & 0xf) << 24)
-#define BFD_MACH_O_SET_SR_ADDRESS(s) ((s) & 0x00ffffff)
-
/* Expanded internal representation of a relocation entry. */
typedef struct bfd_mach_o_reloc_info
{
@@ -154,8 +106,6 @@ typedef struct bfd_mach_o_asymbol
unsigned short n_desc;
}
bfd_mach_o_asymbol;
-#define BFD_MACH_O_NLIST_SIZE 12
-#define BFD_MACH_O_NLIST_64_SIZE 16
typedef struct bfd_mach_o_symtab_command
{
@@ -262,8 +212,6 @@ typedef struct bfd_mach_o_dylib_module
bfd_vma objc_module_info_addr;
}
bfd_mach_o_dylib_module;
-#define BFD_MACH_O_DYLIB_MODULE_SIZE 52
-#define BFD_MACH_O_DYLIB_MODULE_64_SIZE 56
typedef struct bfd_mach_o_dylib_table_of_content
{
@@ -274,7 +222,6 @@ typedef struct bfd_mach_o_dylib_table_of_content
unsigned long module_index;
}
bfd_mach_o_dylib_table_of_content;
-#define BFD_MACH_O_TABLE_OF_CONTENT_SIZE 8
typedef struct bfd_mach_o_dylib_reference
{