1008 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			1008 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 3d53d8d253ba7cfdd4715d39c61fcc1c504dbc95 Mon Sep 17 00:00:00 2001
 | |
| From: Andreas Schwab <schwab@suse.de>
 | |
| Date: Thu, 3 Aug 2023 17:22:42 +0200
 | |
| Subject: [PATCH] Add basic support for RISC-V 64-bit EFI objects
 | |
| 
 | |
| This adds a new PEI target pei-riscv64-little.  Only objdump and objcopy
 | |
| are supported.
 | |
| 
 | |
| bfd:
 | |
| 	* .gitignore: Add pe-riscv64igen.c.
 | |
| 	* Makefile.am (BFD64_BACKENDS): Add pei-riscv64.lo,
 | |
| 	pe-riscv64igen.lo.
 | |
| 	(BFD64_BACKENDS_CFILES): Add pei-riscv64.c.
 | |
| 	(BUILD_CFILES): Add pe-riscv64igen.c.
 | |
| 	(pe-riscv64igen.c): New rule.
 | |
| 	* Makefile.in: Regenerate.
 | |
| 	* bfd.c (bfd_get_sign_extend_vma): Add pei-riscv64-little.
 | |
| 	* coff-riscv64.c: New file.
 | |
| 	* coffcode.h (coff_set_arch_mach_hook, coff_set_flags)
 | |
| 	(coff_write_object_contents): Add riscv64 (riscv64_pei_vec)
 | |
| 	support.
 | |
| 	* config.bfd (targ_selvecs): Add riscv64_pei_vec to all riscv*
 | |
| 	targets.
 | |
| 	* configure.ac: Handle riscv64_pei_vec.
 | |
| 	* configure: Regenerate.
 | |
| 	* libpei.h (GET_OPTHDR_IMAGE_BASE, PUT_OPTHDR_IMAGE_BASE)
 | |
| 	(GET_OPTHDR_SIZE_OF_STACK_RESERVE)
 | |
| 	(PUT_OPTHDR_SIZE_OF_STACK_RESERVE)
 | |
| 	(GET_OPTHDR_SIZE_OF_STACK_COMMIT, PUT_OPTHDR_SIZE_OF_STACK_COMMIT)
 | |
| 	(GET_OPTHDR_SIZE_OF_HEAP_RESERVE, PUT_OPTHDR_SIZE_OF_HEAP_RESERVE)
 | |
| 	(GET_OPTHDR_SIZE_OF_HEAP_COMMIT, PUT_OPTHDR_SIZE_OF_HEAP_COMMIT)
 | |
| 	(GET_PDATA_ENTRY, _bfd_XX_bfd_copy_private_bfd_data_common)
 | |
| 	(_bfd_XX_bfd_copy_private_section_data)
 | |
| 	(_bfd_XX_get_symbol_info, _bfd_XX_only_swap_filehdr_out)
 | |
| 	(_bfd_XX_print_private_bfd_data_common)
 | |
| 	(_bfd_XXi_final_link_postscript, _bfd_XXi_only_swap_filehdr_out)
 | |
| 	(_bfd_XXi_swap_aouthdr_in, _bfd_XXi_swap_aouthdr_out)
 | |
| 	(_bfd_XXi_swap_aux_in, _bfd_XXi_swap_aux_out)
 | |
| 	(_bfd_XXi_swap_lineno_in, _bfd_XXi_swap_lineno_out)
 | |
| 	(_bfd_XXi_swap_scnhdr_out, _bfd_XXi_swap_sym_in)
 | |
| 	(_bfd_XXi_swap_sym_out, _bfd_XXi_swap_debugdir_in)
 | |
| 	(_bfd_XXi_swap_debugdir_out, _bfd_XXi_write_codeview_record)
 | |
| 	(_bfd_XXi_slurp_codeview_record) [COFF_WITH_peRiscV64]: Define.
 | |
| 	(_bfd_peRiscV64_print_ce_compressed_pdata): Declare.
 | |
| 	* peXXigen.c (_bfd_XXi_swap_aouthdr_in, _bfd_XXi_swap_aouthdr_out)
 | |
| 	(_bfd_XXi_swap_scnhdr_out, pe_print_pdata)
 | |
| 	(_bfd_XX_print_private_bfd_data_common)
 | |
| 	(_bfd_XX_bfd_copy_private_section_data)
 | |
| 	(_bfd_XXi_final_link_postscript): Support COFF_WITH_peRiscV64.
 | |
| 	* pei-riscv64.c: New file.
 | |
| 	* peicode.h (coff_swap_scnhdr_in, pe_ILF_build_a_bfd)
 | |
| 	(pe_ILF_object_p): Support COFF_WITH_peRiscV64.
 | |
| 	(jtab): Add dummy entry that traps.
 | |
| 	* targets.c (_bfd_target_vector): Add riscv64_pei_vec.
 | |
| 
 | |
| binutils:
 | |
| 	* testsuite/binutils-all/riscv/pei-riscv64.d: New.
 | |
| 	* testsuite/binutils-all/riscv/pei-riscv64.s: New.
 | |
| 
 | |
| include:
 | |
| 	* coff/riscv64.h: New file.
 | |
| 	* coff/pe.h (IMAGE_FILE_MACHINE_RISCV32)
 | |
| 	(IMAGE_FILE_MACHINE_RISCV64): Define.
 | |
| ---
 | |
|  bfd/.gitignore                                |   1 +
 | |
|  bfd/Makefile.am                               |  10 +-
 | |
|  bfd/Makefile.in                               |  12 +-
 | |
|  bfd/bfd.c                                     |   1 +
 | |
|  bfd/coff-riscv64.c                            | 130 ++++++++++++++++++
 | |
|  bfd/coffcode.h                                |  19 ++-
 | |
|  bfd/config.bfd                                |   8 +-
 | |
|  bfd/configure                                 |   1 +
 | |
|  bfd/configure.ac                              |   1 +
 | |
|  bfd/libpei.h                                  |  36 +++++
 | |
|  bfd/peXXigen.c                                |  44 +++---
 | |
|  bfd/pei-riscv64.c                             |  74 ++++++++++
 | |
|  bfd/peicode.h                                 |  20 ++-
 | |
|  bfd/targets.c                                 |   2 +
 | |
|  .../binutils-all/riscv/pei-riscv64.d          |  16 +++
 | |
|  .../binutils-all/riscv/pei-riscv64.s          |  31 +++++
 | |
|  include/coff/pe.h                             |   2 +
 | |
|  include/coff/riscv64.h                        |  64 +++++++++
 | |
|  18 files changed, 442 insertions(+), 30 deletions(-)
 | |
|  create mode 100644 bfd/coff-riscv64.c
 | |
|  create mode 100644 bfd/pei-riscv64.c
 | |
|  create mode 100644 binutils/testsuite/binutils-all/riscv/pei-riscv64.d
 | |
|  create mode 100644 binutils/testsuite/binutils-all/riscv/pei-riscv64.s
 | |
|  create mode 100644 include/coff/riscv64.h
 | |
| 
 | |
| diff --git a/bfd/.gitignore b/bfd/.gitignore
 | |
| index 9eb73b14..ba2aea70 100644
 | |
| --- a/bfd/.gitignore
 | |
| +++ b/bfd/.gitignore
 | |
| @@ -12,6 +12,7 @@
 | |
|  /pex64igen.c
 | |
|  /pe-aarch64igen.c
 | |
|  /pe-loongarch64igen.c
 | |
| +/pe-riscv64igen.c
 | |
