From: Jedidiah Thompson <wej22007@outlook.com>
To: "binutils@sourceware.org" <binutils@sourceware.org>
Subject: [PATCH} Add aarch64-pe support to LD and GAS; refine support in BFD
Date: Thu, 23 Dec 2021 13:07:12 +0000 [thread overview]
Message-ID: <BL0PR02MB49004156222C6326360BD9C6937E9@BL0PR02MB4900.namprd02.prod.outlook.com> (raw)
In case sending an attachment wasn't correct, here is the patch in a non attached form
---
bfd/ChangeLog | 14 ++++++++
bfd/Makefile.am | 1 +
bfd/Makefile.in | 3 ++
bfd/bfd.c | 2 +-
bfd/coff-aarch64.c | 2 +-
bfd/config.bfd | 8 +++++
bfd/configure | 31 +++++++++++-----
bfd/configure.ac | 1 +
bfd/doc/Makefile.in | 1 +
bfd/libpei.h | 70 ++++++++++++++++++------------------
bfd/pe-aarch64.c | 74 ++++++++++++++++++++++++++++++++++++++
bfd/pei-aarch64.c | 2 +-
bfd/peicode.h | 2 ++
bfd/targets.c | 2 ++
gas/ChangeLog | 6 ++++
gas/config/obj-coff.h | 7 ++++
gas/config/tc-aarch64.c | 26 +++++++++++---
gas/config/tc-aarch64.h | 34 ++++++++++++++++--
gas/configure.tgt | 1 +
ld/ChangeLog | 11 ++++++
ld/Makefile.am | 1 +
ld/Makefile.in | 3 ++
ld/configure.tgt | 6 +++-
ld/emulparams/aarch64pe.sh | 9 +++++
ld/emultempl/pep.em | 8 +++++
ld/pe-dll.c | 44 ++++++++++++++++++-----
ld/pep-dll-aarch64.c | 24 +++++++++++++
ld/pep-dll-x86_64.c | 24 +++++++++++++
ld/pep-dll.c | 7 ++--
29 files changed, 357 insertions(+), 67 deletions(-)
create mode 100644 bfd/pe-aarch64.c
create mode 100644 ld/emulparams/aarch64pe.sh
create mode 100644 ld/pep-dll-aarch64.c
create mode 100644 ld/pep-dll-x86_64.c
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 24311710088..fd81fb5bc0d 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,17 @@
+2021-12-22 Jedidiah Thompson <wej22007 [at] outlook [com]>
+
+ doc/Makefile.in: regenerate
+ bfd.c: change pe-aarch64-little to pe-aarch64
+ coff-aarch64.c: change pe-aarch64-little to pe-aarch64
+ config.bfd: add aarch64-pe target
+ configure: regenerate
+ configure.ac: add aarch64_pe vector
+ Makefile.am: add pe-aarch64.c
+ Makefile.in: regenerate
+ pe-aarch64.c: create
+ peicode.h: add COFF_WITH_peAArch64 case coff_swap_filehdr_out
+ targets.c: add aarch64_pe vector
+
2021-12-15 Nikita Popov <npv1310@gmail.com>
PR 28687
diff --git a/bfd/Makefile.am b/bfd/Makefile.am
index 4960cb500b1..44cfabc185e 100644
--- a/bfd/Makefile.am
+++ b/bfd/Makefile.am
@@ -616,6 +616,7 @@ BFD64_BACKENDS_CFILES = \
mmo.c \
pe-x86_64.c \
pei-aarch64.c \
+ pe-aarch64.c \
pei-ia64.c \
pei-x86_64.c \
vms-alpha.c
diff --git a/bfd/Makefile.in b/bfd/Makefile.in
index a838262bc78..8e398d2cbc6 100644
--- a/bfd/Makefile.in
+++ b/bfd/Makefile.in
@@ -439,6 +439,7 @@ pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
+runstatedir = @runstatedir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
@@ -1043,6 +1044,7 @@ BFD64_BACKENDS_CFILES = \
mmo.c \
pe-x86_64.c \
pei-aarch64.c \
+ pe-aarch64.c \
pei-ia64.c \
pei-x86_64.c \
vms-alpha.c
@@ -1574,6 +1576,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osf-core.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pc532-mach.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdp11.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-aarch64.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-aarch64igen.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-arm-wince.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pe-arm.Plo@am__quote@
diff --git a/bfd/bfd.c b/bfd/bfd.c
index 2eff8150023..e98d0195d32 100644
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -1738,7 +1738,7 @@ bfd_get_sign_extend_vma (bfd *abfd)
|| strcmp (name, "pei-i386") == 0
|| strcmp (name, "pe-x86-64") == 0
|| strcmp (name, "pei-x86-64") == 0
- || strcmp (name, "pei-aarch64-little") == 0
+ || strcmp (name, "pei-aarch64") == 0
|| strcmp (name, "pe-arm-wince-little") == 0
|| strcmp (name, "pei-arm-wince-little") == 0
|| strcmp (name, "aixcoff-rs6000") == 0
diff --git a/bfd/coff-aarch64.c b/bfd/coff-aarch64.c
index a9bc417fae8..a31b72b807d 100644
--- a/bfd/coff-aarch64.c
+++ b/bfd/coff-aarch64.c
@@ -95,7 +95,7 @@ const bfd_target
#ifdef TARGET_NAME
TARGET_NAME,
#else
- "pei-aarch64-little", /* Name. */
+ "pei-aarch64", /* Name. */
#endif
bfd_target_coff_flavour,
BFD_ENDIAN_LITTLE, /* Data byte order is little. */
diff --git a/bfd/config.bfd b/bfd/config.bfd
index c062ef8b44c..d8be9e16ae6 100644
--- a/bfd/config.bfd
+++ b/bfd/config.bfd
@@ -257,6 +257,14 @@ case "${targ}" in
targ_selvecs="aarch64_elf64_le_vec aarch64_elf32_le_vec aarch64_elf32_be_vec arm_elf32_be_vec arm_elf32_le_vec"
want64=true
;;
+ aarch64-*-pe)
+ # Not currently complete (and probably not stable), warn user
+ echo "*** WARNING BFD aarch64-pe support not complete nor stable"
+ echo "*** Do not rely on this for production purposes"
+ targ_defvec=aarch64_pei_vec
+ targ_selvecs="aarch64_pe_vec aarch64_elf64_le_vec arm_pe_le_vec arm_pei_le_vec"
+ want64=true
+ ;;
aarch64-*-freebsd*)
targ_defvec=aarch64_elf64_le_vec
targ_selvecs="aarch64_elf64_be_vec arm_elf32_le_vec arm_elf32_be_vec"
diff --git a/bfd/configure b/bfd/configure
index d4aa2178b29..4550e32a2f5 100755
--- a/bfd/configure
+++ b/bfd/configure
@@ -794,6 +794,7 @@ infodir
docdir
oldincludedir
includedir
+runstatedir
localstatedir
sharedstatedir
sysconfdir
@@ -891,6 +892,7 @@ datadir='${datarootdir}'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
includedir='${prefix}/include'
oldincludedir='/usr/include'
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1143,6 +1145,15 @@ do
| -silent | --silent | --silen | --sile | --sil)
silent=yes ;;
+ -runstatedir | --runstatedir | --runstatedi | --runstated \
+ | --runstate | --runstat | --runsta | --runst | --runs \
+ | --run | --ru | --r)
+ ac_prev=runstatedir ;;
+ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+ | --run=* | --ru=* | --r=*)
+ runstatedir=$ac_optarg ;;
+
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
ac_prev=sbindir ;;
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1280,7 +1291,7 @@ fi
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
datadir sysconfdir sharedstatedir localstatedir includedir \
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
- libdir localedir mandir
+ libdir localedir mandir runstatedir
do
eval ac_val=\$$ac_var
# Remove trailing slashes.
@@ -1433,6 +1444,7 @@ Fine tuning of the installation directories:
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc [/usr/include]
@@ -11084,7 +11096,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11087 "configure"
+#line 11099 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -11190,7 +11202,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11193 "configure"
+#line 11205 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -11620,7 +11632,7 @@ else
We can't simply define LARGE_OFF_T to be 9223372036854775807,
since some C++ compilers masquerading as C compilers
incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
&& LARGE_OFF_T % 2147483647 == 1)
? 1 : -1];
@@ -11666,7 +11678,7 @@ else
We can't simply define LARGE_OFF_T to be 9223372036854775807,
since some C++ compilers masquerading as C compilers
incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
&& LARGE_OFF_T % 2147483647 == 1)
? 1 : -1];
@@ -11690,7 +11702,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
We can't simply define LARGE_OFF_T to be 9223372036854775807,
since some C++ compilers masquerading as C compilers
incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
&& LARGE_OFF_T % 2147483647 == 1)
? 1 : -1];
@@ -11735,7 +11747,7 @@ else
We can't simply define LARGE_OFF_T to be 9223372036854775807,
since some C++ compilers masquerading as C compilers
incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
&& LARGE_OFF_T % 2147483647 == 1)
? 1 : -1];
@@ -11759,7 +11771,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
We can't simply define LARGE_OFF_T to be 9223372036854775807,
since some C++ compilers masquerading as C compilers
incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
&& LARGE_OFF_T % 2147483647 == 1)
? 1 : -1];
@@ -13297,6 +13309,7 @@ do
aarch64_elf64_le_cloudabi_vec) tb="$tb elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
aarch64_mach_o_vec) tb="$tb mach-o-aarch64.lo"; target_size=64 ;;
aarch64_pei_vec) tb="$tb pei-aarch64.lo pe-aarch64igen.lo $coff"; target_size=64 ;;
+ aarch64_pe_vec) tb="$tb pe-aarch64.lo pe-aarch64igen.lo $coff"; target_size=64 ;;
alpha_ecoff_le_vec) tb="$tb coff-alpha.lo ecoff.lo $ecoff"; target_size=64 ;;
alpha_elf64_vec) tb="$tb elf64-alpha.lo elf64.lo $elf"; target_size=64 ;;
alpha_elf64_fbsd_vec) tb="$tb elf64-alpha.lo elf64.lo $elf"; target_size=64 ;;
@@ -14993,6 +15006,8 @@ main ()
if (*(data + i) != *(data3 + i))
return 14;
close (fd);
+ free (data);
+ free (data3);
return 0;
}
_ACEOF
diff --git a/bfd/configure.ac b/bfd/configure.ac
index a578c3a019e..7eef17067b2 100644
--- a/bfd/configure.ac
+++ b/bfd/configure.ac
@@ -438,6 +438,7 @@ do
aarch64_elf64_le_cloudabi_vec) tb="$tb elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
aarch64_mach_o_vec) tb="$tb mach-o-aarch64.lo"; target_size=64 ;;
aarch64_pei_vec) tb="$tb pei-aarch64.lo pe-aarch64igen.lo $coff"; target_size=64 ;;
+ aarch64_pe_vec) tb="$tb pe-aarch64.lo pe-aarch64igen.lo $coff"; target_size=64 ;;
alpha_ecoff_le_vec) tb="$tb coff-alpha.lo ecoff.lo $ecoff"; target_size=64 ;;
alpha_elf64_vec) tb="$tb elf64-alpha.lo elf64.lo $elf"; target_size=64 ;;
alpha_elf64_fbsd_vec) tb="$tb elf64-alpha.lo elf64.lo $elf"; target_size=64 ;;
diff --git a/bfd/doc/Makefile.in b/bfd/doc/Makefile.in
index c070dd8c458..27e44971e85 100644
--- a/bfd/doc/Makefile.in
+++ b/bfd/doc/Makefile.in
@@ -376,6 +376,7 @@ pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
+runstatedir = @runstatedir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
diff --git a/bfd/libpei.h b/bfd/libpei.h
index 26589e8e520..272ae0485a3 100644
--- a/bfd/libpei.h
+++ b/bfd/libpei.h
@@ -240,41 +240,6 @@
#define _bfd_XXi_write_codeview_record _bfd_pex64i_write_codeview_record
#define _bfd_XXi_slurp_codeview_record _bfd_pex64i_slurp_codeview_record
-#elif defined COFF_WITH_pep
-
-#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_64
-
-#define _bfd_XX_bfd_copy_private_bfd_data_common _bfd_pep_bfd_copy_private_bfd_data_common
-#define _bfd_XX_bfd_copy_private_section_data _bfd_pep_bfd_copy_private_section_data
-#define _bfd_XX_get_symbol_info _bfd_pep_get_symbol_info
-#define _bfd_XX_only_swap_filehdr_out _bfd_pep_only_swap_filehdr_out
-#define _bfd_XX_print_private_bfd_data_common _bfd_pep_print_private_bfd_data_common
-#define _bfd_XXi_final_link_postscript _bfd_pepi_final_link_postscript
-#define _bfd_XXi_only_swap_filehdr_out _bfd_pepi_only_swap_filehdr_out
-#define _bfd_XXi_swap_aouthdr_in _bfd_pepi_swap_aouthdr_in
-#define _bfd_XXi_swap_aouthdr_out _bfd_pepi_swap_aouthdr_out
-#define _bfd_XXi_swap_aux_in _bfd_pepi_swap_aux_in
-#define _bfd_XXi_swap_aux_out _bfd_pepi_swap_aux_out
-#define _bfd_XXi_swap_lineno_in _bfd_pepi_swap_lineno_in
-#define _bfd_XXi_swap_lineno_out _bfd_pepi_swap_lineno_out
-#define _bfd_XXi_swap_scnhdr_out _bfd_pepi_swap_scnhdr_out
-#define _bfd_XXi_swap_sym_in _bfd_pepi_swap_sym_in
-#define _bfd_XXi_swap_sym_out _bfd_pepi_swap_sym_out
-#define _bfd_XXi_swap_debugdir_in _bfd_pepi_swap_debugdir_in
-#define _bfd_XXi_swap_debugdir_out _bfd_pepi_swap_debugdir_out
-#define _bfd_XXi_write_codeview_record _bfd_pepi_write_codeview_record
-#define _bfd_XXi_slurp_codeview_record _bfd_pepi_slurp_codeview_record
-
#elif defined COFF_WITH_peAArch64
#define GET_OPTHDR_IMAGE_BASE H_GET_64
@@ -310,6 +275,41 @@
#define _bfd_XXi_write_codeview_record _bfd_peAArch64i_write_codeview_record
#define _bfd_XXi_slurp_codeview_record _bfd_peAArch64i_slurp_codeview_record
+#elif defined COFF_WITH_pep
+
+#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_64
+
+#define _bfd_XX_bfd_copy_private_bfd_data_common _bfd_pep_bfd_copy_private_bfd_data_common
+#define _bfd_XX_bfd_copy_private_section_data _bfd_pep_bfd_copy_private_section_data
+#define _bfd_XX_get_symbol_info _bfd_pep_get_symbol_info
+#define _bfd_XX_only_swap_filehdr_out _bfd_pep_only_swap_filehdr_out
+#define _bfd_XX_print_private_bfd_data_common _bfd_pep_print_private_bfd_data_common
+#define _bfd_XXi_final_link_postscript _bfd_pepi_final_link_postscript
+#define _bfd_XXi_only_swap_filehdr_out _bfd_pepi_only_swap_filehdr_out
+#define _bfd_XXi_swap_aouthdr_in _bfd_pepi_swap_aouthdr_in
+#define _bfd_XXi_swap_aouthdr_out _bfd_pepi_swap_aouthdr_out
+#define _bfd_XXi_swap_aux_in _bfd_pepi_swap_aux_in
+#define _bfd_XXi_swap_aux_out _bfd_pepi_swap_aux_out
+#define _bfd_XXi_swap_lineno_in _bfd_pepi_swap_lineno_in
+#define _bfd_XXi_swap_lineno_out _bfd_pepi_swap_lineno_out
+#define _bfd_XXi_swap_scnhdr_out _bfd_pepi_swap_scnhdr_out
+#define _bfd_XXi_swap_sym_in _bfd_pepi_swap_sym_in
+#define _bfd_XXi_swap_sym_out _bfd_pepi_swap_sym_out
+#define _bfd_XXi_swap_debugdir_in _bfd_pepi_swap_debugdir_in
+#define _bfd_XXi_swap_debugdir_out _bfd_pepi_swap_debugdir_out
+#define _bfd_XXi_write_codeview_record _bfd_pepi_write_codeview_record
+#define _bfd_XXi_slurp_codeview_record _bfd_pepi_slurp_codeview_record
+
#else /* !COFF_WITH_pep */
#define GET_OPTHDR_IMAGE_BASE H_GET_32
diff --git a/bfd/pe-aarch64.c b/bfd/pe-aarch64.c
new file mode 100644
index 00000000000..242d4605c2e
--- /dev/null
+++ b/bfd/pe-aarch64.c
@@ -0,0 +1,74 @@
+/* BFD back-end for AArch64 PE IMAGE COFF files.
+ Copyright (C) 2021 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 aarch64_pe_vec
+#define TARGET_NAME "pe-aarch64"
+#define TARGET_ARCHITECTURE bfd_arch_aarch64
+#define TARGET_PAGESIZE 4096
+#define TARGET_BIG_ENDIAN 0
+#define TARGET_ARCHIVE 0
+#define TARGET_PRIORITY 0
+
+/* Rename the above into.. */
+#define COFF_WITH_peAArch64
+#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 }
+
+#define PEI_HEADERS
+#include "sysdep.h"
+#include "bfd.h"
+#include "libbfd.h"
+#include "coff/aarch64.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-aarch64.c"
diff --git a/bfd/pei-aarch64.c b/bfd/pei-aarch64.c
index 99326d16126..a0f926e31ce 100644
--- a/bfd/pei-aarch64.c
+++ b/bfd/pei-aarch64.c
@@ -22,7 +22,7 @@
#include "bfd.h"
#define TARGET_SYM aarch64_pei_vec
-#define TARGET_NAME "pei-aarch64-little"
+#define TARGET_NAME "pei-aarch64"
#define TARGET_ARCHITECTURE bfd_arch_aarch64
#define TARGET_PAGESIZE 4096
#define TARGET_BIG_ENDIAN 0
diff --git a/bfd/peicode.h b/bfd/peicode.h
index 1e8ed803edc..3306ef92a8a 100644
--- a/bfd/peicode.h
+++ b/bfd/peicode.h
@@ -191,6 +191,8 @@ coff_swap_filehdr_in (bfd * abfd, void * src, void * dst)
#ifdef COFF_IMAGE_WITH_PE
# define coff_swap_filehdr_out _bfd_XXi_only_swap_filehdr_out
+#elif defined COFF_WITH_peAArch64
+# define coff_swap_filehdr_out _bfd_XX_only_swap_filehdr_out
#elif defined COFF_WITH_pex64
# define coff_swap_filehdr_out _bfd_pex64_only_swap_filehdr_out
#elif defined COFF_WITH_pep
diff --git a/bfd/targets.c b/bfd/targets.c
index 672dc2bb1a4..bf3c2d383a4 100644
--- a/bfd/targets.c
+++ b/bfd/targets.c
@@ -680,6 +680,7 @@ extern const bfd_target aarch64_elf64_le_vec;
extern const bfd_target aarch64_elf64_le_cloudabi_vec;
extern const bfd_target aarch64_mach_o_vec;
extern const bfd_target aarch64_pei_vec;
+extern const bfd_target aarch64_pe_vec;
extern const bfd_target alpha_ecoff_le_vec;
extern const bfd_target alpha_elf64_vec;
extern const bfd_target alpha_elf64_fbsd_vec;
@@ -995,6 +996,7 @@ static const bfd_target * const _bfd_target_vector[] =
&aarch64_elf64_le_cloudabi_vec,
&aarch64_mach_o_vec,
&aarch64_pei_vec,
+ &aarch64_pe_vec,
#endif
#ifdef BFD64
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 77888663077..3beb269f7ba 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,9 @@
+2021-12-22 Jedidiah Thompson <wej22007 [at] outlook [com]>
+
+ * config/tc-aarch64.c: add AArch64 COFF / PE support to GAS
+ * config/tc-aarch64.h: add AArch64 COFF / PE support
+ * configure.tgt: add AArch64 COFF / PE
+
2021-12-16 Nick Clifton <nickc@redhat.com>
PR 28686
diff --git a/gas/config/obj-coff.h b/gas/config/obj-coff.h
index 73c001e3edc..dc94884f831 100644
--- a/gas/config/obj-coff.h
+++ b/gas/config/obj-coff.h
@@ -40,6 +40,13 @@
#endif
#endif
+#ifdef TC_AARCH64
+#include "coff/aarch64.h"
+#ifndef TARGET_FORMAT
+#define TARGET_FORMAT "pe-aarch64"
+#endif
+#endif
+
#ifdef TC_PPC
#include "coff/rs6000.h"
#endif
diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
index cc7725483aa..7b5c77d60d9 100644
--- a/gas/config/tc-aarch64.c
+++ b/gas/config/tc-aarch64.c
@@ -1475,7 +1475,7 @@ s_unreq (int a ATTRIBUTE_UNUSED)
/* Directives: Instruction set selection. */
-#ifdef OBJ_ELF
+#if defined (OBJ_ELF) || defined (OBJ_COFF)
/* This code is to handle mapping symbols as defined in the ARM AArch64 ELF
spec. (See "Mapping symbols", section 4.5.4, ARM AAELF64 version 0.05).
Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
@@ -2029,6 +2029,7 @@ s_aarch64_inst (int ignored ATTRIBUTE_UNUSED)
demand_empty_rest_of_line ();
}
+#ifdef OBJ_ELF
static void
s_aarch64_cfi_b_key_frame (int ignored ATTRIBUTE_UNUSED)
{
@@ -2037,7 +2038,6 @@ s_aarch64_cfi_b_key_frame (int ignored ATTRIBUTE_UNUSED)
fde->pauth_key = AARCH64_PAUTH_KEY_B;
}
-#ifdef OBJ_ELF
/* Emit BFD_RELOC_AARCH64_TLSDESC_ADD on the next ADD instruction. */
static void
@@ -2111,8 +2111,8 @@ const pseudo_typeS md_pseudo_table[] = {
{"arch", s_aarch64_arch, 0},
{"arch_extension", s_aarch64_arch_extension, 0},
{"inst", s_aarch64_inst, 0},
- {"cfi_b_key_frame", s_aarch64_cfi_b_key_frame, 0},
#ifdef OBJ_ELF
+ {"cfi_b_key_frame", s_aarch64_cfi_b_key_frame, 0},
{"tlsdescadd", s_tlsdescadd, 0},
{"tlsdesccall", s_tlsdesccall, 0},
{"tlsdescldr", s_tlsdescldr, 0},
@@ -8302,7 +8302,7 @@ aarch64_handle_align (fragS * fragP)
fix = bytes & (noop_size - 1);
if (fix)
{
-#ifdef OBJ_ELF
+#if defined(OBJ_ELF) || defined(OBJ_COFF)
insert_data_mapping_symbol (MAP_INSN, fragP->fr_fix, fragP, fix);
#endif
memset (p, 0, fix);
@@ -9044,9 +9044,13 @@ md_apply_fix (fixS * fixP, valueT * valP, segT seg)
break;
case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC:
+#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
fixP->fx_r_type = (ilp32_p
? BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC
: BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC);
+#else
+ fixP->fx_r_type = BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC;
+#endif
S_SET_THREAD_LOCAL (fixP->fx_addsy);
/* Should always be exported to object file, see
aarch64_force_relocation(). */
@@ -9055,9 +9059,13 @@ md_apply_fix (fixS * fixP, valueT * valP, segT seg)
break;
case BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC:
+#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
fixP->fx_r_type = (ilp32_p
? BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC
: BFD_RELOC_AARCH64_TLSDESC_LD64_LO12);
+#else
+ fixP->fx_r_type = BFD_RELOC_AARCH64_TLSDESC_LD64_LO12;
+#endif
S_SET_THREAD_LOCAL (fixP->fx_addsy);
/* Should always be exported to object file, see
aarch64_force_relocation(). */
@@ -9127,9 +9135,13 @@ md_apply_fix (fixS * fixP, valueT * valP, segT seg)
case BFD_RELOC_AARCH64_LD_GOT_LO12_NC:
/* Should always be exported to object file, see
aarch64_force_relocation(). */
+#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
fixP->fx_r_type = (ilp32_p
? BFD_RELOC_AARCH64_LD32_GOT_LO12_NC
: BFD_RELOC_AARCH64_LD64_GOT_LO12_NC);
+#else
+ fixP->fx_r_type = BFD_RELOC_AARCH64_LD64_GOT_LO12_NC;
+#endif
gas_assert (!fixP->fx_done);
gas_assert (seg->use_rela_p);
break;
@@ -9627,7 +9639,11 @@ md_begin (void)
cpu_variant = *mcpu_cpu_opt;
/* Record the CPU type. */
+#if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
mach = ilp32_p ? bfd_mach_aarch64_ilp32 : bfd_mach_aarch64;
+#else
+ mach = bfd_mach_aarch64;
+#endif
bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
}
@@ -10187,6 +10203,7 @@ aarch64_parse_arch (const char *str)
return 0;
}
+#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
/* ABIs. */
struct aarch64_option_abi_value_table
{
@@ -10220,6 +10237,7 @@ aarch64_parse_abi (const char *str)
as_bad (_("unknown abi `%s'\n"), str);
return 0;
}
+#endif
static struct aarch64_long_option_table aarch64_long_opts[] = {
#ifdef OBJ_ELF
diff --git a/gas/config/tc-aarch64.h b/gas/config/tc-aarch64.h
index 78bff0a1b56..a508f27d513 100644
--- a/gas/config/tc-aarch64.h
+++ b/gas/config/tc-aarch64.h
@@ -169,7 +169,7 @@ void aarch64_elf_copy_symbol_attributes (symbolS *, symbolS *);
struct aarch64_frag_type
{
int recorded;
-#ifdef OBJ_ELF
+#if defined (OBJ_ELF) || defined (OBJ_COFF)
/* If there is a mapping symbol at offset 0 in this frag,
it will be saved in FIRST_MAP. If there are any mapping
symbols in this frag, the last one will be saved in
@@ -242,6 +242,34 @@ struct aarch64_segment_info_type
extern void aarch64_after_parse_args (void);
#define md_after_parse_args() aarch64_after_parse_args ()
+#elif defined(TE_PEP)
+# define GLOBAL_OFFSET_TABLE_NAME "__GLOBAL_OFFSET_TABLE_"
+# define TC_SEGMENT_INFO_TYPE struct aarch64_segment_info_type
+
+/* This is not really an alignment operation, but it's something we
+ need to do at the same time: whenever we are figuring out the
+ alignment for data, we should check whether a $d symbol is
+ necessary. */
+# define md_cons_align(nbytes) mapping_state (MAP_DATA)
+
+enum mstate
+{
+ MAP_UNDEFINED = 0, /* Must be zero, for seginfo in new sections. */
+ MAP_DATA,
+ MAP_INSN,
+};
+
+void mapping_state (enum mstate);
+
+struct aarch64_segment_info_type
+{
+ const char *last_file;
+ unsigned last_line;
+ enum mstate mapstate;
+ unsigned int marked_pr_dependency;
+ aarch64_instr_sequence insn_sequence;
+};
+
#else /* Not OBJ_ELF. */
#define GLOBAL_OFFSET_TABLE_NAME "__GLOBAL_OFFSET_TABLE_"
#endif
@@ -274,13 +302,13 @@ extern void aarch64_handle_align (struct frag *);
extern int tc_aarch64_regname_to_dw2regnum (char *regname);
extern void tc_aarch64_frame_initial_instructions (void);
-#ifdef TE_PE
+#if 0
#define O_secrel O_md1
#define TC_DWARF2_EMIT_OFFSET tc_pe_dwarf2_emit_offset
void tc_pe_dwarf2_emit_offset (symbolS *, unsigned int);
-#endif /* TE_PE */
+#endif
#endif /* TC_AARCH64 */
diff --git a/gas/configure.tgt b/gas/configure.tgt
index d3db3aa9e88..bb6d543e893 100644
--- a/gas/configure.tgt
+++ b/gas/configure.tgt
@@ -134,6 +134,7 @@ case ${generic_target} in
aarch64*-linux-gnu_ilp32) arch=aarch64:32 ;;
esac ;;
aarch64*-*-netbsd*) fmt=elf em=nbsd;;
+ aarch64*-*-pe*) fmt=coff em=pep ;;
alpha-*-*vms*) fmt=evax ;;
alpha-*-osf*) fmt=ecoff ;;
diff --git a/ld/ChangeLog b/ld/ChangeLog
index a0ab861bb4a..50a0947c425 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,14 @@
+2021-12-22 Jedidiah Thompson <wej22007 [at] outlook [com]>
+
+ emulparams/aarch64pe.sh: create
+ emultempl/pep.em: remove x86_64 assumptions and add AArch64 support
+ configure.tgt: add aarch64-pe target
+ Makefile.am: add aarch64pe emulation
+ Makefile.in: regenerate
+ pe-dll.c: add aarch64 support, genralize for non x86_64
+ pep-dll-aarch64.c: create
+ pep-dll-x86_64.c: create
+
2021-12-16 Nick Clifton <nickc@redhat.com>
PR 28686
diff --git a/ld/Makefile.am b/ld/Makefile.am
index d27d9956af8..f6db936e71f 100644
--- a/ld/Makefile.am
+++ b/ld/Makefile.am
@@ -391,6 +391,7 @@ ALL_64_EMULATION_SOURCES = \
eaarch64linux32.c \
eaarch64linux32b.c \
eaarch64linuxb.c \
+ eaarch64pe.c \
eelf32_x86_64.c \
eelf32b4300.c \
eelf32bmip.c \
diff --git a/ld/Makefile.in b/ld/Makefile.in
index d159f14823f..f6f24d76077 100644
--- a/ld/Makefile.in
+++ b/ld/Makefile.in
@@ -522,6 +522,7 @@ pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
+runstatedir = @runstatedir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
@@ -880,6 +881,7 @@ ALL_64_EMULATION_SOURCES = \
eaarch64linux32.c \
eaarch64linux32b.c \
eaarch64linuxb.c \
+ eaarch64pe.c \
eelf32_x86_64.c \
eelf32b4300.c \
eelf32bmip.c \
@@ -1255,6 +1257,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eaarch64linux32.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eaarch64linux32b.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eaarch64linuxb.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eaarch64pe.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eaix5ppc.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eaix5rs6.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eaixppc.Po@am__quote@
diff --git a/ld/configure.tgt b/ld/configure.tgt
index 925ce076179..717b40affc2 100644
--- a/ld/configure.tgt
+++ b/ld/configure.tgt
@@ -50,6 +50,10 @@ aarch64-*-elf | aarch64-*-rtems* | aarch64-*-genode*)
targ_emul=aarch64elf
targ_extra_emuls="aarch64elf32 aarch64elf32b aarch64elfb armelf armelfb"
;;
+aarch64-*-pe)
+ targ_emul=aarch64pe
+ targ_extra_ofiles="deffilep.o pep-dll-aarch64.o"
+ ;;
aarch64-*-cloudabi*) targ_emul=aarch64cloudabi
targ_extra_emuls=aarch64cloudabib
;;
@@ -1005,7 +1009,7 @@ x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu)
;;
x86_64-*-pe | x86_64-*-pep) targ_emul=i386pep ;
targ_extra_emuls=i386pe ;
- targ_extra_ofiles="deffilep.o pep-dll.o pe-dll.o"
+ targ_extra_ofiles="deffilep.o pep-dll-x86_64.o pe-dll.o"
;;
x86_64-*-cygwin) targ_emul=i386pep ;
targ_extra_emuls=i386pe
diff --git a/ld/emulparams/aarch64pe.sh b/ld/emulparams/aarch64pe.sh
new file mode 100644
index 00000000000..3b1c161692e
--- /dev/null
+++ b/ld/emulparams/aarch64pe.sh
@@ -0,0 +1,9 @@
+ARCH="aarch64"
+SCRIPT_NAME=pep
+OUTPUT_FORMAT="pei-aarch64"
+RELOCATEABLE_OUTPUT_FORMAT="pe-aarch64"
+TEMPLATE_NAME=pep
+SUBSYSTEM=PE_DEF_SUBSYSTEM
+INITIAL_SYMBOL_CHAR=\"_\"
+TARGET_PAGE_SIZE=0x1000
+GENERATE_AUTO_IMPORT_SCRIPT=1
diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em
index 430351b6481..af7e1ff07d1 100644
--- a/ld/emultempl/pep.em
+++ b/ld/emultempl/pep.em
@@ -48,7 +48,11 @@ fragment <<EOF
#define COFF_IMAGE_WITH_PE
#define COFF_WITH_PE
+#ifdef TARGET_IS_aarch64pe
+#define COFF_WITH_peAArch64
+#elif defined TARGET_IS_i386pep
#define COFF_WITH_pex64
+#endif
#include "sysdep.h"
#include "bfd.h"
@@ -72,7 +76,11 @@ fragment <<EOF
/* FIXME: See bfd/peXXigen.c for why we include an architecture specific
header in generic PE code. */
+#ifdef COFF_WITH_pex64
#include "coff/x86_64.h"
+#elif defined COFF_WITH_peAArch64
+#include "coff/aarch64.h"
+#endif
#include "coff/pe.h"
/* FIXME: These are BFD internal header files, and we should not be
diff --git a/ld/pe-dll.c b/ld/pe-dll.c
index e7b82ba6ffa..43c052d723b 100644
--- a/ld/pe-dll.c
+++ b/ld/pe-dll.c
@@ -42,7 +42,7 @@
#include "../bfd/libcoff.h"
#include "deffile.h"
-#ifdef pe_use_x86_64
+#ifdef pe_use_plus
#define PE_IDATA4_SIZE 8
#define PE_IDATA5_SIZE 8
@@ -209,7 +209,7 @@ static const autofilter_entry_type autofilter_symbollist_i386[] =
{ STRING_COMMA_LEN ("_NULL_IMPORT_DESCRIPTOR") },
/* Entry point symbols, and entry hooks. */
{ STRING_COMMA_LEN ("cygwin_crt0") },
-#ifdef pe_use_x86_64
+#ifdef pe_use_plus
{ STRING_COMMA_LEN ("DllMain") },
{ STRING_COMMA_LEN ("DllEntryPoint") },
{ STRING_COMMA_LEN ("DllMainCRTStartup") },
@@ -246,13 +246,14 @@ static const autofilter_entry_type autofilter_symbollist_i386[] =
#define PE_ARCH_mips 3
#define PE_ARCH_arm 4
#define PE_ARCH_arm_wince 5
+#define PE_ARCH_aarch64 6
/* Don't make it constant as underscore mode gets possibly overriden
by target or -(no-)leading-underscore option. */
static pe_details_type pe_detail_list[] =
{
{
-#ifdef pe_use_x86_64
+#ifdef pe_use_plus
"pei-x86-64",
"pe-x86-64",
3 /* R_IMAGEBASE */,
@@ -263,14 +264,14 @@ static pe_details_type pe_detail_list[] =
#endif
PE_ARCH_i386,
bfd_arch_i386,
-#ifdef pe_use_x86_64
+#ifdef pe_use_plus
false,
#else
true,
#endif
autofilter_symbollist_i386
},
-#ifdef pe_use_x86_64
+#ifdef pe_use_plus
{
"pei-x86-64",
"pe-bigobj-x86-64",
@@ -327,6 +328,15 @@ static pe_details_type pe_detail_list[] =
false,
autofilter_symbollist_generic
},
+ {
+ "pei-aarch64",
+ "pe-aarch64",
+ 2, /* ARM64_RVA32 */
+ PE_ARCH_aarch64,
+ bfd_arch_aarch64,
+ false,
+ autofilter_symbollist_generic
+ },
{ NULL, NULL, 0, 0, 0, false, NULL }
};
@@ -1641,7 +1651,7 @@ generate_reloc (bfd *abfd, struct bfd_link_info *info)
switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
relocs[i]->howto->rightshift)
{
-#ifdef pe_use_x86_64
+#ifdef pe_use_plus
case BITS_AND_SHIFT (64, 0):
reloc_data[total_relocs].type = 10;
total_relocs++;
@@ -2278,6 +2288,15 @@ static const unsigned char jmp_arm_bytes[] =
0, 0, 0, 0
};
+/* _function:
+ b <__imp_function>
+ nop */
+static const unsigned char jmp_aarch64_bytes[] =
+{
+ 0x00, 0x00, 0x00, 0x14,
+ 0x1f, 0x20, 0x03, 0xD5
+};
+
static bfd *
make_one (def_file_export *exp, bfd *parent, bool include_jmp_stub)
@@ -2317,6 +2336,10 @@ make_one (def_file_export *exp, bfd *parent, bool include_jmp_stub)
jmp_bytes = jmp_arm_bytes;
jmp_byte_count = sizeof (jmp_arm_bytes);
break;
+ case PE_ARCH_aarch64:
+ jmp_bytes = jmp_aarch64_bytes;
+ jmp_byte_count = sizeof (jmp_aarch64_bytes);
+ break;
default:
abort ();
}
@@ -2382,7 +2405,7 @@ make_one (def_file_export *exp, bfd *parent, bool include_jmp_stub)
switch (pe_details->pe_arch)
{
case PE_ARCH_i386:
-#ifdef pe_use_x86_64
+#ifdef pe_use_plus
quick_reloc (abfd, 2, BFD_RELOC_32_PCREL, 2);
#else
/* Mark this object as SAFESEH compatible. */
@@ -2403,6 +2426,9 @@ make_one (def_file_export *exp, bfd *parent, bool include_jmp_stub)
case PE_ARCH_arm_wince:
quick_reloc (abfd, 8, BFD_RELOC_32, 2);
break;
+ case PE_ARCH_aarch64:
+ quick_reloc (abfd, 0, BFD_RELOC_32_PCREL, 2);
+ break;
default:
abort ();
}
@@ -3374,7 +3400,7 @@ pe_implied_import_dll (const char *filename)
/* Get pe_header, optional header and numbers of directory entries. */
pe_header_offset = pe_get32 (dll, 0x3c);
opthdr_ofs = pe_header_offset + 4 + 20;
-#ifdef pe_use_x86_64
+#ifdef pe_use_plus
num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
#else
num_entries = pe_get32 (dll, opthdr_ofs + 92);
@@ -3384,7 +3410,7 @@ pe_implied_import_dll (const char *filename)
if (num_entries < 1)
return false;
-#ifdef pe_use_x86_64
+#ifdef pe_use_plus
export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
#else
diff --git a/ld/pep-dll-aarch64.c b/ld/pep-dll-aarch64.c
new file mode 100644
index 00000000000..b57fd03ebfa
--- /dev/null
+++ b/ld/pep-dll-aarch64.c
@@ -0,0 +1,24 @@
+/* Tiny wrapper over pep-dll.c
+ Copyright (C) 2006-2021 Free Software Foundation, Inc.
+ Written by Kai Tietz, OneVision Software GmbH&CoKg.
+
+ This file is part of the GNU Binutils.
+
+ 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. */
+
+#define COFF_WITH_peAArch64
+
+#include "pep-dll.c"
diff --git a/ld/pep-dll-x86_64.c b/ld/pep-dll-x86_64.c
new file mode 100644
index 00000000000..858e1a876ff
--- /dev/null
+++ b/ld/pep-dll-x86_64.c
@@ -0,0 +1,24 @@
+/* Tiny wrapper over pep-dll.c
+ Copyright (C) 2006-2021 Free Software Foundation, Inc.
+ Written by Kai Tietz, OneVision Software GmbH&CoKg.
+
+ This file is part of the GNU Binutils.
+
+ 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. */
+
+#define COFF_WITH_pex64
+
+#include "pep-dll.c"
diff --git a/ld/pep-dll.c b/ld/pep-dll.c
index 8564fb995b9..6760bcdefcb 100644
--- a/ld/pep-dll.c
+++ b/ld/pep-dll.c
@@ -1,4 +1,4 @@
-/* Routines to help build PEPI-format DLLs (Win64 etc)
+/* Routines to help build PEPI-format DLLs on x86_64 (Win64 etc)
Copyright (C) 2006-2021 Free Software Foundation, Inc.
Written by Kai Tietz, OneVision Software GmbH&CoKg.
@@ -21,7 +21,6 @@
#define COFF_IMAGE_WITH_PE
#define COFF_WITH_PE
-#define COFF_WITH_pex64
/* Local defined globals. */
#define pe_def_file pep_def_file
@@ -58,7 +57,7 @@
#define pe_output_file_set_long_section_names \
pep_output_file_set_long_section_names
-/* Uses x86_64 PE+. */
-#define pe_use_x86_64
+/* Use PE+. */
+#define pe_use_plus
#include "pe-dll.c"
--
2.32.0
next reply other threads:[~2021-12-23 13:07 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-23 13:07 Jedidiah Thompson [this message]
2021-12-24 15:57 ` Tamar Christina
2021-12-27 17:07 ` Jedidiah Thompson
2021-12-29 11:38 ` Tamar Christina
2021-12-29 18:36 ` Jedidiah Thompson
2021-12-29 21:29 ` Jedidiah Thompson
2021-12-30 11:00 ` Tamar Christina
2021-12-30 13:54 ` Jedidiah Thompson
2021-12-30 10:51 ` Tamar Christina
-- strict thread matches above, loose matches on Subject: below --
2021-12-22 23:19 [PATCH] " Jedidiah Thompson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=BL0PR02MB49004156222C6326360BD9C6937E9@BL0PR02MB4900.namprd02.prod.outlook.com \
--to=wej22007@outlook.com \
--cc=binutils@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).