2012-11-14  Tristan Gingold  <gingold@adacore.com>

	* mach-o.c (bfd_mach_o_read_main)
	(bfd_mach_o_read_source_version): New functions.
	(bfd_mach_o_read_command): Handle BFD_MACH_O_LC_DATA_IN_CODE,
	BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS, BFD_MACH_O_LC_MAIN,
	BFD_MACH_O_LC_SOURCE_VERSION.
	* mach-o.h (bfd_mach_o_main_command)
	(bfd_mach_o_source_version_command): New types.
	(bfd_mach_o_load_command): Add fields for these new types.

binutils/
2012-11-14  Tristan Gingold  <gingold@adacore.com>

	* od-macho.c (bfd_mach_o_load_command_name): Add new definitions.
	(dump_load_command): Handle BFD_MACH_O_LC_SOURCE_VERSION
	and BFD_MACH_O_LC_MAIN.
This commit is contained in:
Tristan Gingold 2012-11-14 11:03:27 +00:00
parent 91cb77818b
commit 1778ad74b3
5 changed files with 114 additions and 1 deletions

View File

@ -1,3 +1,14 @@
2012-11-14 Tristan Gingold <gingold@adacore.com>
* mach-o.c (bfd_mach_o_read_main)
(bfd_mach_o_read_source_version): New functions.
(bfd_mach_o_read_command): Handle BFD_MACH_O_LC_DATA_IN_CODE,
BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS, BFD_MACH_O_LC_MAIN,
BFD_MACH_O_LC_SOURCE_VERSION.
* mach-o.h (bfd_mach_o_main_command)
(bfd_mach_o_source_version_command): New types.
(bfd_mach_o_load_command): Add fields for these new types.
2012-11-14 Tristan Gingold <gingold@adacore.com>
* mach-o.c (bfd_mach_o_canonicalize_one_reloc): Add a special

View File

@ -3666,6 +3666,48 @@ bfd_mach_o_read_encryption_info (bfd *abfd, bfd_mach_o_load_command *command)
return TRUE;
}
static bfd_boolean
bfd_mach_o_read_main (bfd *abfd, bfd_mach_o_load_command *command)
{
bfd_mach_o_main_command *cmd = &command->command.main;
struct mach_o_entry_point_command_external raw;
if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
|| bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
return FALSE;
cmd->entryoff = bfd_get_64 (abfd, raw.entryoff);
cmd->stacksize = bfd_get_64 (abfd, raw.stacksize);
return TRUE;
}
static bfd_boolean
bfd_mach_o_read_source_version (bfd *abfd, bfd_mach_o_load_command *command)
{
bfd_mach_o_source_version_command *cmd = &command->command.source_version;
struct mach_o_source_version_command_external raw;
bfd_uint64_t ver;
if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
|| bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
return FALSE;
ver = bfd_get_64 (abfd, raw.version);
/* Note: we use a serie of shift to avoid shift > 32 (for which gcc
generates warnings) in case of the host doesn't support 64 bit
integers. */
cmd->e = ver & 0x3ff;
ver >>= 10;
cmd->d = ver & 0x3ff;
ver >>= 10;
cmd->c = ver & 0x3ff;
ver >>= 10;
cmd->b = ver & 0x3ff;
ver >>= 10;
cmd->a = ver & 0xffffff;
return TRUE;
}
static int
bfd_mach_o_read_segment (bfd *abfd,
bfd_mach_o_load_command *command,
@ -3842,6 +3884,8 @@ bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
case BFD_MACH_O_LC_CODE_SIGNATURE:
case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
case BFD_MACH_O_LC_FUNCTION_STARTS:
case BFD_MACH_O_LC_DATA_IN_CODE:
case BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS:
if (bfd_mach_o_read_linkedit (abfd, command) != 0)
return -1;
break;
@ -3858,6 +3902,14 @@ bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
if (!bfd_mach_o_read_version_min (abfd, command))
return -1;
break;
case BFD_MACH_O_LC_MAIN:
if (!bfd_mach_o_read_main (abfd, command))
return -1;
break;
case BFD_MACH_O_LC_SOURCE_VERSION:
if (!bfd_mach_o_read_source_version (abfd, command))
return -1;
break;
default:
(*_bfd_error_handler)(_("%B: unknown load command 0x%lx"),
abfd, (unsigned long) command->type);

View File

@ -467,7 +467,7 @@ bfd_mach_o_fvmlib_command;
typedef struct bfd_mach_o_dyld_info_command
{
/* File offset and size to rebase info. */
unsigned int rebase_off;
unsigned int rebase_off;
unsigned int rebase_size;
/* File offset and size of binding info. */
@ -505,6 +505,23 @@ typedef struct bfd_mach_o_encryption_info_command
}
bfd_mach_o_encryption_info_command;
typedef struct bfd_mach_o_main_command
{
bfd_uint64_t entryoff;
bfd_uint64_t stacksize;
}
bfd_mach_o_main_command;
typedef struct bfd_mach_o_source_version_command
{
unsigned int a;
unsigned short b;
unsigned short c;
unsigned short d;
unsigned short e;
}
bfd_mach_o_source_version_command;
typedef struct bfd_mach_o_load_command
{
bfd_mach_o_load_command_type type;
@ -527,6 +544,8 @@ typedef struct bfd_mach_o_load_command
bfd_mach_o_version_min_command version_min;
bfd_mach_o_encryption_info_command encryption_info;
bfd_mach_o_fvmlib_command fvmlib;
bfd_mach_o_main_command main;
bfd_mach_o_source_version_command source_version;
}
command;
}

