diff options
author | Tristan Gingold <gingold@adacore.com> | 2009-09-09 14:58:12 +0000 |
---|---|---|
committer | Tristan Gingold <gingold@adacore.com> | 2009-09-09 14:58:12 +0000 |
commit | ad86f1fb4da4f0b049bfd5f9fb05dcd52124ad33 (patch) | |
tree | dc6b5e64240c09bae289bb9839de5acf0ac40873 /bfd/mach-o.c | |
parent | 22ba0981786d9fc6ab459bc449735d51f437dbe8 (diff) | |
download | gdb-ad86f1fb4da4f0b049bfd5f9fb05dcd52124ad33.zip gdb-ad86f1fb4da4f0b049bfd5f9fb05dcd52124ad33.tar.gz 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.c | 52 |
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; |