* objcopy.c (use_alt_mach_code): Change type to unsigned long.
authorNick Clifton <nickc@redhat.com>
Tue, 28 Feb 2006 16:09:01 +0000 (16:09 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 28 Feb 2006 16:09:01 +0000 (16:09 +0000)
   (copy_object):  If bfd_alt_mach_code fails emit a more helpful message
   and if the target architecture is ELF use the alternative as replacement
   value for the e_machine number.
   (copy_main): Use strtoul to parse the number provided with the
   --alt-mach-code switch.
* doc/binutils.texi (--alt-mach-code): Document that this switch can now
    set the absolute e_machine value.

binutils/ChangeLog
binutils/doc/binutils.texi
binutils/objcopy.c

index 5fbcc4ffe8ca01adbf36af1f018de74f60ce59b8..99e3569e2a0f28f9c6b9652bb9d403e6fbac6255 100644 (file)
@@ -1,3 +1,14 @@
+2006-02-28  Nick Clifton  <nickc@redhat.com>
+
+       * objcopy.c (use_alt_mach_code): Change type to unsigned long.
+       (copy_object):  If bfd_alt_mach_code fails emit a more helpful
+       message and if the target architecture is ELF use the alternative
+       as replacement value for the e_machine number.
+       (copy_main): Use strtoul to parse the number provided with the
+       --alt-mach-code switch.
+       * doc/binutils.texi (--alt-mach-code): Document that this switch
+       can now set the absolute e_machine value.
+
 2006-02-27  Carlos O'Donell  <carlos@codesourcery.com>
 
        * po/Make-in: Add html target.
index 828eb5d2f39c1325562f64c8556f31d0afa8e42e..aaa0951229f54101fe1f60cadc3a9ffed24bf818 100644 (file)
@@ -1399,7 +1399,9 @@ If the output architecture has alternate machine codes, use the
 @var{index}th code instead of the default one.  This is useful in case
 a machine is assigned an official code and the tool-chain adopts the 
 new code, but other applications still depend on the original code
-being used.
+being used.  For ELF based architectures if the @var{index}
+alternative does not exist then the value is treated as an absolute
+number to be stored in the e_machine field of the ELF header.
 
 @item --writable-text
 Mark the output text as writable.  This option isn't meaningful for all
index a9fb877ec081d9201b3a9c48f14473ab68ba6a7f..0e0cfaaccf5e4fc24c33b8be98ec94a7b7fd814c 100644 (file)
@@ -147,8 +147,8 @@ static bfd_byte gap_fill = 0;
 static bfd_boolean pad_to_set = FALSE;
 static bfd_vma pad_to;
 
-/* Use alternate machine code?  */
-static int use_alt_mach_code = 0;
+/* Use alternative machine code?  */
+static unsigned long use_alt_mach_code = 0;
 
 /* Output BFD flags user wants to set or clear */
 static flagword bfd_flags_to_set;
@@ -473,7 +473,7 @@ copy_usage (FILE *stream, int exit_status)
      --globalize-symbols <file>    --globalize-symbol for all in <file>\n\
      --keep-global-symbols <file>  -G for all symbols listed in <file>\n\
      --weaken-symbols <file>       -W for all symbols listed in <file>\n\
-     --alt-machine-code <index>    Use alternate machine code for output\n\
+     --alt-machine-code <index>    Use the target's <index>'th alternative machine\n\
      --writable-text               Mark the output text as writable\n\
      --readonly-text               Make the output text write protected\n\
      --pure                        Mark the output file as demand paged\n\
@@ -1667,9 +1667,21 @@ copy_object (bfd *ibfd, bfd *obfd)
   /* Switch to the alternate machine code.  We have to do this at the
      very end, because we only initialize the header when we create
      the first section.  */
-  if (use_alt_mach_code != 0
-      && ! bfd_alt_mach_code (obfd, use_alt_mach_code))
-    non_fatal (_("unknown alternate machine code, ignored"));
+  if (use_alt_mach_code != 0)
+    {
+      if (! bfd_alt_mach_code (obfd, use_alt_mach_code))
+       {
+         non_fatal (_("this target does not support %lu alternative machine codes"),
+                    use_alt_mach_code);
+         if (bfd_get_flavour (obfd) == bfd_target_elf_flavour)
+           {
+             non_fatal (_("treating that number as an absolute e_machine value instead"));
+             elf_elfheader (obfd)->e_machine = use_alt_mach_code;
+           }
+         else
+           non_fatal (_("ignoring the alternative value"));
+       }
+    }
 
   return TRUE;
 }
@@ -3069,9 +3081,9 @@ copy_main (int argc, char *argv[])
          break;
 
        case OPTION_ALT_MACH_CODE:
-         use_alt_mach_code = atoi (optarg);
-         if (use_alt_mach_code <= 0)
-           fatal (_("alternate machine code index must be positive"));
+         use_alt_mach_code = strtoul (optarg, NULL, 0);
+         if (use_alt_mach_code == 0)
+           fatal (_("unable to parse alternative machine code"));
          break;
 
        case OPTION_PREFIX_SYMBOLS: