-
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bfd: Add support for LoongArch64 EFI (efi-*-loongarch64).
This adds support for efi-loongarch64 by virtue of adding a new PEI target pei-loongarch64. This is not a full target and only exists to support EFI at this time. This means that this target does not support relocation processing and is mostly a container format. This format has been added to elf based loongarch64 targets such that efi images can be made natively on Linux. However this target is not valid for use with gas but only with objcopy. We should't limit addresses to 32-bits for 64-bit vma, otherwise there will be "RVA truncated" error when using objcopy on loongarch64. With these changes the resulting file is recognized as an efi image. Any magic number is based on the Microsoft PE specification [1]. The test results are as follows: $ make check-binutils RUNTESTFLAGS='loongarch64.exp' PASS: Check if efi app format is recognized $ objdump -h -f tmpdir/loongarch64copy.o tmpdir/loongarch64copy.o: file format pei-loongarch64 architecture: Loongarch64, flags 0x00000132: EXEC_P, HAS_SYMS, HAS_LOCALS, D_PAGED start address 0x0000000000000000 Sections: Idx Name Size VMA LMA File off Algn 0 .text 0000003c 00000000200000b0 00000000200000b0 00000200 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE [1] https://docs.microsoft.com/en-us/windows/win32/debug/pe-format bfd: * .gitignore (pe-loongarch64igen.c): New. * Makefile.am (pei-loongarch64.lo, pe-loongarch64igen.lo, pei-loongarch64.c, pe-loongarch64igen.c): Add support. * Makefile.in: Likewise. * bfd.c (bfd_get_sign_extend_vma): Add pei-loongarch64. * coff-loongarch64.c: New file. * coffcode.h (coff_set_arch_mach_hook, coff_set_flags, coff_write_object_contents) Add loongarch64 (loongarch64_pei_vec) support. * config.bfd: Likewise. * configure: Likewise. * configure.ac: Likewise. * 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_peLoongArch64_bfd_copy_private_bfd_data_common, _bfd_peLoongArch64_bfd_copy_private_section_data, _bfd_peLoongArch64_get_symbol_info, _bfd_peLoongArch64_only_swap_filehdr_out, _bfd_peLoongArch64_print_private_bfd_data_common, _bfd_peLoongArch64i_final_link_postscript, _bfd_peLoongArch64i_only_swap_filehdr_out, _bfd_peLoongArch64i_swap_aouthdr_in, _bfd_peLoongArch64i_swap_aouthdr_out, _bfd_peLoongArch64i_swap_aux_in, _bfd_peLoongArch64i_swap_aux_out, _bfd_peLoongArch64i_swap_lineno_in, _bfd_peLoongArch64i_swap_lineno_out, _bfd_peLoongArch64i_swap_scnhdr_out, _bfd_peLoongArch64i_swap_sym_in, _bfd_peLoongArch64i_swap_sym_out, _bfd_peLoongArch64i_swap_debugdir_in, _bfd_peLoongArch64i_swap_debugdir_out, _bfd_peLoongArch64i_write_codeview_record, _bfd_peLoongArch64i_slurp_codeview_record, _bfd_peLoongArch64_print_ce_compressed_pdata): New. * 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_peLoongArch64, * pei-loongarch64.c: New file. * peicode.h (coff_swap_scnhdr_in, pe_ILF_build_a_bfd, pe_ILF_object_p): Support COFF_WITH_peLoongArch64. (jtab): Add dummy entry that traps. * targets.c (loongarch64_pei_vec): New. binutils * testsuite/binutils-all/loongarch64/loongarch64.exp: New file. * testsuite/binutils-all/loongarch64/pei-loongarch64.d: New test. * testsuite/binutils-all/loongarch64/pei-loongarch64.s: New test. include * coff/loongarch64.h: New file. * coff/pe.h (IMAGE_FILE_MACHINE_LOONGARCH64): New. Signed-off-by: Youling Tang <[email protected]>
- Loading branch information
Showing
19 changed files
with
506 additions
and
27 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -11,6 +11,7 @@ | |
/pepigen.c | ||
/pex64igen.c | ||
/pe-aarch64igen.c | ||
/pe-loongarch64igen.c | ||
/stmp-bfd-h | ||
/targmatch.h | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,165 @@ | ||
/* BFD back-end for LoongArch64 COFF files. | ||
Copyright (C) 2022 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_WITH_peLoongArch64 | ||
#define COFF_WITH_peLoongArch64 | ||
#endif | ||
|
||
/* Note we have to make sure not to include headers twice. | ||
Not all headers are wrapped in #ifdef guards, so we define | ||
PEI_HEADERS to prevent double including here. */ | ||
#ifndef PEI_HEADERS | ||
#include "sysdep.h" | ||
#include "bfd.h" | ||
#include "libbfd.h" | ||
#include "coff/loongarch64.h" | ||
#include "coff/internal.h" | ||
#include "coff/pe.h" | ||
#include "libcoff.h" | ||
#include "libiberty.h" | ||
#endif | ||
|
||
#include "libcoff.h" | ||
|
||
/* The page size is a guess based on ELF. */ | ||
|
||
#define COFF_PAGE_SIZE 0x4000 | ||
|
||
/* All users of this file have bfd_octets_per_byte (abfd, sec) == 1. */ | ||
#define OCTETS_PER_BYTE(ABFD, SEC) 1 | ||
|
||
#ifndef PCRELOFFSET | ||
#define PCRELOFFSET true | ||
#endif | ||
|
||
/* Currently we don't handle any relocations. */ | ||
static reloc_howto_type pe_loongarch64_std_reloc_howto[] = | ||
{ | ||
|
||
}; | ||
|
||
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER 2 | ||
|
||
#ifndef NUM_ELEM | ||
#define NUM_ELEM(a) ((sizeof (a)) / sizeof ((a)[0])) | ||
#endif | ||
|
||
#define NUM_RELOCS NUM_ELEM (pe_loongarch64_std_reloc_howto) | ||
|
||
#define RTYPE2HOWTO(cache_ptr, dst) \ | ||
(cache_ptr)->howto = NULL | ||
|
||
#ifndef bfd_pe_print_pdata | ||
#define bfd_pe_print_pdata NULL | ||
#endif | ||
|
||
/* 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 | ||
loongarch64_pei_vec = | ||
#endif | ||
{ | ||
#ifdef TARGET_NAME | ||
TARGET_NAME, | ||
#else | ||
"pei-loongarch64", /* 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 | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.