[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