diff --git a/0001-Add-basic-support-for-RISC-V-64-bit-EFI-objects.patch b/0001-Add-basic-support-for-RISC-V-64-bit-EFI-objects.patch new file mode 100644 index 0000000..b3c0ce7 --- /dev/null +++ b/0001-Add-basic-support-for-RISC-V-64-bit-EFI-objects.patch @@ -0,0 +1,1007 @@ +From 3d53d8d253ba7cfdd4715d39c61fcc1c504dbc95 Mon Sep 17 00:00:00 2001 +From: Andreas Schwab +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 + diff --git a/binutils.spec b/binutils.spec index 8200aab..5aa2369 100644 --- a/binutils.spec +++ b/binutils.spec @@ -89,7 +89,6 @@ URL: https://sourceware.org/binutils %else # RISC-V does not have ld.gold thus disable by default. %bcond_with gold -BuildRequires: bison %endif # Default: Not bootstrapping. @@ -100,6 +99,9 @@ BuildRequires: bison %bcond_without docs # Default: Always run the testsuite. %bcond_without testsuite +%ifarch riscv64 +%bcond_with testsuite +%endif # Default: support debuginfod. %bcond_without debuginfod # Default: build binutils-gprofng package. @@ -381,6 +383,8 @@ Patch99: binutils-suppress-ld-align-tests.patch #---------------------------------------------------------------------------- +Patch100: 0001-Add-basic-support-for-RISC-V-64-bit-EFI-objects.patch + Provides: bundled(libiberty) %if %{with debug} @@ -439,6 +443,10 @@ BuildRequires: zlib-devel BuildRequires: elfutils-debuginfod-client-devel %endif +%ifarch riscv64 +BuildRequires: bison +%endif + Requires(post): %{_sbindir}/alternatives Requires(preun): %{_sbindir}/alternatives # We also need rm. @@ -1012,6 +1020,9 @@ run_tests() %ifarch %{arm} %define enable_lto 0 %endif +%ifarch riscv64 +%define enable_lto 0 +%endif %if !0%{?enable_lto} %global _lto_cflags %{nil} @@ -1410,7 +1421,10 @@ exit 0 #---------------------------------------------------------------------------- %changelog * Sun Jan 19 2025 Andrew Lukoshko - 2.41-51.alma.1 -- Add bison to BuildRequires for RISC-V unconditionally +- Add bison to BuildRequires for RISC-V +- Disable LTO for RISC-V +- Disable testsuite for RISC-V +- Add basic support for RISC-V 64-bit EFI objects (backported from 2.44) * Mon Dec 02 2024 Nick Clifton - 2.41-51 - Fix AArch64 linker testsuite problems.