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.
2023-08-03 17:22:42 +02:00
|
|
|
/* BFD back-end for RISC-V 64-bit COFF files.
|
2024-01-04 22:22:08 +10:30
|
|
|
Copyright (C) 2023-2024 Free Software Foundation, Inc.
|
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.
2023-08-03 17:22:42 +02:00
|
|
|
|
|
|
|
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
|
|
|
|
};
|