public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: liuzhensong <liuzhensong@loongson.cn>
To: WANG Xuerui <i.swmail@xen0n.name>, binutils@sourceware.org
Subject: Re: [PATCH v2] objcopy: Add elf header e_flags option in objcopy.
Date: Sun, 17 Apr 2022 15:33:44 +0800	[thread overview]
Message-ID: <acc88a13-60ac-bfc0-08eb-9e1987c569c1@loongson.cn> (raw)
In-Reply-To: <dbfa3697-a9e5-c000-d6c4-cfd1f40387db@xen0n.name>


On 2022/4/15 下午6:06, WANG Xuerui wrote:
> Hi,
>
> On 4/15/22 17:41, liuzhensong wrote:
>> Specify flags when copying binary to elf file.
>> This flags will be written to the e_flags of the elf header.
>>
>> usage:
>>    objcopy -I binary -O target --alt-elf-eflags=val bin_file elf_file
>>
>> binutils/
>>    * objcopy.c
>>    * doc/binutils.texi:Add the new objcopy option.
>> ---
>>   binutils/doc/binutils.texi |  7 +++++++
>>   binutils/objcopy.c         | 16 ++++++++++++++++
>>   2 files changed, 23 insertions(+)
>>
>> diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi
>> index 2c234c682aa..b36aad05c98 100644
>> --- a/binutils/doc/binutils.texi
>> +++ b/binutils/doc/binutils.texi
>> @@ -1302,6 +1302,7 @@ objcopy [@option{-F} 
>> @var{bfdname}|@option{--target=}@var{bfdname}]
>>           [@option{--weaken-symbols=}@var{filename}]
>>           [@option{--add-symbol} 
>> @var{name}=[@var{section}:]@var{value}[,@var{flags}]]
>>           [@option{--alt-machine-code=}@var{index}]
>> +        [@option{--alt-elf-eflags=}@var{value}]
>>           [@option{--prefix-symbols=}@var{string}]
>>           [@option{--prefix-sections=}@var{string}]
>>           [@option{--prefix-alloc-sections=}@var{string}]
>> @@ -1942,6 +1943,12 @@ 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 --alt-elf-eflags=@var{value}
>> +If the output file has alternate ELF header e_flags, use the 
>> @var{vaule}
>
> Typo; "value".
>
>> +instead of the default one.  This is useful in case objcopy a binary to
>> +an ELF to specify the e_flags. The value is treated as an absolute
>> +number to be stored in the e_flags field of the ELF header.
>
> Actually the whole description seems inaccurate (which field is the 
> alternate to e_flags? what's e_flags's "default" value?), and the 
> English is broken.
>
> By reading the implementation it's clear the value specified here 
> would get into any output file that is ELF. So no need to call it 
> "alt"; a name like "--elf-eflags" would be enough.
>
> Something like this would be better IMO:
>
> "Meaningful only for ELF output.  Use @var{value} as e_flags of the 
> output.  This is useful for changing the e_flags of an existing 
> binary.  The @var{value} is treated as an absolute number to be stored 
> in the e_flags field of the ELF header."
>
>> +
>>   @item --writable-text
>>   Mark the output text as writable.  This option isn't meaningful for 
>> all
>>   object file formats.
>> diff --git a/binutils/objcopy.c b/binutils/objcopy.c
>> index 6fb31c8cac7..032caf565d1 100644
>> --- a/binutils/objcopy.c
>> +++ b/binutils/objcopy.c
>> @@ -303,6 +303,10 @@ enum long_section_name_handling
>>      This is also the only behaviour for 'strip'.  */
>>   static enum long_section_name_handling long_section_names = KEEP;
>>   +/* Use alternative elf header e_flags?  */
>> +static bool alt_elf_eflags_set = false;
>> +static unsigned int alt_elf_eflags = 0;
>> +
>>   /* 150 isn't special; it's just an arbitrary non-ASCII char value.  */
>>   enum command_line_switch
>>   {
>> @@ -310,6 +314,7 @@ enum command_line_switch
>>     OPTION_ADD_GNU_DEBUGLINK,
>>     OPTION_ADD_SYMBOL,
>>     OPTION_ALT_MACH_CODE,
>> +  OPTION_ALT_ELF_EFLAGS,
>>     OPTION_CHANGE_ADDRESSES,
>>     OPTION_CHANGE_LEADING_CHAR,
>>     OPTION_CHANGE_SECTION_ADDRESS,
>> @@ -427,6 +432,7 @@ static struct option copy_options[] =
>>     {"adjust-vma", required_argument, 0, OPTION_CHANGE_ADDRESSES},
>>     {"adjust-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
>>     {"alt-machine-code", required_argument, 0, OPTION_ALT_MACH_CODE},
>> +  {"alt-elf-eflags", required_argument, 0, OPTION_ALT_ELF_EFLAGS},
>>     {"binary-architecture", required_argument, 0, 'B'},
>>     {"byte", required_argument, 0, 'b'},
>>     {"change-addresses", required_argument, 0, OPTION_CHANGE_ADDRESSES},
>> @@ -660,6 +666,7 @@ copy_usage (FILE *stream, int exit_status)
>>        --weaken-symbols <file>       -W for all symbols listed in 
>> <file>\n\
>>        --add-symbol <name>=[<section>:]<value>[,<flags>] Add a symbol\n\
>>        --alt-machine-code <index>    Use the target's <index>'th 
>> alternative machine\n\
>> +     --alt-elf-eflags=<value>      Use the alternative elf header 
>> e_flags\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\
>> @@ -3496,6 +3503,10 @@ copy_object (bfd *ibfd, bfd *obfd, const 
>> bfd_arch_info_type *input_arch)
>>       }
>>       }
>>   +  if (bfd_get_flavour (obfd) == bfd_target_elf_flavour
>> +      && alt_elf_eflags_set)
>> +    elf_elfheader (obfd)->e_flags = alt_elf_eflags;
>> +
>>     return true;
>>   }
>>   @@ -5863,6 +5874,11 @@ copy_main (int argc, char *argv[])
>>           fatal (_("verilog data width must be at least 1 byte"));
>>         break;
>>   +    case OPTION_ALT_ELF_EFLAGS:
>> +      alt_elf_eflags_set = true;
>> +      alt_elf_eflags = parse_vma (optarg, "--alt-elf-eflags");
>> +      break;
>> +
>>       case 0:
>>         /* We've been given a long option.  */
>>         break;


Thank you for the review, it looks more appropriate.

I will send a v3 with the changes.

--
liuzhensong


      reply	other threads:[~2022-04-17  7:33 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-15  9:41 liuzhensong
2022-04-15 10:06 ` WANG Xuerui
2022-04-17  7:33   ` liuzhensong [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=acc88a13-60ac-bfc0-08eb-9e1987c569c1@loongson.cn \
    --to=liuzhensong@loongson.cn \
    --cc=binutils@sourceware.org \
    --cc=i.swmail@xen0n.name \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).