From 46d1c23bceb2b8923af0d00a7f536a88524d6a74 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Mon, 8 Aug 2011 08:59:33 +0000 Subject: [PATCH] bfd/ 2011-08-08 Tristan Gingold * 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. include/mach-o 2011-08-08 Tristan Gingold * loader.h: Reorder declarations. * x86-64.h: New file. * external.h: New file. * reloc.h: New file. --- bfd/ChangeLog | 36 +++ bfd/mach-o-i386.c | 1 + bfd/mach-o-x86-64.c | 1 + bfd/mach-o.c | 617 ++++++++++++++++++++------------------ bfd/mach-o.h | 53 ---- include/mach-o/ChangeLog | 7 + include/mach-o/external.h | 267 +++++++++++++++++ include/mach-o/loader.h | 257 ++++++++-------- include/mach-o/reloc.h | 53 ++++ include/mach-o/x86-64.h | 37 +++ 10 files changed, 865 insertions(+), 464 deletions(-) create mode 100644 include/mach-o/external.h create mode 100644 include/mach-o/reloc.h create mode 100644 include/mach-o/x86-64.h diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 99f221b011c..9cad7fe9bc2 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,39 @@ +2011-08-08 Tristan Gingold + + * 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 * mach-o-x86-64.c (bfd_mach_o_x86_64_mkobject): Fix cut-and-past typos. diff --git a/bfd/mach-o-i386.c b/bfd/mach-o-i386.c index e46cbc6f57e..11915604b32 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 561496bdc83..2248d976a74 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 622cef54e61..5973df79065 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 #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 183076b44bd..de9640a8802 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 { diff --git a/include/mach-o/ChangeLog b/include/mach-o/ChangeLog index 923f2034976..dff287a5215 100644 --- a/include/mach-o/ChangeLog +++ b/include/mach-o/ChangeLog @@ -1,3 +1,10 @@ +2011-08-08 Tristan Gingold + + * loader.h: Reorder declarations. + * x86-64.h: New file. + * external.h: New file. + * reloc.h: New file. + 2011-07-06 Tristan Gingold * loader.h: New file. diff --git a/include/mach-o/external.h b/include/mach-o/external.h new file mode 100644 index 00000000000..c2fe7e333d9 --- /dev/null +++ b/include/mach-o/external.h @@ -0,0 +1,267 @@ +/* Mach-O support for BFD. + Copyright 2011 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _MACH_O_EXTERNAL_H +#define _MACH_O_EXTERNAL_H + +struct mach_o_header_external +{ + unsigned char magic[4]; /* Magic number. */ + unsigned char cputype[4]; /* CPU that this object is for. */ + unsigned char cpusubtype[4]; /* CPU subtype. */ + unsigned char filetype[4]; /* Type of file. */ + unsigned char ncmds[4]; /* Number of load commands. */ + unsigned char sizeofcmds[4]; /* Total size of load commands. */ + unsigned char flags[4]; /* Flags. */ + unsigned char reserved[4]; /* Reserved (on 64-bit version only). */ +}; + +#define BFD_MACH_O_HEADER_SIZE 28 +#define BFD_MACH_O_HEADER_64_SIZE 32 + +/* 32-bit section header. */ + +struct mach_o_section_32_external +{ + unsigned char sectname[16]; /* Section name. */ + unsigned char segname[16]; /* Segment that the section belongs to. */ + unsigned char addr[4]; /* Address of this section in memory. */ + unsigned char size[4]; /* Size in bytes of this section. */ + unsigned char offset[4]; /* File offset of this section. */ + unsigned char align[4]; /* log2 of this section's alignment. */ + unsigned char reloff[4]; /* File offset of this section's relocs. */ + unsigned char nreloc[4]; /* Number of relocs for this section. */ + unsigned char flags[4]; /* Section flags/attributes. */ + unsigned char reserved1[4]; + unsigned char reserved2[4]; +}; +#define BFD_MACH_O_SECTION_SIZE 68 + +/* 64-bit section header. */ + +struct mach_o_section_64_external +{ + unsigned char sectname[16]; /* Section name. */ + unsigned char segname[16]; /* Segment that the section belongs to. */ + unsigned char addr[8]; /* Address of this section in memory. */ + unsigned char size[8]; /* Size in bytes of this section. */ + unsigned char offset[4]; /* File offset of this section. */ + unsigned char align[4]; /* log2 of this section's alignment. */ + unsigned char reloff[4]; /* File offset of this section's relocs. */ + unsigned char nreloc[4]; /* Number of relocs for this section. */ + unsigned char flags[4]; /* Section flags/attributes. */ + unsigned char reserved1[4]; + unsigned char reserved2[4]; + unsigned char reserved3[4]; +}; +#define BFD_MACH_O_SECTION_64_SIZE 80 + +struct mach_o_load_command_external +{ + unsigned char cmd[4]; /* The type of load command. */ + unsigned char cmdsize[4]; /* Size in bytes of entire command. */ +}; +#define BFD_MACH_O_LC_SIZE 8 + +struct mach_o_segment_command_32_external +{ + unsigned char segname[16]; /* Name of this segment. */ + unsigned char vmaddr[4]; /* Virtual memory address of this segment. */ + unsigned char vmsize[4]; /* Size there, in bytes. */ + unsigned char fileoff[4]; /* Offset in bytes of the data to be mapped. */ + unsigned char filesize[4]; /* Size in bytes on disk. */ + unsigned char maxprot[4]; /* Maximum permitted vm protection. */ + unsigned char initprot[4]; /* Initial vm protection. */ + unsigned char nsects[4]; /* Number of sections in this segment. */ + unsigned char flags[4]; /* Flags that affect the loading. */ +}; +#define BFD_MACH_O_LC_SEGMENT_SIZE 56 /* Include the header. */ + +struct mach_o_segment_command_64_external +{ + unsigned char segname[16]; /* Name of this segment. */ + unsigned char vmaddr[8]; /* Virtual memory address of this segment. */ + unsigned char vmsize[8]; /* Size there, in bytes. */ + unsigned char fileoff[8]; /* Offset in bytes of the data to be mapped. */ + unsigned char filesize[8]; /* Size in bytes on disk. */ + unsigned char maxprot[4]; /* Maximum permitted vm protection. */ + unsigned char initprot[4]; /* Initial vm protection. */ + unsigned char nsects[4]; /* Number of sections in this segment. */ + unsigned char flags[4]; /* Flags that affect the loading. */ +}; +#define BFD_MACH_O_LC_SEGMENT_64_SIZE 72 /* Include the header. */ + +struct mach_o_reloc_info_external +{ + unsigned char r_address[4]; + unsigned char r_symbolnum[4]; +}; +#define BFD_MACH_O_RELENT_SIZE 8 + +struct mach_o_symtab_command_external +{ + unsigned char symoff[4]; + unsigned char nsyms[4]; + unsigned char stroff[4]; + unsigned char strsize[4]; +}; + +struct mach_o_nlist_external +{ + unsigned char n_strx[4]; + unsigned char n_type[1]; + unsigned char n_sect[1]; + unsigned char n_desc[2]; + unsigned char n_value[4]; +}; +#define BFD_MACH_O_NLIST_SIZE 12 + +struct mach_o_nlist_64_external +{ + unsigned char n_strx[4]; + unsigned char n_type[1]; + unsigned char n_sect[1]; + unsigned char n_desc[2]; + unsigned char n_value[8]; +}; +#define BFD_MACH_O_NLIST_64_SIZE 16 + +struct mach_o_thread_command_external +{ + unsigned char flavour[4]; + unsigned char count[4]; +}; + +/* For commands that just have a string or a path. */ +struct mach_o_str_command_external +{ + unsigned char str[4]; +}; + +struct mach_o_dylib_command_external +{ + unsigned char name[4]; + unsigned char timestamp[4]; + unsigned char current_version[4]; + unsigned char compatibility_version[4]; +}; + +struct mach_o_dysymtab_command_external +{ + unsigned char ilocalsym[4]; /* Index of. */ + unsigned char nlocalsym[4]; /* Number of. */ + unsigned char iextdefsym[4]; + unsigned char nextdefsym[4]; + unsigned char iundefsym[4]; + unsigned char nundefsym[4]; + unsigned char tocoff[4]; + unsigned char ntoc[4]; + unsigned char modtaboff[4]; + unsigned char nmodtab[4]; + unsigned char extrefsymoff[4]; + unsigned char nextrefsyms[4]; + unsigned char indirectsymoff[4]; + unsigned char nindirectsyms[4]; + unsigned char extreloff[4]; + unsigned char nextrel[4]; + unsigned char locreloff[4]; + unsigned char nlocrel[4]; +}; + +struct mach_o_dylib_module_external +{ + unsigned char module_name[4]; + unsigned char iextdefsym[4]; + unsigned char nextdefsym[4]; + unsigned char irefsym[4]; + unsigned char nrefsym[4]; + unsigned char ilocalsym[4]; + unsigned char nlocalsym[4]; + unsigned char iextrel[4]; + unsigned char nextrel[4]; + unsigned char iinit_iterm[4]; + unsigned char ninit_nterm[4]; + unsigned char objc_module_info_addr[4]; + unsigned char objc_module_info_size[4]; +}; +#define BFD_MACH_O_DYLIB_MODULE_SIZE 52 + +struct mach_o_dylib_module_64_external +{ + unsigned char module_name[4]; + unsigned char iextdefsym[4]; + unsigned char nextdefsym[4]; + unsigned char irefsym[4]; + unsigned char nrefsym[4]; + unsigned char ilocalsym[4]; + unsigned char nlocalsym[4]; + unsigned char iextrel[4]; + unsigned char nextrel[4]; + unsigned char iinit_iterm[4]; + unsigned char ninit_nterm[4]; + unsigned char objc_module_info_size[4]; + unsigned char objc_module_info_addr[8]; +}; +#define BFD_MACH_O_DYLIB_MODULE_64_SIZE 56 + +struct mach_o_dylib_table_of_contents_external +{ + unsigned char symbol_index[4]; + unsigned char module_index[4]; +}; +#define BFD_MACH_O_TABLE_OF_CONTENT_SIZE 8 + +struct mach_o_linkedit_data_command_external +{ + unsigned char dataoff[4]; + unsigned char datasize[4]; +}; + +struct mach_o_dyld_info_command_external +{ + unsigned char rebase_off[4]; + unsigned char rebase_size[4]; + unsigned char bind_off[4]; + unsigned char bind_size[4]; + unsigned char weak_bind_off[4]; + unsigned char weak_bind_size[4]; + unsigned char lazy_bind_off[4]; + unsigned char lazy_bind_size[4]; + unsigned char export_off[4]; + unsigned char export_size[4]; +}; + +struct mach_o_fat_header_external +{ + unsigned char magic[4]; + unsigned char nfat_arch[4]; /* Number of components. */ +}; + +struct mach_o_fat_arch_external +{ + unsigned char cputype[4]; + unsigned char cpusubtype[4]; + unsigned char offset[4]; /* File offset of the member. */ + unsigned char size[4]; /* Size of the member. */ + unsigned char align[4]; /* Power of 2. */ +}; + +#endif /* _MACH_O_EXTERNAL_H */ diff --git a/include/mach-o/loader.h b/include/mach-o/loader.h index 8ddf8e03792..1105204edb9 100644 --- a/include/mach-o/loader.h +++ b/include/mach-o/loader.h @@ -22,33 +22,7 @@ #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 { @@ -59,37 +33,80 @@ 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 */ -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; + +/* Load command constants. */ #define BFD_MACH_O_LC_REQ_DYLD 0x80000000 typedef enum bfd_mach_o_load_command_type @@ -134,77 +151,8 @@ 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; - + +/* Section constants. */ /* Constants for the type of a section. */ typedef enum bfd_mach_o_section_type @@ -325,5 +273,68 @@ typedef enum bfd_mach_o_section_attribute BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS = 0x80000000 } bfd_mach_o_section_attribute; + +/* 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 + +/* 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 */ +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 */ diff --git a/include/mach-o/reloc.h b/include/mach-o/reloc.h new file mode 100644 index 00000000000..93ebb8b5fc9 --- /dev/null +++ b/include/mach-o/reloc.h @@ -0,0 +1,53 @@ +/* Mach-O support for BFD. + Copyright 2011 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _MACH_O_RELOC_H +#define _MACH_O_RELOC_H + +/* 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) + +/* 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 +#define BFD_MACH_O_GENERIC_RELOC_TLV 5 + +#endif /* _MACH_O_RELOC_H */ diff --git a/include/mach-o/x86-64.h b/include/mach-o/x86-64.h new file mode 100644 index 00000000000..d06bc26a7da --- /dev/null +++ b/include/mach-o/x86-64.h @@ -0,0 +1,37 @@ +/* Mach-O support for BFD. + Copyright 2011 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _MACH_O_X86_64_H +#define _MACH_O_X86_64_H + +/* 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. */ +#define BFD_MACH_O_X86_64_RELOC_TLV 9 /* Thread local variables. */ + +#endif /* _MACH_O_X86_64_H */ -- 2.30.2