diff options
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/mach-o.c | 29 | ||||
-rw-r--r-- | bfd/mach-o.h | 11 |
3 files changed, 48 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2fd6ae0..4eac2d4 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,13 @@ 2012-01-04 Tristan Gingold <gingold@adacore.com> + * mach-o.h (bfd_mach_o_fvmlib_command): New structure. + (bfd_mach_o_load_command): Add fvmlib field. + + * mach-o.c (bfd_mach_o_read_fvmlib): New function. + (bfd_mach_o_read_command): Handle fvmlib. + +2012-01-04 Tristan Gingold <gingold@adacore.com> + * mach-o.c (bfd_mach_o_convert_architecture): Reindent. Decode msubtype for ARM. diff --git a/bfd/mach-o.c b/bfd/mach-o.c index a72cba0..d2fd7e1 100644 --- a/bfd/mach-o.c +++ b/bfd/mach-o.c @@ -3045,6 +3045,32 @@ bfd_mach_o_read_prebound_dylib (bfd *abfd ATTRIBUTE_UNUSED, } static int +bfd_mach_o_read_fvmlib (bfd *abfd, bfd_mach_o_load_command *command) +{ + bfd_mach_o_fvmlib_command *fvm = &command->command.fvmlib; + struct mach_o_fvmlib_command_external raw; + unsigned int nameoff; + + 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, raw.name); + fvm->minor_version = bfd_h_get_32 (abfd, raw.minor_version); + fvm->header_addr = bfd_h_get_32 (abfd, raw.header_addr); + + fvm->name_offset = command->offset + nameoff; + fvm->name_len = command->len - nameoff; + fvm->name_str = bfd_alloc (abfd, fvm->name_len); + if (fvm->name_str == NULL) + return -1; + if (bfd_seek (abfd, fvm->name_offset, SEEK_SET) != 0 + || bfd_bread (fvm->name_str, fvm->name_len, abfd) != fvm->name_len) + return -1; + return 0; +} + +static int 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); @@ -3618,6 +3644,9 @@ bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command) break; case BFD_MACH_O_LC_LOADFVMLIB: case BFD_MACH_O_LC_IDFVMLIB: + if (bfd_mach_o_read_fvmlib (abfd, command) != 0) + return -1; + break; case BFD_MACH_O_LC_IDENT: case BFD_MACH_O_LC_FVMFILE: case BFD_MACH_O_LC_PREPAGE: diff --git a/bfd/mach-o.h b/bfd/mach-o.h index b32b6a8..123edda 100644 --- a/bfd/mach-o.h +++ b/bfd/mach-o.h @@ -450,6 +450,16 @@ typedef struct bfd_mach_o_str_command } bfd_mach_o_str_command; +typedef struct bfd_mach_o_fvmlib_command +{ + unsigned int name_offset; + unsigned int name_len; + char *name_str; + unsigned int minor_version; + unsigned int header_addr; +} +bfd_mach_o_fvmlib_command; + typedef struct bfd_mach_o_dyld_info_command { /* File offset and size to rebase info. */ @@ -512,6 +522,7 @@ typedef struct bfd_mach_o_load_command bfd_mach_o_dyld_info_command dyld_info; bfd_mach_o_version_min_command version_min; bfd_mach_o_encryption_info_command encryption_info; + bfd_mach_o_fvmlib_command fvmlib; } command; } |