|  /stmp-bfd-h
 | |
|  /targmatch.h
 | |
|  
 | |
| diff --git a/bfd/Makefile.am b/bfd/Makefile.am
 | |
| index 61504385..564f39ab 100644
 | |
| --- a/bfd/Makefile.am
 | |
| +++ b/bfd/Makefile.am
 | |
| @@ -580,11 +580,13 @@ BFD64_BACKENDS = \
 | |
|  	mmo.lo \
 | |
|  	pe-aarch64igen.lo \
 | |
|  	pe-loongarch64igen.lo \
 | |
| +	pe-riscv64igen.lo \
 | |
|  	pe-x86_64.lo \
 | |
|  	pei-aarch64.lo \
 | |
|  	pe-aarch64.lo \
 | |
|  	pei-ia64.lo \
 | |
|  	pei-loongarch64.lo \
 | |
| +	pei-riscv64.lo \
 | |
|  	pei-x86_64.lo \
 | |
|  	pepigen.lo \
 | |
|  	pex64igen.lo \
 | |
| @@ -629,6 +631,7 @@ BFD64_BACKENDS_CFILES = \
 | |
|  	pei-aarch64.c \
 | |
|  	pei-ia64.c \
 | |
|  	pei-loongarch64.c \
 | |
| +	pei-riscv64.c \
 | |
|  	pei-x86_64.c \
 | |
|  	vms-alpha.c
 | |
|  
 | |
| @@ -684,7 +687,8 @@ BUILD_CFILES = \
 | |
|  	elf32-ia64.c elf64-ia64.c \
 | |
|  	elf32-loongarch.c elf64-loongarch.c \
 | |
|  	elf32-riscv.c elf64-riscv.c \
 | |
| -	peigen.c pepigen.c pex64igen.c pe-aarch64igen.c pe-loongarch64igen.c
 | |
| +	peigen.c pepigen.c pex64igen.c pe-aarch64igen.c pe-loongarch64igen.c \
 | |
| +	pe-riscv64igen.c
 | |
|  
 | |
|  CFILES = $(SOURCE_CFILES) $(BUILD_CFILES)
 | |
|  
 | |
| @@ -886,6 +890,10 @@ pe-loongarch64igen.c: peXXigen.c
 | |
|  	$(AM_V_at)echo "#line 1 \"peXXigen.c\"" > $@
 | |
|  	$(AM_V_GEN)$(SED) -e s/XX/peLoongArch64/g < $< >> $@
 | |
|  
 | |
| +pe-riscv64igen.c: peXXigen.c
 | |
| +	$(AM_V_at)echo "#line 1 \"peXXigen.c\"" > $@
 | |
| +	$(AM_V_GEN)$(SED) -e s/XX/peRiscV64/g < $< >> $@
 | |
| +
 | |
|  host-aout.lo: Makefile
 | |
|  
 | |
|  # The following program can be used to generate a simple config file
 | |
| diff --git a/bfd/Makefile.in b/bfd/Makefile.in
 | |
| index 43c01c53..34ab7f0b 100644
 | |
| --- a/bfd/Makefile.in
 | |
| +++ b/bfd/Makefile.in
 | |
| @@ -1037,11 +1037,13 @@ BFD64_BACKENDS = \
 | |
|  	mmo.lo \
 | |
|  	pe-aarch64igen.lo \
 | |
|  	pe-loongarch64igen.lo \
 | |
| +	pe-riscv64igen.lo \
 | |
|  	pe-x86_64.lo \
 | |
|  	pei-aarch64.lo \
 | |
|  	pe-aarch64.lo \
 | |
|  	pei-ia64.lo \
 | |
|  	pei-loongarch64.lo \
 | |
| +	pei-riscv64.lo \
 | |
|  	pei-x86_64.lo \
 | |
|  	pepigen.lo \
 | |
|  	pex64igen.lo \
 | |
| @@ -1086,6 +1088,7 @@ BFD64_BACKENDS_CFILES = \
 | |
|  	pei-aarch64.c \
 | |
|  	pei-ia64.c \
 | |
|  	pei-loongarch64.c \
 | |
| +	pei-riscv64.c \
 | |
|  	pei-x86_64.c \
 | |
|  	vms-alpha.c
 | |
|  
 | |
| @@ -1140,7 +1143,8 @@ BUILD_CFILES = \
 | |
|  	elf32-ia64.c elf64-ia64.c \
 | |
|  	elf32-loongarch.c elf64-loongarch.c \
 | |
|  	elf32-riscv.c elf64-riscv.c \
 | |
| -	peigen.c pepigen.c pex64igen.c pe-aarch64igen.c pe-loongarch64igen.c
 | |
| +	peigen.c pepigen.c pex64igen.c pe-aarch64igen.c pe-loongarch64igen.c \
 | |
| +	pe-riscv64igen.c
 | |
|  
 | |
|  CFILES = $(SOURCE_CFILES) $(BUILD_CFILES)
 | |
|  SOURCE_HFILES = \
 | |
| @@ -1683,6 +1687,7 @@ distclean-compile:
 | |
|  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-i386.Plo@am__quote@
 | |
|  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-loongarch64igen.Plo@am__quote@
 | |
|  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-mcore.Plo@am__quote@
 | |
| +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-riscv64igen.Plo@am__quote@
 | |
|  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-sh.Plo@am__quote@
 | |
|  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-x86_64.Plo@am__quote@
 | |
|  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pef.Plo@am__quote@
 | |
| @@ -1693,6 +1698,7 @@ distclean-compile:
 | |
|  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-ia64.Plo@am__quote@
 | |
|  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-loongarch64.Plo@am__quote@
 | |
|  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-mcore.Plo@am__quote@
 | |
| +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-riscv64.Plo@am__quote@
 | |
|  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-sh.Plo@am__quote@
 | |
|  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-x86_64.Plo@am__quote@
 | |
|  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/peigen.Plo@am__quote@
 | |
| @@ -2384,6 +2390,10 @@ pe-loongarch64igen.c: peXXigen.c
 | |
|  	$(AM_V_at)echo "#line 1 \"peXXigen.c\"" > $@
 | |
|  	$(AM_V_GEN)$(SED) -e s/XX/peLoongArch64/g < $< >> $@
 | |
|  
 | |
| +pe-riscv64igen.c: peXXigen.c
 | |
| +	$(AM_V_at)echo "#line 1 \"peXXigen.c\"" > $@
 | |
| +	$(AM_V_GEN)$(SED) -e s/XX/peRiscV64/g < $< >> $@
 | |
| +
 | |
|  host-aout.lo: Makefile
 | |
|  
 | |
|  # The following program can be used to generate a simple config file
 | |
| diff --git a/bfd/bfd.c b/bfd/bfd.c
 | |
| index e43a388a..c6901e99 100644
 | |
| --- a/bfd/bfd.c
 | |
| +++ b/bfd/bfd.c
 | |
| @@ -1948,6 +1948,7 @@ bfd_get_sign_extend_vma (bfd *abfd)
 | |
|        || strcmp (name, "pe-arm-wince-little") == 0
 | |
|        || strcmp (name, "pei-arm-wince-little") == 0
 | |
|        || strcmp (name, "pei-loongarch64") == 0
 | |
| +      || strcmp (name, "pei-riscv64-little") == 0
 | |
|        || strcmp (name, "aixcoff-rs6000") == 0
 | |
|        || strcmp (name, "aix5coff64-rs6000") == 0)
 | |
|      return 1;
 | |
