[lld] 4fb131b - [LLD][COFF] PR49068: Include the IMAGE_REL_BASED_HIGHLOW relocation base type when the machine is 64 bits and the relocation type is ADDR32

Martin Storsjö via llvm-commits llvm-commits at lists.llvm.org
Fri May 21 13:46:06 PDT 2021


Author: Axel Y. Rivera
Date: 2021-05-21T23:45:55+03:00
New Revision: 4fb131b49795ea11f7f56af1f4896fb6996faf0f

URL: https://github.com/llvm/llvm-project/commit/4fb131b49795ea11f7f56af1f4896fb6996faf0f
DIFF: https://github.com/llvm/llvm-project/commit/4fb131b49795ea11f7f56af1f4896fb6996faf0f.diff

LOG: [LLD][COFF] PR49068: Include the IMAGE_REL_BASED_HIGHLOW relocation base type when the machine is 64 bits and the relocation type is ADDR32

The COFF driver produces an ABSOLUTE relocation base for an ADDR32
relocation type and the system is 64 bits (machine=AMD64). The
relocation information won't be added in the output and could
produce an incorrect address access during run-time. This change
set checks if the relocation type is IMAGE_REL_AMD64_ADDR32 and
if so, adds the relocated symbol as IMAGE_REL_BASED_HIGHLOW base.

Differential Revision: https://reviews.llvm.org/D96619

Added: 
    lld/test/COFF/reloc-x64-add32.s

Modified: 
    lld/COFF/Chunks.cpp

Removed: 
    


################################################################################
diff  --git a/lld/COFF/Chunks.cpp b/lld/COFF/Chunks.cpp
index f344df0423176..ec64f650ad7a5 100644
--- a/lld/COFF/Chunks.cpp
+++ b/lld/COFF/Chunks.cpp
@@ -482,6 +482,8 @@ static uint8_t getBaserelType(const coff_relocation &rel) {
   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
index 0000000000000..f263833284807
--- /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
+


        


More information about the llvm-commits mailing list