aboutsummaryrefslogtreecommitdiff
path: root/bfd/mach-o.c
diff options
context:
space:
mode:
authorTristan Gingold <gingold@adacore.com>2009-09-09 14:58:12 +0000
committerTristan Gingold <gingold@adacore.com>2009-09-09 14:58:12 +0000
commitad86f1fb4da4f0b049bfd5f9fb05dcd52124ad33 (patch)
treedc6b5e64240c09bae289bb9839de5acf0ac40873 /bfd/mach-o.c
parent22ba0981786d9fc6ab459bc449735d51f437dbe8 (diff)
downloadfsf-binutils-gdb-ad86f1fb4da4f0b049bfd5f9fb05dcd52124ad33.zip
fsf-binutils-gdb-ad86f1fb4da4f0b049bfd5f9fb05dcd52124ad33.tar.gz
fsf-binutils-gdb-ad86f1fb4da4f0b049bfd5f9fb05dcd52124ad33.tar.bz2
2009-09-09 Tristan Gingold <gingold@adacore.com>
Handle DYLD_INFO introduced by Darwin10. * mach-o.h (bfd_mach_o_load_command_type): Add BFD_MACH_O_LC_DYLD_INFO. (bfd_mach_o_dyld_info_command): New type. (bfd_mach_o_load_command): Add dyld_info field. * mach-o.c (bfd_mach_o_scan_read_str): Reduce size of buf. (bfd_mach_o_scan_read_dyld_info): New function. (bfd_mach_o_scan_read_command): Handle BFD_MACH_O_LC_DYLD_INFO. (bfd_mach_o_bfd_print_private_bfd_data): Ditto. (bfd_mach_o_load_command_name): AddB FD_MACH_O_LC_DYLD_INFO. (bfd_mach_o_print_dyld_info): New function.
Diffstat (limited to 'bfd/mach-o.c')
-rw-r--r--bfd/mach-o.c52
1 files changed, 51 insertions, 1 deletions
diff --git a/bfd/mach-o.c b/bfd/mach-o.c
index d1d6e70..5cf531e 100644
--- a/bfd/mach-o.c
+++ b/bfd/mach-o.c
@@ -2195,7 +2195,7 @@ static int
bfd_mach_o_scan_read_str (bfd *abfd, bfd_mach_o_load_command *command)
{
bfd_mach_o_str_command *cmd = &command->command.str;
- char buf[8];
+ char buf[4];
unsigned long off;
if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
@@ -2215,6 +2215,29 @@ bfd_mach_o_scan_read_str (bfd *abfd, bfd_mach_o_load_command *command)
}
static int
+bfd_mach_o_scan_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];
+
+ if (bfd_seek (abfd, command->offset + 8, SEEK_SET) != 0
+ || bfd_bread ((PTR) buf, sizeof (buf), abfd) != sizeof (buf))
+ 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);
+ return 0;
+}
+
+static int
bfd_mach_o_scan_read_segment (bfd *abfd,
bfd_mach_o_load_command *command,
unsigned int wide)
@@ -2384,6 +2407,10 @@ bfd_mach_o_scan_read_command (bfd *abfd, bfd_mach_o_load_command *command)
if (bfd_mach_o_scan_read_linkedit (abfd, command) != 0)
return -1;
break;
+ case BFD_MACH_O_LC_DYLD_INFO:
+ if (bfd_mach_o_scan_read_dyld_info (abfd, command) != 0)
+ return -1;
+ break;
default:
fprintf (stderr, "unable to read unknown load command 0x%lx\n",
(unsigned long) command->type);
@@ -3183,6 +3210,7 @@ static bfd_mach_o_xlat_name bfd_mach_o_load_command_name[] =
{ "reexport_dylib", BFD_MACH_O_LC_REEXPORT_DYLIB},
{ "lazy_load_dylib", BFD_MACH_O_LC_LAZY_LOAD_DYLIB},
{ "encryption_info", BFD_MACH_O_LC_ENCRYPTION_INFO},
+ { "dyld_info", BFD_MACH_O_LC_DYLD_INFO},
{ NULL, 0}
};
@@ -3538,6 +3566,24 @@ bfd_mach_o_print_dysymtab (bfd *abfd ATTRIBUTE_UNUSED,
}
+static void
+bfd_mach_o_print_dyld_info (bfd *abfd ATTRIBUTE_UNUSED,
+ bfd_mach_o_load_command *cmd, FILE *file)
+{
+ bfd_mach_o_dyld_info_command *info = &cmd->command.dyld_info;
+
+ fprintf (file, " rebase: off: 0x%08x size: %-8u\n",
+ info->rebase_off, info->rebase_size);
+ fprintf (file, " bind: off: 0x%08x size: %-8u\n",
+ info->bind_off, info->bind_size);
+ fprintf (file, " weak bind: off: 0x%08x size: %-8u\n",
+ info->weak_bind_off, info->weak_bind_size);
+ fprintf (file, " lazy bind: off: 0x%08x size: %-8u\n",
+ info->lazy_bind_off, info->lazy_bind_size);
+ fprintf (file, " export: off: 0x%08x size: %-8u\n",
+ info->export_off, info->export_size);
+}
+
bfd_boolean
bfd_mach_o_bfd_print_private_bfd_data (bfd *abfd, PTR ptr)
{
@@ -3660,6 +3706,10 @@ bfd_mach_o_bfd_print_private_bfd_data (bfd *abfd, PTR ptr)
}
break;
}
+ case BFD_MACH_O_LC_DYLD_INFO:
+ fprintf (file, "\n");
+ bfd_mach_o_print_dyld_info (abfd, cmd, file);
+ break;
default:
fprintf (file, "\n");
break;