| diff --git a/bfd/coff-riscv64.c b/bfd/coff-riscv64.c
 | |
| new file mode 100644
 | |
| index 00000000..0502be43
 | |
| --- /dev/null
 | |
| +++ b/bfd/coff-riscv64.c
 | |
| @@ -0,0 +1,130 @@
 | |
| +/* BFD back-end for RISC-V 64-bit COFF files.
 | |
| +   Copyright (C) 2023 Free Software Foundation, Inc.
 | |
| +
 | |
| +   This file is part of BFD, the Binary File Descriptor library.
 | |
| +
 | |
| +   This program is free software; you can redistribute it and/or modify
 | |
| +   it under the terms of the GNU General Public License as published by
 | |
| +   the Free Software Foundation; either version 3 of the License, or
 | |
| +   (at your option) any later version.
 | |
| +
 | |
| +   This program is distributed in the hope that it will be useful,
 | |
| +   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| +   GNU General Public License for more details.
 | |
| +
 | |
| +   You should have received a copy of the GNU General Public License
 | |
| +   along with this program; if not, write to the Free Software
 | |
| +   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
 | |
| +   MA 02110-1301, USA.  */
 | |
| +
 | |
| +#include "sysdep.h"
 | |
| +#include "bfd.h"
 | |
| +#include "libbfd.h"
 | |
| +#include "coff/riscv64.h"
 | |
| +#include "coff/internal.h"
 | |
| +#include "coff/pe.h"
 | |
| +#include "libcoff.h"
 | |
| +#include "libiberty.h"
 | |
| +
 | |
| +#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER  2
 | |
| +
 | |
| +#ifndef bfd_pe_print_pdata
 | |
| +#define bfd_pe_print_pdata      NULL
 | |
| +#endif
 | |
| +
 | |
| +#define RTYPE2HOWTO(cache_ptr, dst)             \
 | |
| +  (cache_ptr)->howto = NULL
 | |
| +
 | |
| +/* Return TRUE if this relocation should
 | |
| +   appear in the output .reloc section.  */
 | |
| +
 | |
| +static bool
 | |
| +in_reloc_p (bfd *abfd ATTRIBUTE_UNUSED,
 | |
| +	    reloc_howto_type *howto)
 | |
| +{
 | |
| +  return !howto->pc_relative;
 | |
| +}
 | |
| +
 | |
| +#include "coffcode.h"
 | |
| +
 | |
| +/* Target vectors.  */
 | |
| +const bfd_target
 | |
| +#ifdef TARGET_SYM
 | |
| +  TARGET_SYM =
 | |
| +#else
 | |
| +  riscv64_coff_vec =
 | |
| +#endif
 | |
| +{
 | |
| +#ifdef TARGET_NAME
 | |
| +  TARGET_NAME,
 | |
| +#else
 | |
| + "coff-riscv64-little",		/* Name.  */
 | |
| +#endif
 | |
| +  bfd_target_coff_flavour,
 | |
| +  BFD_ENDIAN_LITTLE,		/* Data byte order is little.  */
 | |
| +  BFD_ENDIAN_LITTLE,		/* Header byte order is little.  */
 | |
| +
 | |
| +  (HAS_RELOC | EXEC_P		/* Object flags.  */
 | |
| +   | HAS_LINENO | HAS_DEBUG
 | |
| +   | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS),
 | |
| +
 | |
| +  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* Section flags.  */
 | |
| +#if defined(COFF_WITH_PE)
 | |
| +   | SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_READONLY | SEC_DEBUGGING
 | |
| +#endif
 | |
| +   | SEC_CODE | SEC_DATA | SEC_EXCLUDE ),
 | |
| +
 | |
| +#ifdef TARGET_UNDERSCORE
 | |
| +  TARGET_UNDERSCORE,		/* Leading underscore.  */
 | |
| +#else
 | |
| +  0,				/* Leading underscore.  */
 | |
| +#endif
 | |
| +  '/',				/* Ar_pad_char.  */
 | |
| +  15,				/* Ar_max_namelen.  */
 | |
| +  0,				/* match priority.  */
 | |
| +  TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
 | |
| +
 | |
| +     /* Data conversion functions.  */
 | |
| +     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
 | |
| +     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
 | |
| +     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data.  */
 | |
| +     /* Header conversion functions.  */
 | |
| +     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
 | |
| +     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
 | |
| +     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Hdrs.  */
 | |
| +
 | |
| +  /* Note that we allow an object file to be treated as a core file as well.  */
 | |
| +  {				/* bfd_check_format.  */
 | |
| +    _bfd_dummy_target,
 | |
| +    coff_object_p,
 | |
| +    bfd_generic_archive_p,
 | |
| +    coff_object_p
 | |
| +  },
 | |
| +  {				/* bfd_set_format.  */
 | |
| +    _bfd_bool_bfd_false_error,
 | |
| +    coff_mkobject,
 | |
| +    _bfd_generic_mkarchive,
 | |
| +    _bfd_bool_bfd_false_error
 | |
| +  },
 | |
| +  {				/* bfd_write_contents.  */
 | |
| +    _bfd_bool_bfd_false_error,
 | |
| +    coff_write_object_contents,
 | |
| +    _bfd_write_archive_contents,
 | |
| +    _bfd_bool_bfd_false_error
 | |
| +  },
 | |
| +
 | |
| +  BFD_JUMP_TABLE_GENERIC (coff),
 | |
| +  BFD_JUMP_TABLE_COPY (coff),
 | |
| +  BFD_JUMP_TABLE_CORE (_bfd_nocore),
 | |
| +  BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
 | |
| +  BFD_JUMP_TABLE_SYMBOLS (coff),
 | |
| +  BFD_JUMP_TABLE_RELOCS (coff),
 | |
| +  BFD_JUMP_TABLE_WRITE (coff),
 | |
| +  BFD_JUMP_TABLE_LINK (coff),
 | |
| +  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
 | |
| +
 | |
| +  NULL,
 | |
| +
 | |
| +  COFF_SWAP_TABLE
 | |
| +};
 | |
| diff --git a/bfd/coffcode.h b/bfd/coffcode.h
 | |
| index 62720255..ef33dc4f 100644
 | |
| --- a/bfd/coffcode.h
 | |
| +++ b/bfd/coffcode.h
 | |
| @@ -2182,6 +2182,12 @@ coff_set_arch_mach_hook (bfd *abfd, void * filehdr)
 | |
|        machine = internal_f->f_flags & F_LOONGARCH64_ARCHITECTURE_MASK;
 | |
|        break;
 | |
|  #endif
 | |
| +#ifdef RISCV64MAGIC
 | |
| +    case RISCV64MAGIC:
 | |
| +      arch = bfd_arch_riscv;
 | |
| +      machine = bfd_mach_riscv64;
 | |
| +      break;
 | |
| +#endif
 | |
|  #ifdef Z80MAGIC
 | |
|      case Z80MAGIC:
 | |
|        arch = bfd_arch_z80;
 | |