View File

@ -1,3 +1,9 @@
2012-11-14 Tristan Gingold <gingold@adacore.com>
* od-macho.c (bfd_mach_o_load_command_name): Add new definitions.
(dump_load_command): Handle BFD_MACH_O_LC_SOURCE_VERSION
and BFD_MACH_O_LC_MAIN.
2012-11-13 Maciej W. Rozycki <macro@codesourcery.com>
* readelf.c (get_machine_flags) <EM_MIPS, EM_MIPS_RS3_LE>: Move

View File

@ -182,6 +182,10 @@ static const bfd_mach_o_xlat_name bfd_mach_o_load_command_name[] =
{ "version_min_iphoneos", BFD_MACH_O_LC_VERSION_MIN_IPHONEOS},
{ "function_starts", BFD_MACH_O_LC_FUNCTION_STARTS},
{ "dyld_environment", BFD_MACH_O_LC_DYLD_ENVIRONMENT},
{ "main", BFD_MACH_O_LC_MAIN},
{ "data_in_code", BFD_MACH_O_LC_DATA_IN_CODE},
{ "source_version", BFD_MACH_O_LC_SOURCE_VERSION},
{ "dylib_code_sign_drs", BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS},
{ NULL, 0}
};
@ -1036,6 +1040,27 @@ dump_load_command (bfd *abfd, bfd_mach_o_load_command *cmd,
printf (" %u.%u.%u\n", ver->rel, ver->maj, ver->min);
}
break;
case BFD_MACH_O_LC_SOURCE_VERSION:
{
bfd_mach_o_source_version_command *version =
&cmd->command.source_version;
printf ("\n"
" version a.b.c.d.e: %u.%u.%u.%u.%u\n",
version->a, version->b, version->c, version->d, version->e);
break;
}
case BFD_MACH_O_LC_MAIN:
{
bfd_mach_o_main_command *entry = &cmd->command.main;
printf ("\n"
" entry offset: ");
printf_vma (entry->entryoff);
printf ("\n"
" stack size: ");
printf_vma (entry->stacksize);
printf ("\n");
break;
}
default:
putchar ('\n');
printf (" offset: 0x%08lx\n", (unsigned long)cmd->offset);