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

Axel Y. Rivera via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 12 10:47:10 PST 2021


ayrivera created this revision.
ayrivera added reviewers: andrew.w.kaylor, rnk, ruiu, pengfei.
ayrivera requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

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.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D96619

Files:
  lld/COFF/Chunks.cpp
  lld/test/COFF/reloc-x64-add32.s


Index: lld/test/COFF/reloc-x64-add32.s
===================================================================
--- /dev/null
+++ lld/test/COFF/reloc-x64-add32.s
@@ -0,0 +1,42 @@
+# REQUIRES: x86, system-windows
+# 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
+
Index: lld/COFF/Chunks.cpp
===================================================================
--- lld/COFF/Chunks.cpp
+++ lld/COFF/Chunks.cpp
@@ -424,6 +424,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)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D96619.323392.patch
Type: text/x-patch
Size: 1684 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210212/6d0b6c4b/attachment.bin>


More information about the llvm-commits mailing list