diff options
author | Tristan Gingold <gingold@adacore.com> | 2012-01-20 10:40:53 +0000 |
---|---|---|
committer | Tristan Gingold <gingold@adacore.com> | 2012-01-20 10:40:53 +0000 |
commit | 2128eb399e7c8ad74793352fa88fdee4a5767fe8 (patch) | |
tree | 8b035589f49de53746cb9d15c63c95384cf661ff /binutils/od-macho.c | |
parent | d99bd577a11f0859c380121b4ce41a551818b14e (diff) | |
download | gdb-2128eb399e7c8ad74793352fa88fdee4a5767fe8.zip gdb-2128eb399e7c8ad74793352fa88fdee4a5767fe8.tar.gz gdb-2128eb399e7c8ad74793352fa88fdee4a5767fe8.tar.bz2 |
2012-01-20 Tristan Gingold <gingold@adacore.com>
* od-macho.c (OPT_SEG_SPLIT_INFO): New macro.
(options): Add an entry for seg_split_info.
(mach_o_help): Document it.
(dump_segment_split_info): New function.
(dump_load_command): Handle seg_split_info.
Diffstat (limited to 'binutils/od-macho.c')
-rw-r--r-- | binutils/od-macho.c | 67 |
1 files changed, 61 insertions, 6 deletions
diff --git a/binutils/od-macho.c b/binutils/od-macho.c index 91e080e..d0b4cc1 100644 --- a/binutils/od-macho.c +++ b/binutils/od-macho.c @@ -27,6 +27,7 @@ #include "objdump.h" #include "bucomm.h" #include "bfdlink.h" +#include "libbfd.h" #include "mach-o.h" #include "mach-o/external.h" #include "mach-o/codesign.h" @@ -38,6 +39,7 @@ #define OPT_LOAD 3 #define OPT_DYSYMTAB 4 #define OPT_CODESIGN 5 +#define OPT_SEG_SPLIT_INFO 6 /* List of actions. */ static struct objdump_private_option options[] = @@ -48,6 +50,7 @@ static struct objdump_private_option options[] = { "load", 0 }, { "dysymtab", 0 }, { "codesign", 0 }, + { "seg_split_info", 0 }, { NULL, 0 } }; @@ -58,12 +61,13 @@ mach_o_help (FILE *stream) { fprintf (stream, _("\ For Mach-O files:\n\ - header Display the file header\n\ - section Display the segments and sections commands\n\ - map Display the section map\n\ - load Display the load commands\n\ - dysymtab Display the dynamic symbol table\n\ - codesign Display code signature section\n\ + header Display the file header\n\ + section Display the segments and sections commands\n\ + map Display the section map\n\ + load Display the load commands\n\ + dysymtab Display the dynamic symbol table\n\ + codesign Display code signature\n\ + seg_split_info Display segment split info\n\ ")); } @@ -852,6 +856,53 @@ dump_code_signature (bfd *abfd, bfd_mach_o_linkedit_command *cmd) } static void +dump_segment_split_info (bfd *abfd, bfd_mach_o_linkedit_command *cmd) +{ + unsigned char *buf = xmalloc (cmd->datasize); + unsigned char *p; + unsigned int len; + bfd_vma addr = 0; + + if (bfd_seek (abfd, cmd->dataoff, SEEK_SET) != 0 + || bfd_bread (buf, cmd->datasize, abfd) != cmd->datasize) + { + non_fatal (_("cannot read segment split info")); + free (buf); + return; + } + if (buf[cmd->datasize - 1] != 0) + { + non_fatal (_("segment split info is not nul terminated")); + free (buf); + return; + } + + switch (buf[0]) + { + case 0: + printf (_(" 32 bit pointers:\n")); + break; + case 1: + printf (_(" 64 bit pointers:\n")); + break; + case 2: + printf (_(" PPC hi-16:\n")); + break; + default: + printf (_(" Unhandled location type %u\n"), buf[0]); + break; + } + for (p = buf + 1; *p != 0; p += len) + { + addr += read_unsigned_leb128 (abfd, p, &len); + fputs (" ", stdout); + bfd_printf_vma (abfd, addr); + putchar ('\n'); + } + free (buf); +} + +static void dump_load_command (bfd *abfd, bfd_mach_o_load_command *cmd, bfd_boolean verbose) { @@ -942,6 +993,8 @@ dump_load_command (bfd *abfd, bfd_mach_o_load_command *cmd, if (verbose && cmd->type == BFD_MACH_O_LC_CODE_SIGNATURE) dump_code_signature (abfd, linkedit); + else if (verbose && cmd->type == BFD_MACH_O_LC_SEGMENT_SPLIT_INFO) + dump_segment_split_info (abfd, linkedit); break; } case BFD_MACH_O_LC_SUB_FRAMEWORK: @@ -1026,6 +1079,8 @@ mach_o_dump (bfd *abfd) dump_load_commands (abfd, BFD_MACH_O_LC_DYSYMTAB, 0); if (options[OPT_CODESIGN].selected) dump_load_commands (abfd, BFD_MACH_O_LC_CODE_SIGNATURE, 0); + if (options[OPT_SEG_SPLIT_INFO].selected) + dump_load_commands (abfd, BFD_MACH_O_LC_SEGMENT_SPLIT_INFO, 0); } /* Vector for Mach-O. */ |