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 783CC3857378 for ; Fri, 15 Apr 2022 09:41:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 783CC3857378 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 AQAAf9DxDxLQPVliBFkkAA--.16253S2; Fri, 15 Apr 2022 17:41:40 +0800 (CST) From: liuzhensong To: binutils@sourceware.org Cc: liuzhensong Subject: [PATCH v2] objcopy: Add elf header e_flags option in objcopy. Date: Fri, 15 Apr 2022 17:41:32 +0800 Message-Id: <20220415094132.284598-1-liuzhensong@loongson.cn> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID: AQAAf9DxDxLQPVliBFkkAA--.16253S2 X-Coremail-Antispam: 1UD129KBjvJXoWxJFWkXr13GF1rKF47WryfJFb_yoWrAF18pa 1rtFyfWF4fJFyfX3ZxJF48Wr4ruw4kWFWjkrn8Jw4DA3WrXFy8tw10kF1aga1qya1UZ3W3 Za47ZFy7Ca17Zr7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUka14x267AKxVWUJVW8JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26F1j6w1UM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4U JVWxJr1l84ACjcxK6I8E87Iv67AKxVW0oVCq3wA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gc CE3s1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E 2Ix0cI8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJV W8JwACjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lc2xSY4AK6svPMxAI w28IcxkI7VAKI48JMxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr 4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUXVWUAwCIc40Y0x0EwIxG rwCI42IY6xIIjxv20xvE14v26r1j6r1xMIIF0xvE2Ix0cI8IcVCY1x0267AKxVWUJVW8Jw CI42IY6xAIw20EY4v20xvaj40_WFyUJVCq3wCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY 6I8E87Iv6xkF7I0E14v26r1j6r4UYxBIdaVFxhVjvjDU0xZFpf9x0JUywZ7UUUUU= X-CM-SenderInfo: holx6xphqv003j6o00pqjv00gofq/ X-Spam-Status: No, score=-13.3 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: Fri, 15 Apr 2022 09:41:50 -0000 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} +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. + @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 -W for all symbols listed in \n\ --add-symbol =[
:][,] Add a symbol\n\ --alt-machine-code Use the target's 'th alternative machine\n\ + --alt-elf-eflags= 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; -- 2.31.1