From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id D51923857349 for ; Sun, 17 Apr 2022 08:24:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D51923857349 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from 5.5.5 (unknown [10.2.5.5]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9Dx3xCgzltiTmsmAA--.20035S2; Sun, 17 Apr 2022 16:24:05 +0800 (CST) From: liuzhensong To: binutils@sourceware.org Cc: liuzhensong Subject: [PATCH v3] objcopy: Add ELF header e_flags option in objcopy. Date: Sun, 17 Apr 2022 16:23:58 +0800 Message-Id: <20220417082358.395464-1-liuzhensong@loongson.cn> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID: AQAAf9Dx3xCgzltiTmsmAA--.20035S2 X-Coremail-Antispam: 1UD129KBjvJXoWxXw1kCryxJryrArWfCw4rZrb_yoWrGFW7p3 WrtFnagF4UtrWxZrn5Ja18Wr4ru3y8uFWUCrs8Jw4qvFWrXry8Kw1Iy3W3KayqvF4UZw45 Za429FyUGws7Zr7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUkv14x267AKxVWUJVW8JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26r1j6r1xM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r1j 6r4UM28EF7xvwVC2z280aVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr 1j6F4UJwAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv 7VC0I7IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r 1j6r4UM4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCY02Avz4vE-syl 42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJV WUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1Y6r17MIIYrxkI7VAK I48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r1j6r 4UMIIF0xvE42xK8VAvwI8IcIk0rVWrJr0_WFyUJwCI42IY6I8E87Iv67AKxVWUJVW8JwCI 42IY6I8E87Iv6xkF7I0E14v26r1j6r4UYxBIdaVFxhVjvjDU0xZFpf9x0JUywZ7UUUUU= X-CM-SenderInfo: holx6xphqv003j6o00pqjv00gofq/ X-Spam-Status: No, score=-13.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Apr 2022 08:24:10 -0000 Specify flags when copying binary to ELF. The flags is treated as an absolute number to be stored in the e_flags field of the ELF header. Usage: objcopy -I binary -O target --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..65230775b29 100644 --- a/binutils/doc/binutils.texi +++ b/binutils/doc/binutils.texi @@ -1326,6 +1326,7 @@ objcopy [@option{-F} @var{bfdname}|@option{--target=}@var{bfdname}] [@option{--merge-notes}] [@option{--no-merge-notes}] [@option{--verilog-data-width=@var{val}}] + [@option{--elf-eflags=}@var{value}] [@option{-v}|@option{--verbose}] [@option{-V}|@option{--version}] [@option{--help}] [@option{--info}] @@ -2187,6 +2188,12 @@ For Verilog output, this options controls the number of bytes converted for each output data element. The input target controls the endianness of the conversion. +@item --elf-eflags=@var{value} +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 -v @itemx --verbose Verbose output: list all object files modified. In the case of diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 6fb31c8cac7..3c1eaf5ec1a 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; +/* Specify ELF header e_flags? */ +static bool elf_eflags_set = false; +static unsigned int elf_eflags = 0; + /* 150 isn't special; it's just an arbitrary non-ASCII char value. */ enum command_line_switch { @@ -321,6 +325,7 @@ enum command_line_switch OPTION_DEBUGGING, OPTION_DECOMPRESS_DEBUG_SECTIONS, OPTION_DUMP_SECTION, + OPTION_ELF_EFLAGS, OPTION_ELF_STT_COMMON, OPTION_EXTRACT_DWO, OPTION_EXTRACT_SYMBOL, @@ -443,6 +448,7 @@ static struct option copy_options[] = {"discard-all", no_argument, 0, 'x'}, {"discard-locals", no_argument, 0, 'X'}, {"dump-section", required_argument, 0, OPTION_DUMP_SECTION}, + {"elf-eflags", required_argument, 0, OPTION_ELF_EFLAGS}, {"elf-stt-common", required_argument, 0, OPTION_ELF_STT_COMMON}, {"enable-deterministic-archives", no_argument, 0, 'D'}, {"extract-dwo", no_argument, 0, OPTION_EXTRACT_DWO}, @@ -684,6 +690,7 @@ copy_usage (FILE *stream, int exit_status) --elf-stt-common=[yes|no] Generate ELF common symbols with STT_COMMON\n\ type\n\ --verilog-data-width Specifies data width, in bytes, for verilog output\n\ + --elf-eflags= Set e_flags to for ELF output\n\ -M --merge-notes Remove redundant entries in note sections\n\ --no-merge-notes Do not attempt to remove redundant notes (default)\n\ -v --verbose List all object files modified\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 + && elf_eflags_set) + elf_elfheader (obfd)->e_flags = 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_ELF_EFLAGS: + elf_eflags_set = true; + elf_eflags = parse_vma (optarg, "--elf-eflags"); + break; + case 0: /* We've been given a long option. */ break; -- 2.31.1