From 6c14750f48f179e0fed8abc34010de3e05ec2a54 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 11 May 2015 09:57:20 -0700 Subject: [PATCH] Add EM_386/EM_IAMCU support to elfedit.c binutils/ * elfedit.c (enum elfclass): New. (input_elf_class): Change type to enum elfclass. (output_elf_class): New. (elf_class): Change return type to enum elfclass. Support EM_386 and EM_IAMCU. (update_elf_header): Check if input and output ELF classes match. (elf_machine): Support EM_386 and EM_IAMCU. (main): Update input_elf_class. Set output_elf_class. * doc/binutils.texi: Update elfedit. binutils/testsuite/ * binutils-all/elfedit-5.d: New file. * binutils-all/elfedit.exp: Run elfedit-5. --- binutils/ChangeLog | 12 ++++ binutils/doc/binutils.texi | 4 +- binutils/elfedit.c | 79 ++++++++++++++------- binutils/testsuite/ChangeLog | 5 ++ binutils/testsuite/binutils-all/elfedit-5.d | 17 +++++ binutils/testsuite/binutils-all/elfedit.exp | 1 + 6 files changed, 92 insertions(+), 26 deletions(-) create mode 100644 binutils/testsuite/binutils-all/elfedit-5.d diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 37378a55583..70b9aaea50c 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,15 @@ +2015-05-11 H.J. Lu + + * elfedit.c (enum elfclass): New. + (input_elf_class): Change type to enum elfclass. + (output_elf_class): New. + (elf_class): Change return type to enum elfclass. Support EM_386 + and EM_IAMCU. + (update_elf_header): Check if input and output ELF classes match. + (elf_machine): Support EM_386 and EM_IAMCU. + (main): Update input_elf_class. Set output_elf_class. + * doc/binutils.texi: Update elfedit. + 2015-05-11 H.J. Lu * dwarf.c (init_dwarf_regnames): Replace EM_486 with EM_IAMCU. diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi index dbf44c93b48..601de480bbc 100644 --- a/binutils/doc/binutils.texi +++ b/binutils/doc/binutils.texi @@ -4614,8 +4614,8 @@ Set the matching input ELF machine type to @var{machine}. If @option{--input-mach} isn't specified, it will match any ELF machine types. -The supported ELF machine types are, @var{L1OM}, @var{K1OM} and -@var{x86-64}. +The supported ELF machine types are, @var{i386}, @var{IAMCU}, @var{L1OM}, +@var{K1OM} and @var{x86-64}. @item --output-mach=@var{machine} Change the ELF machine type in the ELF header to @var{machine}. The diff --git a/binutils/elfedit.c b/binutils/elfedit.c index 5b2bf86d798..1bcb48aba89 100644 --- a/binutils/elfedit.c +++ b/binutils/elfedit.c @@ -54,7 +54,38 @@ static int input_elf_type = -1; static int output_elf_type = -1; static int input_elf_osabi = -1; static int output_elf_osabi = -1; -static int input_elf_class = -1; +enum elfclass + { + ELF_CLASS_UNKNOWN = -1, + ELF_CLASS_NONE = ELFCLASSNONE, + ELF_CLASS_32 = ELFCLASS32, + ELF_CLASS_64 = ELFCLASS64, + ELF_CLASS_BOTH + }; +static enum elfclass input_elf_class = ELF_CLASS_UNKNOWN; +static enum elfclass output_elf_class = ELF_CLASS_BOTH; + +/* Return ELF class for a machine type, MACH. */ + +static enum elfclass +elf_class (int mach) +{ + switch (mach) + { + case EM_386: + case EM_IAMCU: + return ELF_CLASS_32; + case EM_L1OM: + case EM_K1OM: + return ELF_CLASS_64; + case EM_X86_64: + case EM_NONE: + return ELF_CLASS_BOTH; + default: + error (_("Unknown machine type: %d\n"), mach); + return ELF_CLASS_UNKNOWN; + } +} static int update_elf_header (const char *file_name, FILE *file) @@ -86,17 +117,29 @@ update_elf_header (const char *file_name, FILE *file) return 1; class = elf_header.e_ident[EI_CLASS]; + machine = elf_header.e_machine; /* Skip if class doesn't match. */ - if (input_elf_class != -1 && class != input_elf_class) + if (input_elf_class == ELF_CLASS_UNKNOWN) + input_elf_class = elf_class (machine); + + if (input_elf_class != ELF_CLASS_BOTH + && (int) input_elf_class != class) { error - (_("%s: Unmatched EI_CLASS: %d is not %d\n"), + (_("%s: Unmatched input EI_CLASS: %d is not %d\n"), file_name, class, input_elf_class); return 0; } - machine = elf_header.e_machine; + if (output_elf_class != ELF_CLASS_BOTH + && (int) output_elf_class != class) + { + error + (_("%s: Unmatched output EI_CLASS: %d is not %d\n"), + file_name, class, output_elf_class); + return 0; + } /* Skip if e_machine doesn't match. */ if (input_elf_machine != -1 && machine != input_elf_machine) @@ -551,6 +594,10 @@ elf_osabi (const char *osabi) static int elf_machine (const char *mach) { + if (strcasecmp (mach, "i386") == 0) + return EM_386; + if (strcasecmp (mach, "iamcu") == 0) + return EM_IAMCU; if (strcasecmp (mach, "l1om") == 0) return EM_L1OM; if (strcasecmp (mach, "k1om") == 0) @@ -567,25 +614,6 @@ elf_machine (const char *mach) return -1; } -/* Return ELF class for a machine type, MACH. */ - -static int -elf_class (int mach) -{ - switch (mach) - { - case EM_L1OM: - case EM_K1OM: - case EM_X86_64: - return ELFCLASS64; - case EM_NONE: - return ELFCLASSNONE; - default: - error (_("Unknown machine type: %d\n"), mach); - return -1; - } -} - /* Return ET_XXX for a type string, TYPE. */ static int @@ -677,7 +705,7 @@ main (int argc, char ** argv) if (input_elf_machine < 0) return 1; input_elf_class = elf_class (input_elf_machine); - if (input_elf_class < 0) + if (input_elf_class == ELF_CLASS_UNKNOWN) return 1; break; @@ -685,6 +713,9 @@ main (int argc, char ** argv) output_elf_machine = elf_machine (optarg); if (output_elf_machine < 0) return 1; + output_elf_class = elf_class (output_elf_machine); + if (output_elf_class == ELF_CLASS_UNKNOWN) + return 1; break; case OPTION_INPUT_TYPE: diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog index b9b7b3e6416..2dd3f0e09bd 100644 --- a/binutils/testsuite/ChangeLog +++ b/binutils/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-05-11 H.J. Lu + + * binutils-all/elfedit-5.d: New file. + * binutils-all/elfedit.exp: Run elfedit-5. + 2015-04-30 Nick Clifton * binutils-all/objdump.exp (cpus_expected): Add MeP CPU names. diff --git a/binutils/testsuite/binutils-all/elfedit-5.d b/binutils/testsuite/binutils-all/elfedit-5.d new file mode 100644 index 00000000000..44b3c71fce7 --- /dev/null +++ b/binutils/testsuite/binutils-all/elfedit-5.d @@ -0,0 +1,17 @@ +#PROG: elfedit +#elfedit: --output-mach iamcu +#source: empty.s +#as: --32 +#readelf: -h +#name: Update ELF header 5 +#target: x86_64-*-* i386-*-* + +#... +ELF Header: + Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 + Class: ELF32 + Data: 2's complement, little endian + Version: 1 \(current\) +#... + Machine: Intel MCU +#... diff --git a/binutils/testsuite/binutils-all/elfedit.exp b/binutils/testsuite/binutils-all/elfedit.exp index 465c39dedd3..742dd1562cd 100644 --- a/binutils/testsuite/binutils-all/elfedit.exp +++ b/binutils/testsuite/binutils-all/elfedit.exp @@ -32,3 +32,4 @@ run_dump_test "elfedit-1" run_dump_test "elfedit-2" run_dump_test "elfedit-3" run_dump_test "elfedit-4" +run_dump_test "elfedit-5" -- 2.30.2