| @@ -2753,6 +2759,12 @@ coff_set_flags (bfd * abfd,
 | |
|        return true;
 | |
|  #endif
 | |
|  
 | |
| +#ifdef RISCV64MAGIC
 | |
| +    case bfd_arch_riscv:
 | |
| +      * magicp = RISCV64MAGIC;
 | |
| +      return true;
 | |
| +#endif
 | |
| +
 | |
|  #ifdef ARMMAGIC
 | |
|      case bfd_arch_arm:
 | |
|  #ifdef ARM_WINCE
 | |
| @@ -3936,7 +3948,7 @@ coff_write_object_contents (bfd * abfd)
 | |
|      internal_f.f_flags |= IMAGE_FILE_LARGE_ADDRESS_AWARE;
 | |
|  #endif
 | |
|  
 | |
| -#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
 | |
| +#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined (COFF_WITH_peRiscV64)
 | |
|  #ifdef COFF_WITH_PE
 | |
|    internal_f.f_flags |= IMAGE_FILE_32BIT_MACHINE;
 | |
|  #else
 | |
| @@ -3995,6 +4007,11 @@ coff_write_object_contents (bfd * abfd)
 | |
|      internal_a.magic = ZMAGIC;
 | |
|  #endif
 | |
|  
 | |
| +#if defined(RISCV64)
 | |
| +#define __A_MAGIC_SET__
 | |
| +    internal_a.magic = ZMAGIC;
 | |
| +#endif
 | |
| +
 | |
|  #if defined MCORE_PE
 | |
|  #define __A_MAGIC_SET__
 | |
|      internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
 | |
| diff --git a/bfd/config.bfd b/bfd/config.bfd
 | |
| index bee13635..ab2d2473 100644
 | |
| --- a/bfd/config.bfd
 | |
| +++ b/bfd/config.bfd
 | |
| @@ -1216,22 +1216,22 @@ case "${targ}" in
 | |
|  #ifdef BFD64
 | |
|    riscvbe-*-* | riscv32be*-*-*)
 | |
|      targ_defvec=riscv_elf32_be_vec
 | |
| -    targ_selvecs="riscv_elf32_vec riscv_elf64_vec riscv_elf32_be_vec riscv_elf64_be_vec"
 | |
| +    targ_selvecs="riscv_elf32_vec riscv_elf64_vec riscv_elf32_be_vec riscv_elf64_be_vec riscv64_pei_vec"
 | |
|      want64=true
 | |
|      ;;
 | |
|    riscv-*-* | riscv32*-*-*)
 | |
|      targ_defvec=riscv_elf32_vec
 | |
| -    targ_selvecs="riscv_elf32_vec riscv_elf64_vec riscv_elf32_be_vec riscv_elf64_be_vec"
 | |
| +    targ_selvecs="riscv_elf32_vec riscv_elf64_vec riscv_elf32_be_vec riscv_elf64_be_vec riscv64_pei_vec"
 | |
|      want64=true
 | |
|      ;;
 | |
|    riscv64be*-*-*)
 | |
|      targ_defvec=riscv_elf64_be_vec
 | |
| -    targ_selvecs="riscv_elf32_vec riscv_elf64_vec riscv_elf32_be_vec riscv_elf64_be_vec"
 | |
| +    targ_selvecs="riscv_elf32_vec riscv_elf64_vec riscv_elf32_be_vec riscv_elf64_be_vec riscv64_pei_vec"
 | |
|      want64=true
 | |
|      ;;
 | |
|    riscv64*-*-*)
 | |
|      targ_defvec=riscv_elf64_vec
 | |
| -    targ_selvecs="riscv_elf32_vec riscv_elf64_vec riscv_elf32_be_vec riscv_elf64_be_vec"
 | |
| +    targ_selvecs="riscv_elf32_vec riscv_elf64_vec riscv_elf32_be_vec riscv_elf64_be_vec riscv64_pei_vec"
 | |
|      want64=true
 | |
|      ;;
 | |
|  #endif
 | |
| diff --git a/bfd/configure b/bfd/configure
 | |
| index 16db714f..8bc03b9e 100755
 | |
| --- a/bfd/configure
 | |
| +++ b/bfd/configure
 | |
| @@ -14043,6 +14043,7 @@ do
 | |
|      riscv_elf64_vec)		 tb="$tb elf64-riscv.lo elf64.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo $elf"; target_size=64 ;;
 | |
|      riscv_elf32_be_vec)		 tb="$tb elf32-riscv.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo $elf" ;;
 | |
|      riscv_elf64_be_vec)		 tb="$tb elf64-riscv.lo elf64.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo $elf"; target_size=64 ;;
 | |
| +    riscv64_pei_vec)		 tb="$tb pei-riscv64.lo pe-riscv64igen.lo $coff"; target_size=64 ;;
 | |
|      rl78_elf32_vec)		 tb="$tb elf32-rl78.lo elf32.lo $elf" ;;
 | |
|      rs6000_xcoff64_vec)		 tb="$tb coff64-rs6000.lo aix5ppc-core.lo $xcoff"; target_size=64 ;;
 | |
|      rs6000_xcoff64_aix_vec)	 tb="$tb coff64-rs6000.lo aix5ppc-core.lo $xcoff"; target_size=64 ;;
 | |
| diff --git a/bfd/configure.ac b/bfd/configure.ac
 | |
| index b7aa897c..aac25a65 100644
 | |
| --- a/bfd/configure.ac
 | |
| +++ b/bfd/configure.ac
 | |
| @@ -586,6 +586,7 @@ do
 | |
|      riscv_elf64_vec)		 tb="$tb elf64-riscv.lo elf64.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo $elf"; target_size=64 ;;
 | |
|      riscv_elf32_be_vec)		 tb="$tb elf32-riscv.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo $elf" ;;
 | |
|      riscv_elf64_be_vec)		 tb="$tb elf64-riscv.lo elf64.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo $elf"; target_size=64 ;;
 | |
| +    riscv64_pei_vec)		 tb="$tb pei-riscv64.lo pe-riscv64igen.lo $coff"; target_size=64 ;;
 | |
|      rl78_elf32_vec)		 tb="$tb elf32-rl78.lo elf32.lo $elf" ;;
 | |
|      rs6000_xcoff64_vec)		 tb="$tb coff64-rs6000.lo aix5ppc-core.lo $xcoff"; target_size=64 ;;
 | |
|      rs6000_xcoff64_aix_vec)	 tb="$tb coff64-rs6000.lo aix5ppc-core.lo $xcoff"; target_size=64 ;;
 | |
| diff --git a/bfd/libpei.h b/bfd/libpei.h
 | |
| index eafb9cf9..574f5e91 100644
 | |
| --- a/bfd/libpei.h
 | |
| +++ b/bfd/libpei.h
 | |
| @@ -345,6 +345,41 @@
 | |
|  #define _bfd_XXi_write_codeview_record			_bfd_peLoongArch64i_write_codeview_record
 | |
|  #define _bfd_XXi_slurp_codeview_record			_bfd_peLoongArch64i_slurp_codeview_record
 | |
|  
 | |
| +#elif defined COFF_WITH_peRiscV64
 | |
| +
 | |
| +#define GET_OPTHDR_IMAGE_BASE           H_GET_64
 | |
| +#define PUT_OPTHDR_IMAGE_BASE           H_PUT_64
 | |
| +#define GET_OPTHDR_SIZE_OF_STACK_RESERVE H_GET_64
 | |
| +#define PUT_OPTHDR_SIZE_OF_STACK_RESERVE H_PUT_64
 | |
| +#define GET_OPTHDR_SIZE_OF_STACK_COMMIT         H_GET_64
 | |
| +#define PUT_OPTHDR_SIZE_OF_STACK_COMMIT         H_PUT_64
 | |
| +#define GET_OPTHDR_SIZE_OF_HEAP_RESERVE         H_GET_64
 | |
| +#define PUT_OPTHDR_SIZE_OF_HEAP_RESERVE         H_PUT_64
 | |
| +#define GET_OPTHDR_SIZE_OF_HEAP_COMMIT  H_GET_64
 | |
