From 286ab76684c1fa044fe41ed7da7efb0e5025ee24 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Wed, 4 Jan 2012 10:37:34 +0000 Subject: bfd/ 2012-01-04 Tristan Gingold * 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. binutils/ 2012-01-04 Tristan Gingold * od-macho.c (dump_load_command): Handle fvmlib. include/mach-o/ 2012-01-04 Tristan Gingold * external.h (mach_o_fvmlib_command_external): New structure. --- bfd/mach-o.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'bfd/mach-o.c') diff --git a/bfd/mach-o.c b/bfd/mach-o.c index a72cba0200e..d2fd7e1867e 100644 --- a/bfd/mach-o.c +++ b/bfd/mach-o.c @@ -3044,6 +3044,32 @@ bfd_mach_o_read_prebound_dylib (bfd *abfd ATTRIBUTE_UNUSED, return 0; } +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) { @@ -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: -- cgit v1.2.1