* 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.
This commit is contained in:
Nick Clifton 2006-02-28 16:09:01 +00:00
parent 9f6f925e1e
commit f9d4ad2a13
3 changed files with 35 additions and 10 deletions

View 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> 2006-02-27 Carlos O'Donell <carlos@codesourcery.com>
* po/Make-in: Add html target. * po/Make-in: Add html target.

View 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 @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 a machine is assigned an official code and the tool-chain adopts the
new code, but other applications still depend on the original code 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 @item --writable-text
Mark the output text as writable. This option isn't meaningful for all Mark the output text as writable. This option isn't meaningful for all

View file

@ -147,8 +147,8 @@ static bfd_byte gap_fill = 0;
static bfd_boolean pad_to_set = FALSE; static bfd_boolean pad_to_set = FALSE;
static bfd_vma pad_to; static bfd_vma pad_to;
/* Use alternate machine code? */ /* Use alternative machine code? */
static int use_alt_mach_code = 0; static unsigned long use_alt_mach_code = 0;
/* Output BFD flags user wants to set or clear */ /* Output BFD flags user wants to set or clear */
static flagword bfd_flags_to_set; 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\ --globalize-symbols <file> --globalize-symbol for all in <file>\n\
--keep-global-symbols <file> -G for all symbols listed 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\ --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\ --writable-text Mark the output text as writable\n\
--readonly-text Make the output text write protected\n\ --readonly-text Make the output text write protected\n\
--pure Mark the output file as demand paged\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 /* Switch to the alternate machine code. We have to do this at the
very end, because we only initialize the header when we create very end, because we only initialize the header when we create
the first section. */ the first section. */
if (use_alt_mach_code != 0 if (use_alt_mach_code != 0)
&& ! bfd_alt_mach_code (obfd, use_alt_mach_code)) {
non_fatal (_("unknown alternate machine code, ignored")); 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; return TRUE;
} }
@ -3069,9 +3081,9 @@ copy_main (int argc, char *argv[])
break; break;
case OPTION_ALT_MACH_CODE: case OPTION_ALT_MACH_CODE:
use_alt_mach_code = atoi (optarg); use_alt_mach_code = strtoul (optarg, NULL, 0);
if (use_alt_mach_code <= 0) if (use_alt_mach_code == 0)
fatal (_("alternate machine code index must be positive")); fatal (_("unable to parse alternative machine code"));
break; break;
case OPTION_PREFIX_SYMBOLS: case OPTION_PREFIX_SYMBOLS: