diff --git a/lld/COFF/Chunks.cpp b/lld/COFF/Chunks.cpp --- a/lld/COFF/Chunks.cpp +++ b/lld/COFF/Chunks.cpp @@ -482,6 +482,8 @@ case AMD64: if (rel.Type == IMAGE_REL_AMD64_ADDR64) return IMAGE_REL_BASED_DIR64; + if (rel.Type == IMAGE_REL_AMD64_ADDR32) + return IMAGE_REL_BASED_HIGHLOW; return IMAGE_REL_BASED_ABSOLUTE; case I386: if (rel.Type == IMAGE_REL_I386_DIR32) diff --git a/lld/test/COFF/reloc-x64-add32.s b/lld/test/COFF/reloc-x64-add32.s new file mode 100644 --- /dev/null +++ b/lld/test/COFF/reloc-x64-add32.s @@ -0,0 +1,42 @@ +# REQUIRES: x86 +# RUN: llvm-mc %s -filetype=obj -o %t.obj -triple=x86_64-windows-msvc +# RUN: lld-link /entry:main /out:%t.exe /LARGEADDRESSAWARE:NO %t.obj +# RUN: llvm-readobj --coff-basereloc %t.exe | FileCheck %s --check-prefix=CHECKPASS + +# This test case checks that the "ADDR32" relocation symbol is collected +# when linking a 64bit executable, and the output contains the HIGHLOW +# relocated symbol. + +# Check that the HIGHLOW relocation base type is in the generated executable +# CHECKPASS: Format: COFF-x86-64 +# CHECKPASS: Arch: x86_64 +# CHECKPASS: AddressSize: 64bit +# CHECKPASS: BaseReloc +# CHECKPASS: Entry { +# CHECKPASS-NEXT: Type: HIGHLOW + + .text + .def main; + .scl 2; + .type 32; + .endef + .intel_syntax noprefix + .globl main + .p2align 4, 0x90 + +main: # @main + sub rsp, 40 + + mov dword ptr [rip + arr + 24], 7 + + mov eax, 1 + mov ecx, 20 + mov eax, dword ptr [rcx + 4 * rax + arr] + + ret + + .globl arr + .p2align 4 +arr: + .zero 40 +