diff options
author | Mark Harmstone <mark@harmstone.com> | 2023-01-05 02:36:32 +0000 |
---|---|---|
committer | Mark Harmstone <mark@harmstone.com> | 2023-01-10 23:30:49 +0000 |
commit | 16fea92ccd993fce6b5b0efebe059d542cad9932 (patch) | |
tree | 59a1531c16963593e8b5d07f89b2525a0d00df3a /binutils/dlltool.c | |
parent | 528e4f463f511b11ad414bc91bcf89c4fb53c352 (diff) | |
download | binutils-gdb-16fea92ccd993fce6b5b0efebe059d542cad9932.tar.gz |
Add aarch64-w64-mingw32 target
This adds a mingw target for aarch64, including windres and dlltool.
Note that the old value of jmp_aarch64_bytes was wrong, and this does
the same thing as MSVC does.
Diffstat (limited to 'binutils/dlltool.c')
-rw-r--r-- | binutils/dlltool.c | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/binutils/dlltool.c b/binutils/dlltool.c index 7ca6906e2bd..31c864d7d5c 100644 --- a/binutils/dlltool.c +++ b/binutils/dlltool.c @@ -442,6 +442,11 @@ static const char *mname = "arm"; static const char *mname = "arm-wince"; #endif +#ifdef DLLTOOL_DEFAULT_AARCH64 +/* arm64 rather than aarch64 to match llvm-dlltool */ +static const char *mname = "arm64"; +#endif + #ifdef DLLTOOL_DEFAULT_I386 static const char *mname = "i386"; #endif @@ -560,6 +565,14 @@ static const unsigned char mcore_le_jtab[] = 0x00, 0x00, 0x00, 0x00 /* <address> */ }; +static const unsigned char aarch64_jtab[] = +{ + 0x10, 0x00, 0x00, 0x90, /* adrp x16, 0 */ + 0x10, 0x02, 0x00, 0x91, /* add x16, x16, #0x0 */ + 0x10, 0x02, 0x40, 0xf9, /* ldr x16, [x16] */ + 0x00, 0x02, 0x1f, 0xd6 /* br x16 */ +}; + static const char i386_trampoline[] = "\tpushl %%ecx\n" "\tpushl %%edx\n" @@ -717,6 +730,15 @@ mtable[] = i386_x64_dljtab, sizeof (i386_x64_dljtab), 2, 9, 14, true, i386_x64_trampoline } , + { +#define MAARCH64 10 + "arm64", ".byte", ".short", ".long", ".asciz", "//", + "bl ", ".global", ".space", ".balign\t2", ".balign\t4", "", + "pe-aarch64-little", bfd_arch_aarch64, + aarch64_jtab, sizeof (aarch64_jtab), 0, + 0, 0, 0, 0, 0, false, 0 + } + , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; @@ -864,6 +886,7 @@ rvaafter (int mach) case MMCORE_ELF: case MMCORE_ELF_LE: case MARM_WINCE: + case MAARCH64: break; default: /* xgettext:c-format */ @@ -888,6 +911,7 @@ rvabefore (int mach) case MMCORE_ELF: case MMCORE_ELF_LE: case MARM_WINCE: + case MAARCH64: return ".rva\t"; default: /* xgettext:c-format */ @@ -910,6 +934,7 @@ asm_prefix (int mach, const char *name) case MMCORE_ELF: case MMCORE_ELF_LE: case MARM_WINCE: + case MAARCH64: break; case M386: case MX86: @@ -2474,6 +2499,8 @@ make_one_lib_file (export_type *exp, int i, int delay) case TEXT: if (! exp->data) { + unsigned int rpp_len; + si->size = HOW_JTAB_SIZE; si->data = xmalloc (HOW_JTAB_SIZE); memcpy (si->data, HOW_JTAB, HOW_JTAB_SIZE); @@ -2481,7 +2508,12 @@ make_one_lib_file (export_type *exp, int i, int delay) /* Add the reloc into idata$5. */ rel = xmalloc (sizeof (arelent)); - rpp = xmalloc (sizeof (arelent *) * (delay ? 4 : 2)); + rpp_len = delay ? 4 : 2; + + if (machine == MAARCH64) + rpp_len++; + + rpp = xmalloc (sizeof (arelent *) * rpp_len); rpp[0] = rel; rpp[1] = 0; @@ -2507,6 +2539,22 @@ make_one_lib_file (export_type *exp, int i, int delay) BFD_RELOC_32_PCREL); rel->sym_ptr_ptr = iname_pp; } + else if (machine == MAARCH64) + { + arelent *rel_add; + + rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL); + rel->sym_ptr_ptr = secdata[IDATA5].sympp; + + rel_add = xmalloc (sizeof (arelent)); + rel_add->address = 4; + rel_add->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_AARCH64_ADD_LO12); + rel_add->sym_ptr_ptr = secdata[IDATA5].sympp; + rel_add->addend = 0; + + rpp[rpp_len - 2] = rel_add; + rpp[rpp_len - 1] = 0; + } else { rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32); @@ -2527,7 +2575,7 @@ make_one_lib_file (export_type *exp, int i, int delay) } sec->orelocation = rpp; - sec->reloc_count = delay ? 3 : 1; + sec->reloc_count = rpp_len - 1; } break; @@ -3674,7 +3722,7 @@ usage (FILE *file, int status) fprintf (file, _("Usage %s <option(s)> <object-file(s)>\n"), program_name); /* xgetext:c-format */ fprintf (file, _(" -m --machine <machine> Create as DLL for <machine>. [default: %s]\n"), mname); - fprintf (file, _(" possible <machine>: arm[_interwork], i386, mcore[-elf]{-le|-be}, thumb\n")); + fprintf (file, _(" possible <machine>: arm[_interwork], arm64, i386, mcore[-elf]{-le|-be}, thumb\n")); fprintf (file, _(" -e --output-exp <outname> Generate an export file.\n")); fprintf (file, _(" -l --output-lib <outname> Generate an interface library.\n")); fprintf (file, _(" -y --output-delaylib <outname> Create a delay-import library.\n")); @@ -3967,7 +4015,8 @@ main (int ac, char **av) machine = i; /* Check if we generated PE+. */ - create_for_pep = strcmp (mname, "i386:x86-64") == 0; + create_for_pep = strcmp (mname, "i386:x86-64") == 0 || + strcmp (mname, "arm64") == 0; { /* Check the default underscore */ |