| +#define PUT_OPTHDR_SIZE_OF_HEAP_COMMIT  H_PUT_64
 | |
| +#define GET_PDATA_ENTRY                         bfd_get_32
 | |
| +
 | |
| +#define _bfd_XX_bfd_copy_private_bfd_data_common       _bfd_peRiscV64_bfd_copy_private_bfd_data_common
 | |
| +#define _bfd_XX_bfd_copy_private_section_data          _bfd_peRiscV64_bfd_copy_private_section_data
 | |
| +#define _bfd_XX_get_symbol_info                                _bfd_peRiscV64_get_symbol_info
 | |
| +#define _bfd_XX_only_swap_filehdr_out                  _bfd_peRiscV64_only_swap_filehdr_out
 | |
| +#define _bfd_XX_print_private_bfd_data_common          _bfd_peRiscV64_print_private_bfd_data_common
 | |
| +#define _bfd_XXi_final_link_postscript                 _bfd_peRiscV64i_final_link_postscript
 | |
| +#define _bfd_XXi_only_swap_filehdr_out                 _bfd_peRiscV64i_only_swap_filehdr_out
 | |
| +#define _bfd_XXi_swap_aouthdr_in                       _bfd_peRiscV64i_swap_aouthdr_in
 | |
| +#define _bfd_XXi_swap_aouthdr_out                      _bfd_peRiscV64i_swap_aouthdr_out
 | |
| +#define _bfd_XXi_swap_aux_in                           _bfd_peRiscV64i_swap_aux_in
 | |
| +#define _bfd_XXi_swap_aux_out                          _bfd_peRiscV64i_swap_aux_out
 | |
| +#define _bfd_XXi_swap_lineno_in                                _bfd_peRiscV64i_swap_lineno_in
 | |
| +#define _bfd_XXi_swap_lineno_out                       _bfd_peRiscV64i_swap_lineno_out
 | |
| +#define _bfd_XXi_swap_scnhdr_out                       _bfd_peRiscV64i_swap_scnhdr_out
 | |
| +#define _bfd_XXi_swap_sym_in                           _bfd_peRiscV64i_swap_sym_in
 | |
| +#define _bfd_XXi_swap_sym_out                          _bfd_peRiscV64i_swap_sym_out
 | |
| +#define _bfd_XXi_swap_debugdir_in                      _bfd_peRiscV64i_swap_debugdir_in
 | |
| +#define _bfd_XXi_swap_debugdir_out                     _bfd_peRiscV64i_swap_debugdir_out
 | |
| +#define _bfd_XXi_write_codeview_record                 _bfd_peRiscV64i_write_codeview_record
 | |
| +#define _bfd_XXi_slurp_codeview_record                 _bfd_peRiscV64i_slurp_codeview_record
 | |
| +
 | |
|  #else /* !COFF_WITH_pep */
 | |
|  
 | |
|  #define GET_OPTHDR_IMAGE_BASE H_GET_32
 | |
| @@ -443,5 +478,6 @@ bool _bfd_pe64_print_ce_compressed_pdata (bfd *, void *);
 | |
|  bool _bfd_pex64_print_ce_compressed_pdata (bfd *, void *);
 | |
|  bool _bfd_peAArch64_print_ce_compressed_pdata (bfd *, void *);
 | |
|  bool _bfd_peLoongArch64_print_ce_compressed_pdata (bfd *, void *);
 | |
| +bool _bfd_peRiscV64_print_ce_compressed_pdata (bfd *, void *);
 | |
|  bool _bfd_pep_print_ce_compressed_pdata (bfd *, void *);
 | |
|  
 | |
| diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
 | |
| index da53f349..ead808a1 100644
 | |
| --- a/bfd/peXXigen.c
 | |
| +++ b/bfd/peXXigen.c
 | |
| @@ -61,8 +61,8 @@
 | |
|     wasting too much time.  */
 | |
|  
 | |
|  /* This expands into COFF_WITH_pe, COFF_WITH_pep, COFF_WITH_pex64,
 | |
| -   COFF_WITH_peAArch64 or COFF_WITH_peLoongArch64 depending on whether we're
 | |
| -   compiling for straight PE or PE+.  */
 | |
| +   COFF_WITH_peAArch64 or COFF_WITH_peLoongArch64 or COFF_WITH_peRiscV64
 | |
| +   depending on whether we're compiling for straight PE or PE+.  */
 | |
|  #define COFF_WITH_XX
 | |
|  
 | |
|  #include "sysdep.h"
 | |
| @@ -88,6 +88,8 @@
 | |
|  # include "coff/aarch64.h"
 | |
|  #elif defined COFF_WITH_peLoongArch64
 | |
|  # include "coff/loongarch64.h"
 | |
| +#elif defined COFF_WITH_peRiscV64
 | |
| +# include "coff/riscv64.h"
 | |
|  #else
 | |
|  # include "coff/i386.h"
 | |
|  #endif
 | |
| @@ -97,7 +99,7 @@
 | |
|  #include "libpei.h"
 | |
|  #include "safe-ctype.h"
 | |
|  
 | |
| -#if defined COFF_WITH_pep || defined COFF_WITH_pex64 || defined COFF_WITH_peAArch64 || defined COFF_WITH_peLoongArch64
 | |
| +#if defined COFF_WITH_pep || defined COFF_WITH_pex64 || defined COFF_WITH_peAArch64 || defined COFF_WITH_peLoongArch64 || defined COFF_WITH_peRiscV64
 | |
|  # undef AOUTSZ
 | |
|  # define AOUTSZ		PEPAOUTSZ
 | |
|  # define PEAOUTHDR	PEPAOUTHDR
 | |
