From: Ed Schouten Date: Thu, 29 Oct 2015 13:49:03 +0000 (+0000) Subject: Add support for AArch64 CloudABI binaries. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a75cf613fd7d0a48d526a996ff5c250c599d3ab7;p=binutils-gdb.git Add support for AArch64 CloudABI binaries. ld * Makefile.am (ALL_64_EMULATION_SOURCES): Add support for CloudABI on aarch64. For this target we have to make sure we use ELFOSABI_CLOUDABI instead of ELFOSABI_NONE. * configure.tgt (targ_emul): Likewise. * emulparams/aarch64cloudabi.sh: New file. * emulparams/aarch64cloudabib.sh: New file. * Makefile.in: Regenerate. bfd * config.bfd (targ_defvec): Add support for CloudABI on aarch64. For this target we have to make sure we use ELFOSABI_CLOUDABI instead of ELFOSABI_NONE. * configure.ac (tb): Likewise. * elfnn-aarch64.c: Likewise. * targets.c (_bfd_target_vector): Likewise. * configure: Regenerate. gas * config/tc-aarch64.c (elf64_aarch64_target_format): Select the cloudabi format if the TARGET_OS is cloudabi. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index cedceadecb7..41cfcbe2342 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2015-10-29 Ed Schouten + + * config.bfd (targ_defvec): Add support for CloudABI on aarch64. + For this target we have to make sure we use ELFOSABI_CLOUDABI + instead of ELFOSABI_NONE. + * configure.ac (tb): Likewise. + * elfnn-aarch64.c: Likewise. + * targets.c (_bfd_target_vector): Likewise. + * configure: Regenerate. + 2015-10-29 Pedro Alves * libhppa.h (bfd_hppa_insn2fmt): Add cast. diff --git a/bfd/config.bfd b/bfd/config.bfd index fe43153a7cf..c5688cb0671 100644 --- a/bfd/config.bfd +++ b/bfd/config.bfd @@ -184,6 +184,11 @@ case "${targ}" in targ_selvecs="aarch64_elf64_be_vec arm_elf32_le_vec arm_elf32_be_vec" want64=true ;; + aarch64-*-cloudabi*) + targ_defvec=aarch64_elf64_le_cloudabi_vec + targ_selvecs=aarch64_elf64_be_cloudabi_vec + want64=true + ;; aarch64-*-linux*) targ_defvec=aarch64_elf64_le_vec targ_selvecs="aarch64_elf64_be_vec aarch64_elf32_le_vec aarch64_elf32_be_vec arm_elf32_le_vec arm_elf32_be_vec" diff --git a/bfd/configure b/bfd/configure index 0308aa5bdad..58388fe3085 100755 --- a/bfd/configure +++ b/bfd/configure @@ -15250,7 +15250,9 @@ do aarch64_elf32_be_vec) tb="$tb elf32-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf32.lo $elf"; target_size=64 ;; aarch64_elf32_le_vec) tb="$tb elf32-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf32.lo $elf"; target_size=64 ;; aarch64_elf64_be_vec) tb="$tb elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; + aarch64_elf64_be_cloudabi_vec) tb="$tb elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; aarch64_elf64_le_vec) tb="$tb elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; + aarch64_elf64_le_cloudabi_vec) tb="$tb elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo $elf"; 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/configure.ac b/bfd/configure.ac index cc446e1bb8f..6f5e85f3a6f 100644 --- a/bfd/configure.ac +++ b/bfd/configure.ac @@ -695,8 +695,10 @@ do # use one entry per line, even though this leads to long lines. aarch64_elf32_be_vec) tb="$tb elf32-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf32.lo $elf"; target_size=64 ;; aarch64_elf32_le_vec) tb="$tb elf32-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf32.lo $elf"; target_size=64 ;; - aarch64_elf64_be_vec) tb="$tb elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; - aarch64_elf64_le_vec) tb="$tb elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; + aarch64_elf64_be_vec) tb="$tb elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; + aarch64_elf64_be_cloudabi_vec) tb="$tb elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; + aarch64_elf64_le_vec) tb="$tb elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;; + aarch64_elf64_le_cloudabi_vec) tb="$tb elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo $elf"; 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/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index f3489d53814..5558bf70a4d 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -9385,3 +9385,22 @@ const struct elf_size_info elfNN_aarch64_size_info = #define elf_backend_obj_attrs_section ".ARM.attributes" #include "elfNN-target.h" + +/* CloudABI support. */ + +#undef TARGET_LITTLE_SYM +#define TARGET_LITTLE_SYM aarch64_elfNN_le_cloudabi_vec +#undef TARGET_LITTLE_NAME +#define TARGET_LITTLE_NAME "elfNN-littleaarch64-cloudabi" +#undef TARGET_BIG_SYM +#define TARGET_BIG_SYM aarch64_elfNN_be_cloudabi_vec +#undef TARGET_BIG_NAME +#define TARGET_BIG_NAME "elfNN-bigaarch64-cloudabi" + +#undef ELF_OSABI +#define ELF_OSABI ELFOSABI_CLOUDABI + +#undef elfNN_bed +#define elfNN_bed elfNN_aarch64_cloudabi_bed + +#include "elfNN-target.h" diff --git a/bfd/targets.c b/bfd/targets.c index 19469bc448c..51f2198c130 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -568,7 +568,9 @@ to find an alternative output format that is suitable. extern const bfd_target aarch64_elf32_be_vec; extern const bfd_target aarch64_elf32_le_vec; extern const bfd_target aarch64_elf64_be_vec; +extern const bfd_target aarch64_elf64_be_cloudabi_vec; extern const bfd_target aarch64_elf64_le_vec; +extern const bfd_target aarch64_elf64_le_cloudabi_vec; extern const bfd_target alpha_ecoff_le_vec; extern const bfd_target alpha_elf64_vec; extern const bfd_target alpha_elf64_fbsd_vec; @@ -948,7 +950,9 @@ static const bfd_target * const _bfd_target_vector[] = &aarch64_elf32_be_vec, &aarch64_elf32_le_vec, &aarch64_elf64_be_vec, + &aarch64_elf64_be_cloudabi_vec, &aarch64_elf64_le_vec, + &aarch64_elf64_le_cloudabi_vec, #endif #ifdef BFD64 diff --git a/gas/ChangeLog b/gas/ChangeLog index 1df8a1d1f4d..af1540cf3ec 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2015-10-29 Nick Clifton + + * config/tc-aarch64.c (elf64_aarch64_target_format): Select the + cloudabi format if the TARGET_OS is cloudabi. + 2015-10-29 Thomas Preud'homme * config/tc-arm.c (insns): Guard cps by arm_ext_v6_notm instead of diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index 81b8e2db7e4..2cc7b4bd262 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -7309,6 +7309,11 @@ aarch64_force_relocation (struct fix *fixp) const char * elf64_aarch64_target_format (void) { + if (strcmp (TARGET_OS, "cloudabi") == 0) + { + /* FIXME: What to do for ilp32_p ? */ + return target_big_endian ? "elf64-bigaarch64-cloudabi" : "elf64-littleaarch64-cloudabi"; + } if (target_big_endian) return ilp32_p ? "elf32-bigaarch64" : "elf64-bigaarch64"; else diff --git a/ld/ChangeLog b/ld/ChangeLog index da2227c5c79..31ef37da1af 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,13 @@ +2015-10-29 Ed Schouten + + * Makefile.am (ALL_64_EMULATION_SOURCES): Add support for + CloudABI on aarch64. For this target we have to make sure we use + ELFOSABI_CLOUDABI instead of ELFOSABI_NONE. + * configure.tgt (targ_emul): Likewise. + * emulparams/aarch64cloudabi.sh: New file. + * emulparams/aarch64cloudabib.sh: New file. + * Makefile.in: Regenerate. + 2015-10-29 Nick Clifton PR ld/19146 diff --git a/ld/Makefile.am b/ld/Makefile.am index 3f9546b9aa0..0b3b04927c1 100644 --- a/ld/Makefile.am +++ b/ld/Makefile.am @@ -435,6 +435,8 @@ ALL_64_EMULATION_SOURCES = \ eaarch64elf32.c \ eaarch64elfb.c \ eaarch64elf32b.c \ + eaarch64cloudabi.c \ + eaarch64cloudabib.c \ eaarch64fbsd.c \ eaarch64fbsdb.c \ eaarch64linux.c \ @@ -1618,6 +1620,14 @@ eaarch64elf32b.c: $(srcdir)/emulparams/aarch64elf32b.sh $(srcdir)/emulparams/aar $(ELF_DEPS) $(srcdir)/emultempl/aarch64elf.em \ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} +eaarch64cloudabi.c: $(srcdir)/emulparams/aarch64cloudabi.sh \ + $(ELF_DEPS) $(srcdir)/emultempl/aarch64elf.em \ + $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} + +eaarch64cloudabib.c: $(srcdir)/emulparams/aarch64cloudabib.sh $(srcdir)/emulparams/aarch64cloudabi.sh \ + $(ELF_DEPS) $(srcdir)/emultempl/aarch64elf.em \ + $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} + eaarch64fbsd.c: $(srcdir)/emulparams/aarch64fbsd.sh \ $(ELF_DEPS) $(srcdir)/emultempl/aarch64elf.em \ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} diff --git a/ld/Makefile.in b/ld/Makefile.in index 9237ff034e7..f7992161fcd 100644 --- a/ld/Makefile.in +++ b/ld/Makefile.in @@ -764,6 +764,8 @@ ALL_64_EMULATION_SOURCES = \ eaarch64elf32.c \ eaarch64elfb.c \ eaarch64elf32b.c \ + eaarch64cloudabi.c \ + eaarch64cloudabib.c \ eaarch64fbsd.c \ eaarch64fbsdb.c \ eaarch64linux.c \ @@ -3122,6 +3124,14 @@ eaarch64elf32b.c: $(srcdir)/emulparams/aarch64elf32b.sh $(srcdir)/emulparams/aar $(ELF_DEPS) $(srcdir)/emultempl/aarch64elf.em \ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} +eaarch64cloudabi.c: $(srcdir)/emulparams/aarch64cloudabi.sh \ + $(ELF_DEPS) $(srcdir)/emultempl/aarch64elf.em \ + $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} + +eaarch64cloudabib.c: $(srcdir)/emulparams/aarch64cloudabib.sh $(srcdir)/emulparams/aarch64cloudabi.sh \ + $(ELF_DEPS) $(srcdir)/emultempl/aarch64elf.em \ + $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} + eaarch64fbsd.c: $(srcdir)/emulparams/aarch64fbsd.sh \ $(ELF_DEPS) $(srcdir)/emultempl/aarch64elf.em \ $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} diff --git a/ld/configure.tgt b/ld/configure.tgt index 197f13e4ba5..6b6bbf25771 100644 --- a/ld/configure.tgt +++ b/ld/configure.tgt @@ -49,6 +49,8 @@ aarch64_be-*-elf) targ_emul=aarch64elfb targ_extra_emuls="aarch64elf aarch64elf32 aarch64elf32b armelfb armelf" ;; aarch64-*-elf) targ_emul=aarch64elf targ_extra_emuls="aarch64elf32 aarch64elf32b aarch64elfb armelf armelfb" ;; +aarch64-*-cloudabi*) targ_emul=aarch64cloudabi + targ_extra_emuls=aarch64cloudabib ;; aarch64-*-freebsd*) targ_emul=aarch64fbsd targ_extra_emuls="aarch64fbsdb aarch64elf" ;; aarch64_be-*-linux*) targ_emul=aarch64linuxb diff --git a/ld/emulparams/aarch64cloudabi.sh b/ld/emulparams/aarch64cloudabi.sh new file mode 100644 index 00000000000..88263e5359b --- /dev/null +++ b/ld/emulparams/aarch64cloudabi.sh @@ -0,0 +1,37 @@ +ARCH=aarch64 +MACHINE= +NOP=0 + +SCRIPT_NAME=elf +ELFSIZE=64 +OUTPUT_FORMAT="elf64-littleaarch64-cloudabi" +BIG_OUTPUT_FORMAT="elf64-bigaarch64-cloudabi" +LITTLE_OUTPUT_FORMAT="elf64-littleaarch64-cloudabi" +NO_REL_RELOCS=yes + +TEMPLATE_NAME=elf32 +EXTRA_EM_FILE=aarch64elf + +GENERATE_SHLIB_SCRIPT=yes +GENERATE_PIE_SCRIPT=yes + +MAXPAGESIZE="CONSTANT (MAXPAGESIZE)" +COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)" +SEPARATE_GOTPLT=24 +IREL_IN_PLT= + +TEXT_START_ADDR=0x400000 + +DATA_START_SYMBOLS='PROVIDE (__data_start = .);'; + +# AArch64 does not support .s* sections. +NO_SMALL_DATA=yes + +OTHER_BSS_SYMBOLS='__bss_start__ = .;' +OTHER_BSS_END_SYMBOLS='_bss_end__ = . ; __bss_end__ = . ;' +OTHER_END_SYMBOLS='__end__ = . ;' + +OTHER_SECTIONS='.note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }' +ATTRS_SECTIONS='.ARM.attributes 0 : { KEEP (*(.ARM.attributes)) KEEP (*(.gnu.attributes)) }' +# Ensure each PLT entry is aligned to a cache line. +PLT=".plt ${RELOCATING-0} : ALIGN(16) { *(.plt)${IREL_IN_PLT+ *(.iplt)} }" diff --git a/ld/emulparams/aarch64cloudabib.sh b/ld/emulparams/aarch64cloudabib.sh new file mode 100644 index 00000000000..909d0f3757e --- /dev/null +++ b/ld/emulparams/aarch64cloudabib.sh @@ -0,0 +1,2 @@ +. ${srcdir}/emulparams/aarch64cloudabi.sh +OUTPUT_FORMAT="elf64-bigaarch64-cloudabi"