diff --git a/lld/ELF/Arch/AArch64.cpp b/lld/ELF/Arch/AArch64.cpp --- a/lld/ELF/Arch/AArch64.cpp +++ b/lld/ELF/Arch/AArch64.cpp @@ -195,7 +195,7 @@ } void AArch64::writeGotPlt(uint8_t *buf, const Symbol &) const { - write64le(buf, in.plt->getVA()); + write64(buf, in.plt->getVA()); } void AArch64::writePltHeader(uint8_t *buf) const { @@ -323,12 +323,12 @@ case R_AARCH64_ABS16: case R_AARCH64_PREL16: checkIntUInt(loc, val, 16, rel); - write16le(loc, val); + write16(loc, val); break; case R_AARCH64_ABS32: case R_AARCH64_PREL32: checkIntUInt(loc, val, 32, rel); - write32le(loc, val); + write32(loc, val); break; case R_AARCH64_PLT32: checkInt(loc, val, 32, rel); @@ -336,7 +336,7 @@ break; case R_AARCH64_ABS64: case R_AARCH64_PREL64: - write64le(loc, val); + write64(loc, val); break; case R_AARCH64_ADD_ABS_LO12_NC: or32AArch64Imm(loc, val); diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -146,6 +146,7 @@ StringSwitch>(s) .Cases("aarch64elf", "aarch64linux", "aarch64_elf64_le_vec", {ELF64LEKind, EM_AARCH64}) + .Cases("aarch64elfb", "aarch64linuxb", {ELF64BEKind, EM_AARCH64}) .Cases("armelf", "armelf_linux_eabi", {ELF32LEKind, EM_ARM}) .Case("elf32_x86_64", {ELF32LEKind, EM_X86_64}) .Cases("elf32btsmip", "elf32btsmipn32", {ELF32BEKind, EM_MIPS}) diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp --- a/lld/ELF/ScriptParser.cpp +++ b/lld/ELF/ScriptParser.cpp @@ -412,6 +412,7 @@ .Case("elf32-x86-64", {ELF32LEKind, EM_X86_64}) .Case("elf64-aarch64", {ELF64LEKind, EM_AARCH64}) .Case("elf64-littleaarch64", {ELF64LEKind, EM_AARCH64}) + .Case("elf64-bigaarch64", {ELF64BEKind, EM_AARCH64}) .Case("elf32-powerpc", {ELF32BEKind, EM_PPC}) .Case("elf32-powerpcle", {ELF32LEKind, EM_PPC}) .Case("elf64-powerpc", {ELF64BEKind, EM_PPC64}) diff --git a/lld/test/ELF/aarch64-abs16.s b/lld/test/ELF/aarch64-abs16.s --- a/lld/test/ELF/aarch64-abs16.s +++ b/lld/test/ELF/aarch64-abs16.s @@ -3,6 +3,8 @@ // RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs255.s -o %t255.o // RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs256.s -o %t256.o // RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs257.s -o %t257.o +// RUN: llvm-mc -filetype=obj -triple=aarch64_be %s -o %t.be.o +// RUN: llvm-mc -filetype=obj -triple=aarch64_be %S/Inputs/abs256.s -o %t256.be.o .globl _start _start: @@ -12,6 +14,8 @@ // RUN: ld.lld %t.o %t256.o -o %t // RUN: llvm-objdump -s --section=.data %t | FileCheck %s --check-prefixes=CHECK,LE +// RUN: ld.lld %t.be.o %t256.be.o -o %t.be +// RUN: llvm-objdump -s --section=.data %t.be | FileCheck %s --check-prefixes=CHECK,BE // CHECK: Contents of section .data: // 220158: S = 0x100, A = 0xfeff @@ -19,6 +23,7 @@ // 22015c: S = 0x100, A = -0x8100 // S + A = 0x8000 // LE-NEXT: 220158 ffff0080 +// BE-NEXT: 220158 ffff8000 // RUN: not ld.lld %t.o %t255.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=OVERFLOW1 // OVERFLOW1: relocation R_AARCH64_ABS16 out of range: -32769 is not in [-32768, 65535]; references foo diff --git a/lld/test/ELF/aarch64-abs32.s b/lld/test/ELF/aarch64-abs32.s --- a/lld/test/ELF/aarch64-abs32.s +++ b/lld/test/ELF/aarch64-abs32.s @@ -3,6 +3,8 @@ // RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs255.s -o %t255.o // RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs256.s -o %t256.o // RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs257.s -o %t257.o +// RUN: llvm-mc -filetype=obj -triple=aarch64_be %s -o %t.be.o +// RUN: llvm-mc -filetype=obj -triple=aarch64_be %S/Inputs/abs256.s -o %t256.be.o .globl _start _start: @@ -12,6 +14,8 @@ // RUN: ld.lld %t.o %t256.o -o %t // RUN: llvm-objdump -s --section=.data %t | FileCheck %s --check-prefixes=CHECK,LE +// RUN: ld.lld %t.be.o %t256.be.o -o %t.be +// RUN: llvm-objdump -s --section=.data %t.be | FileCheck %s --check-prefixes=CHECK,BE // CHECK: Contents of section .data: // 220158: S = 0x100, A = 0xfffffeff @@ -19,6 +23,7 @@ // 22015c: S = 0x100, A = -0x80000100 // S + A = 0x80000000 // LE-NEXT: 220158 ffffffff 00000080 +// BE-NEXT: 220158 ffffffff 80000000 // RUN: not ld.lld %t.o %t255.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=OVERFLOW1 // OVERFLOW1: relocation R_AARCH64_ABS32 out of range: -2147483649 is not in [-2147483648, 4294967295]; references foo diff --git a/lld/test/ELF/aarch64-data-relocs.s b/lld/test/ELF/aarch64-data-relocs.s --- a/lld/test/ELF/aarch64-data-relocs.s +++ b/lld/test/ELF/aarch64-data-relocs.s @@ -4,6 +4,11 @@ // RUN: ld.lld %t.o %t256.o -o %t // RUN: llvm-objdump -s %t | FileCheck %s --check-prefixes=CHECK,LE +// RUN: llvm-mc -filetype=obj -triple=aarch64_be %s -o %t.be.o +// RUN: llvm-mc -filetype=obj -triple=aarch64_be %S/Inputs/abs256.s -o %t256.be.o +// RUN: ld.lld %t.be.o %t256.be.o -o %t.be +// RUN: llvm-objdump -s %t.be | FileCheck %s --check-prefixes=CHECK,BE + .globl _start _start: .section .R_AARCH64_ABS64, "ax",@progbits @@ -13,6 +18,7 @@ // S + A = 0x124 // CHECK: Contents of section .R_AARCH64_ABS64: // LE-NEXT: 210120 24010000 00000000 +// BE-NEXT: 210120 00000000 00000124 .section .R_AARCH64_PREL64, "ax",@progbits .xword foo - . + 0x24 @@ -20,3 +26,4 @@ // S + A - P = 0x100 + 0x24 - 0x210128 = 0xffffffffffdefffc // CHECK: Contents of section .R_AARCH64_PREL64: // LE-NEXT: 210128 fcffdeff ffffffff +// BE-NEXT: 210128 ffffffff ffdefffc diff --git a/lld/test/ELF/aarch64-prel16.s b/lld/test/ELF/aarch64-prel16.s --- a/lld/test/ELF/aarch64-prel16.s +++ b/lld/test/ELF/aarch64-prel16.s @@ -3,6 +3,8 @@ // RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs255.s -o %t255.o // RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs256.s -o %t256.o // RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs257.s -o %t257.o +// RUN: llvm-mc -filetype=obj -triple=aarch64_be %s -o %t.be.o +// RUN: llvm-mc -filetype=obj -triple=aarch64_be %S/Inputs/abs256.s -o %t256.be.o .globl _start _start: @@ -16,6 +18,8 @@ // if it is already fixed. Then, update addends accordingly. // RUN: ld.lld -z max-page-size=4096 %t.o %t256.o -o %t // RUN: llvm-objdump -s --section=.data %t | FileCheck %s --check-prefixes=CHECK,LE +// RUN: ld.lld -z max-page-size=4096 %t.be.o %t256.be.o -o %t.be +// RUN: llvm-objdump -s --section=.data %t.be | FileCheck %s --check-prefixes=CHECK,BE // CHECK: Contents of section .data: // 202158: S = 0x100, A = 0x212157, P = 0x202158 diff --git a/lld/test/ELF/aarch64-prel32.s b/lld/test/ELF/aarch64-prel32.s --- a/lld/test/ELF/aarch64-prel32.s +++ b/lld/test/ELF/aarch64-prel32.s @@ -3,6 +3,8 @@ // RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs255.s -o %t255.o // RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs256.s -o %t256.o // RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs257.s -o %t257.o +// RUN: llvm-mc -filetype=obj -triple=aarch64_be %s -o %t.be.o +// RUN: llvm-mc -filetype=obj -triple=aarch64_be %S/Inputs/abs256.s -o %t256.be.o .globl _start _start: @@ -16,6 +18,8 @@ // if it is already fixed. Then, update addends accordingly. // RUN: ld.lld -z max-page-size=4096 %t.o %t256.o -o %t // RUN: llvm-objdump -s --section=.data %t | FileCheck %s --check-prefixes=CHECK,LE +// RUN: ld.lld -z max-page-size=4096 %t.be.o %t256.be.o -o %t.be +// RUN: llvm-objdump -s --section=.data %t.be | FileCheck %s --check-prefixes=CHECK,BE // CHECK: Contents of section .data: // 202158: S = 0x100, A = 0x100202057, P = 0x202158 @@ -23,6 +27,7 @@ // 20215c: S = 0x100, A = -0x7fdfdfa4, P = 0x20215c // S + A - P = 0x80000000 // LE-NEXT: 202158 ffffffff 00000080 +// BE-NEXT: 202158 ffffffff 80000000 // RUN: not ld.lld -z max-page-size=4096 %t.o %t255.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=OVERFLOW1 // OVERFLOW1: relocation R_AARCH64_PREL32 out of range: -2147483649 is not in [-2147483648, 4294967295]; references foo diff --git a/lld/test/ELF/emulation-aarch64.s b/lld/test/ELF/emulation-aarch64.s --- a/lld/test/ELF/emulation-aarch64.s +++ b/lld/test/ELF/emulation-aarch64.s @@ -12,11 +12,23 @@ # RUN: ld.lld -m aarch64_elf64_le_vec %t.o -o %taosp # RUN: llvm-readobj --file-headers %taosp | FileCheck --check-prefixes=AARCH64,LE %s +# RUN: llvm-mc -filetype=obj -triple=aarch64_be %s -o %t.be.o +# RUN: ld.lld %t.be.o -o %t +# RUN: llvm-readobj --file-headers %t | FileCheck --check-prefixes=AARCH64,BE %s +# RUN: ld.lld -m aarch64linuxb %t.be.o -o %t1.be +# RUN: llvm-readobj --file-headers %t1.be | FileCheck --check-prefixes=AARCH64,BE %s +# RUN: ld.lld -m aarch64elfb %t.be.o -o %t2.be +# RUN: llvm-readobj --file-headers %t2.be | FileCheck --check-prefixes=AARCH64,BE %s +# RUN: echo 'OUTPUT_FORMAT(elf64-bigaarch64)' > %t.script +# RUN: ld.lld %t.script %t.be.o -o %t3.be +# RUN: llvm-readobj --file-headers %t3.be | FileCheck --check-prefixes=AARCH64,BE %s + # AARCH64: ElfHeader { # AARCH64-NEXT: Ident { # AARCH64-NEXT: Magic: (7F 45 4C 46) # AARCH64-NEXT: Class: 64-bit (0x2) # LE-NEXT: DataEncoding: LittleEndian (0x1) +# BE-NEXT: DataEncoding: BigEndian (0x2) # AARCH64-NEXT: FileVersion: 1 # AARCH64-NEXT: OS/ABI: SystemV (0x0) # AARCH64-NEXT: ABIVersion: 0