| @@ -464,7 +466,7 @@ _bfd_XXi_swap_aouthdr_in (bfd * abfd,
 | |
|    aouthdr_int->text_start =
 | |
|      GET_AOUTHDR_TEXT_START (abfd, aouthdr_ext->text_start);
 | |
|  
 | |
| -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
 | |
| +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined (COFF_WITH_peRiscV64)
 | |
|    /* PE32+ does not have data_start member!  */
 | |
|    aouthdr_int->data_start =
 | |
|      GET_AOUTHDR_DATA_START (abfd, aouthdr_ext->data_start);
 | |
| @@ -531,7 +533,7 @@ _bfd_XXi_swap_aouthdr_in (bfd * abfd,
 | |
|    if (aouthdr_int->entry)
 | |
|      {
 | |
|        aouthdr_int->entry += a->ImageBase;
 | |
| -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
 | |
| +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined (COFF_WITH_peRiscV64)
 | |
|        aouthdr_int->entry &= 0xffffffff;
 | |
|  #endif
 | |
|      }
 | |
| @@ -539,12 +541,12 @@ _bfd_XXi_swap_aouthdr_in (bfd * abfd,
 | |
|    if (aouthdr_int->tsize)
 | |
|      {
 | |
|        aouthdr_int->text_start += a->ImageBase;
 | |
| -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
 | |
| +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined (COFF_WITH_peRiscV64)
 | |
|        aouthdr_int->text_start &= 0xffffffff;
 | |
|  #endif
 | |
|      }
 | |
|  
 | |
| -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
 | |
| +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined (COFF_WITH_peRiscV64)
 | |
|    /* PE32+ does not have data_start member!  */
 | |
|    if (aouthdr_int->dsize)
 | |
|      {
 | |
| @@ -604,7 +606,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
 | |
|    if (aouthdr_in->tsize)
 | |
|      {
 | |
|        aouthdr_in->text_start -= ib;
 | |
| -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
 | |
| +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined (COFF_WITH_peRiscV64)
 | |
|        aouthdr_in->text_start &= 0xffffffff;
 | |
|  #endif
 | |
|      }
 | |
| @@ -612,7 +614,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
 | |
|    if (aouthdr_in->dsize)
 | |
|      {
 | |
|        aouthdr_in->data_start -= ib;
 | |
| -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
 | |
| +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined (COFF_WITH_peRiscV64)
 | |
|        aouthdr_in->data_start &= 0xffffffff;
 | |
|  #endif
 | |
|      }
 | |
| @@ -620,7 +622,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
 | |
|    if (aouthdr_in->entry)
 | |
|      {
 | |
|        aouthdr_in->entry -= ib;
 | |
| -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
 | |
| +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined (COFF_WITH_peRiscV64)
 | |
|        aouthdr_in->entry &= 0xffffffff;
 | |
|  #endif
 | |
|      }
 | |
| @@ -734,7 +736,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
 | |
|    PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
 | |
|  			  aouthdr_out->standard.text_start);
 | |
|  
 | |
| -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
 | |
| +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined (COFF_WITH_peRiscV64)
 | |
|    /* PE32+ does not have data_start member!  */
 | |
|    PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
 | |
|  			  aouthdr_out->standard.data_start);
 | |
| @@ -920,7 +922,7 @@ _bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out)
 | |
|      _bfd_error_handler (_("%pB:%.8s: section below image base"),
 | |
|                          abfd, scnhdr_int->s_name);
 | |
|    /* Do not compare lower 32-bits for 64-bit vma.  */
 | |
| -#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
 | |
| +#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined (COFF_WITH_peRiscV64)
 | |
|    else if(ss != (ss & 0xffffffff))
 | |
|      _bfd_error_handler (_("%pB:%.8s: RVA truncated"), abfd, scnhdr_int->s_name);
 | |
|    PUT_SCNHDR_VADDR (abfd, ss & 0xffffffff, scnhdr_ext->s_vaddr);
 | |
| @@ -1821,7 +1823,7 @@ pe_print_edata (bfd * abfd, void * vfile)
 | |
|  static bool
 | |
|  pe_print_pdata (bfd * abfd, void * vfile)
 | |
|  {
 | |
| -#if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
 | |
| +#if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined (COFF_WITH_peRiscV64)
 | |
|  # define PDATA_ROW_SIZE	(3 * 8)
 | |
|  #else
 | |
|  # define PDATA_ROW_SIZE	(5 * 4)
 | |
| @@ -1849,7 +1851,7 @@ pe_print_pdata (bfd * abfd, void * vfile)
 | |
|  
 | |
|    fprintf (file,
 | |
|  	   _("\nThe Function Table (interpreted .pdata section contents)\n"));
 | |
| -#if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
 | |
| +#if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined (COFF_WITH_peRiscV64)
 | |
|    fprintf (file,
 | |
|  	   _(" vma:\t\t\tBegin Address    End Address      Unwind Info\n"));
 | |
|  #else
 | |
| @@ -1886,7 +1888,7 @@ pe_print_pdata (bfd * abfd, void * vfile)
 | |
|        bfd_vma eh_handler;
 | |
|        bfd_vma eh_data;
 | |
|        bfd_vma prolog_end_addr;
 | |
| -#if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64)
 | |
| +#if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64) || defined (COFF_WITH_peRiscV64)
 | |
|        int em_data;
 | |
|  #endif
 | |
|  
 | |
| @@ -1904,7 +1906,7 @@ pe_print_pdata (bfd * abfd, void * vfile)
 | |
|  	/* We are probably into the padding of the section now.  */
 | |
|  	break;
 | |
|  
 | |
| -#if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64)
 | |
| +#if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64) || defined (COFF_WITH_peRiscV64)
 | |
|        em_data = ((eh_handler & 0x1) << 2) | (prolog_end_addr & 0x3);
 | |
|  #endif
 | |
|        eh_handler &= ~(bfd_vma) 0x3;
 | |
| @@ -1915,7 +1917,7 @@ pe_print_pdata (bfd * abfd, void * vfile)
 | |
|        bfd_fprintf_vma (abfd, file, begin_addr); fputc (' ', file);
 | |
|        bfd_fprintf_vma (abfd, file, end_addr); fputc (' ', file);
 | |
|        bfd_fprintf_vma (abfd, file, eh_handler);
 | |
| -#if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64)
 | |
| +#if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64) || defined (COFF_WITH_peRiscV64)
 | |
|        fputc (' ', file);
 | |
|        bfd_fprintf_vma (abfd, file, eh_data); fputc (' ', file);
 | |
|        bfd_fprintf_vma (abfd, file, prolog_end_addr);
 | |
| @@ -2814,7 +2816,7 @@ _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile)
 | |
|    bfd_fprintf_vma (abfd, file, i->AddressOfEntryPoint);
 | |
|    fprintf (file, "\nBaseOfCode\t\t");
 | |
|    bfd_fprintf_vma (abfd, file, i->BaseOfCode);
 | |
| -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
 | |
| +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined (COFF_WITH_peRiscV64)
 | |
|    /* PE32+ does not have BaseOfData member!  */
 | |
|    fprintf (file, "\nBaseOfData\t\t");
 | |
|    bfd_fprintf_vma (abfd, file, i->BaseOfData);
 | |
| @@ -3130,7 +3132,7 @@ _bfd_XX_get_symbol_info (bfd * abfd, asymbol *symbol, symbol_info *ret)
 | |
|    coff_get_symbol_info (abfd, symbol, ret);
 | |
|  }
 | |
|  
 | |
| -#if !defined(COFF_WITH_pep) && (defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64))
 | |
| +#if !defined(COFF_WITH_pep) && (defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64) || defined (COFF_WITH_peRiscV64))
 | |
|  static int
 | |
|  sort_x64_pdata (const void *l, const void *r)
 | |
|  {
 | |
| @@ -4546,7 +4548,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
 | |
|  	the TLS data directory consists of 4 pointers, followed
 | |
|  	by two 4-byte integer. This implies that the total size
 | |
|  	is different for 32-bit and 64-bit executables.  */
 | |
| -#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
 | |
| +#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined (COFF_WITH_peRiscV64)
 | |
|        pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x18;
 | |
|  #else
 | |
|        pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x28;
 | |
| @@ -4555,7 +4557,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
 | |
|  
 | |
|  /* If there is a .pdata section and we have linked pdata finally, we
 | |
|       need to sort the entries ascending.  */
 | |
| -#if !defined(COFF_WITH_pep) && (defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64))
 | |
| +#if !defined(COFF_WITH_pep) && (defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64) || defined (COFF_WITH_peRiscV64))
 | |
|    {
 | |
|      asection *sec = bfd_get_section_by_name (abfd, ".pdata");
 | |
|  
 | |
| diff --git a/bfd/pei-riscv64.c b/bfd/pei-riscv64.c
 | |
| new file mode 100644
 | |
| index 00000000..1a80015b
 | |
| --- /dev/null
 | |
| +++ b/bfd/pei-riscv64.c
 | |
| @@ -0,0 +1,74 @@
 | |
| +/* BFD back-end for RISC-V 64-bit PE IMAGE COFF files.
 | |
| +   Copyright (C) 2023 Free Software Foundation, Inc.
 | |
| +
 | |
| +   This file is part of BFD, the Binary File Descriptor library.
 | |
| +
 | |
| +   This program is free software; you can redistribute it and/or modify
 | |
| +   it under the terms of the GNU General Public License as published by
 | |
| +   the Free Software Foundation; either version 3 of the License, or
 | |
| +   (at your option) any later version.
 | |
| +
 | |
| +   This program is distributed in the hope that it will be useful,
 | |
| +   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| +   GNU General Public License for more details.
 | |
| +
 | |
| +   You should have received a copy of the GNU General Public License
 | |
| +   along with this program; if not, write to the Free Software
 | |
| +   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
 | |
| +   MA 02110-1301, USA.  */
 | |
| +
 | |
| +#include "sysdep.h"
 | |
| +#include "bfd.h"
 | |
| +
 | |
| +#define TARGET_SYM		riscv64_pei_vec
 | |
| +#define TARGET_NAME		"pei-riscv64-little"
 | |
| +#define TARGET_ARCHITECTURE	bfd_arch_riscv
 | |
| +#define TARGET_PAGESIZE		0x4000
 | |
| +#define TARGET_BIG_ENDIAN	0
 | |
| +#define TARGET_ARCHIVE		0
 | |
| +#define TARGET_PRIORITY		0
 | |
| +
 | |
| +#define COFF_IMAGE_WITH_PE
 | |
| +/* Rename the above into...  */
 | |
| +#define COFF_WITH_peRiscV64
 | |
| +#define COFF_WITH_PE
 | |
| +#define PCRELOFFSET	   true
 | |
| +
 | |
| +/* Long section names not allowed in executable images, only object files.  */
 | |
| +#define COFF_LONG_SECTION_NAMES 0
 | |
| +
 | |
| +#define COFF_SECTION_ALIGNMENT_ENTRIES \
 | |
| +{ COFF_SECTION_NAME_EXACT_MATCH (".bss"), \
 | |
| +  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
 | |
| +{ COFF_SECTION_NAME_EXACT_MATCH (".data"), \
 | |
| +  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
 | |
| +{ COFF_SECTION_NAME_EXACT_MATCH (".rdata"), \
 | |
| +  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
 | |
| +{ COFF_SECTION_NAME_EXACT_MATCH (".text"), \
 | |
| +  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
 | |
| +{ COFF_SECTION_NAME_PARTIAL_MATCH (".idata"), \
 | |
| +  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
 | |
| +{ COFF_SECTION_NAME_EXACT_MATCH (".pdata"), \
 | |
| +  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
 | |
| +{ COFF_SECTION_NAME_PARTIAL_MATCH (".debug"), \
 | |
| +  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
 | |
| +{ COFF_SECTION_NAME_PARTIAL_MATCH (".gnu.linkonce.wi."), \
 | |
| +  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }
 | |
| +
 | |
| +#include "sysdep.h"
 | |
| +#include "bfd.h"
 | |
| +#include "libbfd.h"
 | |
| +#include "coff/riscv64.h"
 | |
| +#include "coff/internal.h"
 | |
| +#include "coff/pe.h"
 | |
| +#include "libcoff.h"
 | |
| +#include "libpei.h"
 | |
| +#include "libiberty.h"
 | |
| +
 | |
| +/* Make sure we're setting a 64-bit format.  */
 | |
| +#undef AOUTSZ
 | |
| +#define AOUTSZ          PEPAOUTSZ
 | |
| +#define PEAOUTHDR       PEPAOUTHDR
 | |
| +
 | |
| +#include "coff-riscv64.c"
 | |
| diff --git a/bfd/peicode.h b/bfd/peicode.h
 | |
| index e2e2be65..3a467b7e 100644
 | |
| --- a/bfd/peicode.h
 | |
| +++ b/bfd/peicode.h
 | |
| @@ -233,7 +233,7 @@ coff_swap_scnhdr_in (bfd * abfd, void * ext, void * in)
 | |
|      {
 | |
|        scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
 | |
|        /* Do not cut upper 32-bits for 64-bit vma.  */
 | |
| -#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
 | |
| +#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64) && !defined(COFF_WITH_peRiscV64)
 | |
|        scnhdr_int->s_vaddr &= 0xffffffff;
 | |
|  #endif
 | |
|      }
 | |
| @@ -777,6 +777,16 @@ static const jump_table jtab[] =
 | |
|      4, 0
 | |
|    },
 | |
|  
 | |
| +#endif
 | |
| +
 | |
| +#ifdef RISCV64MAGIC
 | |
| +  /* We don't currently support jumping to DLLs, so if
 | |
| +     someone does try emit a runtime trap.  Through EBREAK.  */
 | |
| +  { RISCV64MAGIC,
 | |
| +    { 0x73, 0x00, 0x10, 0x00 },
 | |
| +    4, 0
 | |
| +  },
 | |
| +
 | |
|  #endif
 | |
|  
 | |
|    { 0, { 0 }, 0, 0 }
 | |
| @@ -936,7 +946,7 @@ pe_ILF_build_a_bfd (bfd *	    abfd,
 | |
|  	/* See PR 20907 for a reproducer.  */
 | |
|  	goto error_return;
 | |
|  
 | |
| -#if defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64)
 | |
| +#if defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64) || defined (COFF_WITH_peRiscV64)
 | |
|        ((unsigned int *) id4->contents)[0] = ordinal;
 | |
|        ((unsigned int *) id4->contents)[1] = 0x80000000;
 | |
|        ((unsigned int *) id5->contents)[0] = ordinal;
 | |
| @@ -1255,6 +1265,12 @@ pe_ILF_object_p (bfd * abfd)
 | |
|  #endif
 | |
|        break;
 | |
|  
 | |
| +    case IMAGE_FILE_MACHINE_RISCV64:
 | |
| +#ifdef RISCV64MAGIC
 | |
| +      magic = RISCV64MAGIC;
 | |
| +#endif
 | |
| +      break;
 | |
| +
 | |
|      case IMAGE_FILE_MACHINE_THUMB:
 | |
|  #ifdef THUMBPEMAGIC
 | |
|        {
 | |
| diff --git a/bfd/targets.c b/bfd/targets.c
 | |
| index 3dbcd088..39cfb2b4 100644
 | |
| --- a/bfd/targets.c
 | |
| +++ b/bfd/targets.c
 | |
| @@ -861,6 +861,7 @@ extern const bfd_target riscv_elf32_vec;
 | |
|  extern const bfd_target riscv_elf64_vec;
 | |
|  extern const bfd_target riscv_elf32_be_vec;
 | |
|  extern const bfd_target riscv_elf64_be_vec;
 | |
| +extern const bfd_target riscv64_pei_vec;
 | |
|  extern const bfd_target rl78_elf32_vec;
 | |
|  extern const bfd_target rs6000_xcoff64_vec;
 | |
|  extern const bfd_target rs6000_xcoff64_aix_vec;
 | |
| @@ -1253,6 +1254,7 @@ static const bfd_target * const _bfd_target_vector[] =
 | |
|  	&riscv_elf64_vec,
 | |
|  	&riscv_elf32_be_vec,
 | |
|  	&riscv_elf64_be_vec,
 | |
| +	&riscv64_pei_vec,
 | |
|  #endif
 | |
|  	&rl78_elf32_vec,
 | |
|  
 | |
| diff --git a/binutils/testsuite/binutils-all/riscv/pei-riscv64.d b/binutils/testsuite/binutils-all/riscv/pei-riscv64.d
 | |
| new file mode 100644
 | |
| index 00000000..189b0162
 | |
| --- /dev/null
 | |
| +++ b/binutils/testsuite/binutils-all/riscv/pei-riscv64.d
 | |
| @@ -0,0 +1,16 @@
 | |
| +#as: -march=rv64gc -mabi=lp64d
 | |
| +#ld: -m elf64lriscv -e0
 | |
| +#PROG: objcopy
 | |
| +#objcopy: -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel -j .rela -j .rel.* -j .rela.* -j .rel* -j .rela* -j .reloc --target=pei-riscv64-little
 | |
| +#objdump: -h -f
 | |
| +#name: Check if efi app format is recognized
 | |
| +
 | |
| +.*:     file format pei-riscv64-little
 | |
| +architecture: riscv:rv64, flags 0x00000132:
 | |
| +EXEC_P, HAS_SYMS, HAS_LOCALS, D_PAGED
 | |
| +start address 0x0000000000000000
 | |
| +
 | |
| +Sections:
 | |
| +Idx Name          Size      VMA               LMA               File off  Algn
 | |
| +  0 \.text         00000010  0[^ ]+  0[^ ]+  0[^ ]+  2\*\*2
 | |
| +                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 | |
| diff --git a/binutils/testsuite/binutils-all/riscv/pei-riscv64.s b/binutils/testsuite/binutils-all/riscv/pei-riscv64.s
 | |
| new file mode 100644
 | |
| index 00000000..68c0e5bf
 | |
| --- /dev/null
 | |
| +++ b/binutils/testsuite/binutils-all/riscv/pei-riscv64.s
 | |
| @@ -0,0 +1,31 @@
 | |
| +	.file	"test_pei.c"
 | |
| +	.option nopic
 | |
| +	.attribute arch, "rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0_zicsr2p0_zifencei2p0"
 | |
| +	.attribute unaligned_access, 0
 | |
| +	.attribute stack_align, 16
 | |
| +	.text
 | |
| +	.align	1
 | |
| +	.globl	main
 | |
| +	.type	main, @function
 | |
| +main:
 | |
| +.LFB0:
 | |
| +	.cfi_startproc
 | |
| +	addi	sp,sp,-16
 | |
| +	.cfi_def_cfa_offset 16
 | |
| +	sd	s0,8(sp)
 | |
| +	.cfi_offset 8, -8
 | |
| +	addi	s0,sp,16
 | |
| +	.cfi_def_cfa 8, 0
 | |
| +	li	a5,0
 | |
| +	mv	a0,a5
 | |
| +	ld	s0,8(sp)
 | |
| +	.cfi_restore 8
 | |
| +	.cfi_def_cfa 2, 16
 | |
| +	addi	sp,sp,16
 | |
| +	.cfi_def_cfa_offset 0
 | |
| +	jr	ra
 | |
| +	.cfi_endproc
 | |
| +.LFE0:
 | |
| +	.size	main, .-main
 | |
| +	.ident	"GCC: (SUSE Linux) 13.1.1 20230720 [revision 9aac37ab8a7b919a89c6d64bc7107a8436996e93]"
 | |
| +	.section	.note.GNU-stack,"",@progbits
 | |
| diff --git a/include/coff/pe.h b/include/coff/pe.h
 | |
| index 6b26d533..dd4cf547 100644
 | |
| --- a/include/coff/pe.h
 | |
| +++ b/include/coff/pe.h
 | |
| @@ -156,6 +156,8 @@
 | |
|  #define IMAGE_FILE_MACHINE_R10000            0x0168
 | |
|  #define IMAGE_FILE_MACHINE_R3000             0x0162
 | |
|  #define IMAGE_FILE_MACHINE_R4000             0x0166
 | |
| +#define IMAGE_FILE_MACHINE_RISCV32           0x5032
 | |
| +#define IMAGE_FILE_MACHINE_RISCV64           0x5064
 | |
|  #define IMAGE_FILE_MACHINE_SH3               0x01a2
 | |
|  #define IMAGE_FILE_MACHINE_SH3DSP            0x01a3
 | |
|  #define IMAGE_FILE_MACHINE_SH3E              0x01a4
 | |
| diff --git a/include/coff/riscv64.h b/include/coff/riscv64.h
 | |
| new file mode 100644
 | |
| index 00000000..614d7434
 | |
| --- /dev/null
 | |
| +++ b/include/coff/riscv64.h
 | |
| @@ -0,0 +1,64 @@
 | |
| +/* RISC-V 64-bit COFF support for BFD.
 | |
| +   Copyright (C) 2023 Free Software Foundation, Inc.
 | |
| +
 | |
| +   This file is part of BFD, the Binary File Descriptor library.
 | |
| +
 | |
| +   This program is free software; you can redistribute it and/or modify
 | |
| +   it under the terms of the GNU General Public License as published by
 | |
| +   the Free Software Foundation; either version 3 of the License, or
 | |
| +   (at your option) any later version.
 | |
| +
 | |
| +   This program is distributed in the hope that it will be useful,
 | |
| +   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| +   GNU General Public License for more details.
 | |
| +
 | |
| +   You should have received a copy of the GNU General Public License
 | |
| +   along with this program; if not, write to the Free Software Foundation,
 | |
| +   Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
 | |
| +
 | |
| +#ifndef COFF_RISCV64_H
 | |
| +#define COFF_RISCV64_H
 | |
| +
 | |
| +#define COFFRISCV64 1
 | |
| +
 | |
| +#define L_LNNO_SIZE 2
 | |
| +#define INCLUDE_COMDAT_FIELDS_IN_AUXENT
 | |
| +#include "coff/external.h"
 | |
| +
 | |
| +#define	RISCV64MAGIC	0x5064  /* From Microsoft specification. */
 | |
| +
 | |
| +#undef  BADMAG
 | |
| +#define BADMAG(x) ((x).f_magic != RISCV64MAGIC)
 | |
| +#define RISCV64         1                 /* Customize coffcode.h.  */
 | |
| +
 | |
| +#define IMAGE_NT_OPTIONAL_HDR64_MAGIC      0x20b
 | |
| +
 | |
| +#define OMAGIC          0404    /* Object files, eg as output.  */
 | |
| +#define ZMAGIC          IMAGE_NT_OPTIONAL_HDR64_MAGIC    /* Demand load format, eg normal ld output 0x10b.  */
 | |
| +#define STMAGIC		0401	/* Target shlib.  */
 | |
| +#define SHMAGIC		0443	/* Host   shlib.  */
 | |
| +
 | |
| +/* define some NT default values */
 | |
| +/*  #define NT_IMAGE_BASE        0x400000 moved to internal.h */
 | |
| +#define NT_SECTION_ALIGNMENT 0x1000
 | |
| +#define NT_FILE_ALIGNMENT    0x200
 | |
| +#define NT_DEF_RESERVE       0x100000
 | |
| +#define NT_DEF_COMMIT        0x1000
 | |
| +
 | |
| +/* We use the .rdata section to hold read only data.  */
 | |
| +#define _LIT	".rdata"
 | |
| +
 | |
| +/********************** RELOCATION DIRECTIVES **********************/
 | |
| +struct external_reloc
 | |
| +{
 | |
| +  char r_vaddr[4];
 | |
| +  char r_symndx[4];
 | |
| +  char r_type[2];
 | |
| +  char r_offset[4];
 | |
| +};
 | |
| +
 | |
| +#define RELOC struct external_reloc
 | |
| +#define RELSZ 14
 | |
| +
 | |
| +#endif /* COFF_RISCV64_H */
 | |
| -- 
 | |
| 2.43.5
 | |
| 
 |