[lld] [LLD] [COFF] Set the right alignment for DelayDirectoryChunk (PR #84697)
Martin Storsjö via llvm-commits
llvm-commits at lists.llvm.org
Sun Mar 10 15:16:38 PDT 2024
https://github.com/mstorsjo created https://github.com/llvm/llvm-project/pull/84697
This makes a difference when linking executables with delay loaded libraries for arm32; the delay loader implementation can load data from the registry with instructions that assume alignment.
This issue does not show up when linking in MinGW mode, because a PseudoRelocTableChunk gets injected, which also sets alignment, even if the chunk itself is empty.
>From f923d9fff8b130fada835e06e0ab680dab3f32c9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <martin at martin.st>
Date: Sun, 10 Mar 2024 19:26:46 +0200
Subject: [PATCH] [LLD] [COFF] Set the right alignment for DelayDirectoryChunk
This makes a difference when linking executables with delay loaded
libraries for arm32, in MSVC mode. (In MinGW mode, a
PseudoRelocTableChunk gets injected, which fixes the alignment even
if it is empty.)
---
lld/COFF/DLL.cpp | 2 +-
lld/test/COFF/delayimports-armnt.yaml | 25 +++++++++++++++++++------
2 files changed, 20 insertions(+), 7 deletions(-)
diff --git a/lld/COFF/DLL.cpp b/lld/COFF/DLL.cpp
index d0b74ac445499a..5f00eaded76d3a 100644
--- a/lld/COFF/DLL.cpp
+++ b/lld/COFF/DLL.cpp
@@ -172,7 +172,7 @@ binImports(COFFLinkerContext &ctx,
// A chunk for the delay import descriptor table etnry.
class DelayDirectoryChunk : public NonSectionChunk {
public:
- explicit DelayDirectoryChunk(Chunk *n) : dllName(n) {}
+ explicit DelayDirectoryChunk(Chunk *n) : dllName(n) { setAlignment(4); }
size_t getSize() const override {
return sizeof(delay_import_directory_table_entry);
diff --git a/lld/test/COFF/delayimports-armnt.yaml b/lld/test/COFF/delayimports-armnt.yaml
index 7d9bc38c5c3606..ea96d864ef53d5 100644
--- a/lld/test/COFF/delayimports-armnt.yaml
+++ b/lld/test/COFF/delayimports-armnt.yaml
@@ -6,6 +6,7 @@
# RUN: llvm-readobj --coff-imports %t.exe | FileCheck -check-prefix=IMPORT %s
# RUN: llvm-readobj --coff-basereloc %t.exe | FileCheck -check-prefix=BASEREL %s
# RUN: llvm-objdump --no-print-imm-hex -d %t.exe | FileCheck --check-prefix=DISASM %s
+# RUN: llvm-readobj --file-headers %t.exe | FileCheck -check-prefix=DIR %s
# IMPORT: Format: COFF-ARM
# IMPORT-NEXT: Arch: thumb
@@ -13,9 +14,9 @@
# IMPORT-NEXT: DelayImport {
# IMPORT-NEXT: Name: library.dll
# IMPORT-NEXT: Attributes: 0x1
-# IMPORT-NEXT: ModuleHandle: 0x3000
-# IMPORT-NEXT: ImportAddressTable: 0x3008
-# IMPORT-NEXT: ImportNameTable: 0x2040
+# IMPORT-NEXT: ModuleHandle: 0x3008
+# IMPORT-NEXT: ImportAddressTable: 0x3010
+# IMPORT-NEXT: ImportNameTable: 0x2044
# IMPORT-NEXT: BoundDelayImportTable: 0x0
# IMPORT-NEXT: UnloadDelayImportTable: 0x0
# IMPORT-NEXT: Import {
@@ -43,7 +44,7 @@
# BASEREL-NEXT: }
# BASEREL-NEXT: Entry {
# BASEREL-NEXT: Type: HIGHLOW
-# BASEREL-NEXT: Address: 0x3008
+# BASEREL-NEXT: Address: 0x3010
# BASEREL-NEXT: }
# BASEREL-NEXT: Entry {
# BASEREL-NEXT: Type: ABSOLUTE
@@ -52,20 +53,24 @@
# BASEREL-NEXT: ]
#
# DISASM: 00401000 <.text>:
-# DISASM: 40100c: f243 0c08 movw r12, #12296
+# DISASM: 40100c: f243 0c10 movw r12, #12304
# DISASM-NEXT: f2c0 0c40 movt r12, #64
# DISASM-NEXT: f000 b800 b.w {{.+}} @ imm = #0
# DISASM-NEXT: e92d 480f push.w {r0, r1, r2, r3, r11, lr}
# DISASM-NEXT: f20d 0b10 addw r11, sp, #16
# DISASM-NEXT: ed2d 0b10 vpush {d0, d1, d2, d3, d4, d5, d6, d7}
# DISASM-NEXT: 4661 mov r1, r12
-# DISASM-NEXT: f242 0000 movw r0, #8192
+# DISASM-NEXT: f242 0004 movw r0, #8196
# DISASM-NEXT: f2c0 0040 movt r0, #64
# DISASM-NEXT: f7ff ffe7 bl 0x401000 <.text>
# DISASM-NEXT: 4684 mov r12, r0
# DISASM-NEXT: ecbd 0b10 vpop {d0, d1, d2, d3, d4, d5, d6, d7}
# DISASM-NEXT: e8bd 480f pop.w {r0, r1, r2, r3, r11, lr}
# DISASM-NEXT: 4760 bx r12
+#
+# DIR: DelayImportDescriptorRVA: 0x2004
+# DIR-NEXT: DelayImportDescriptorSize: 0x40
+
--- !COFF
header:
@@ -80,6 +85,14 @@ sections:
- VirtualAddress: 0
SymbolName: __imp_function
Type: IMAGE_REL_ARM_MOV32T
+ - Name: .rdata
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
+ Alignment: 1
+ SectionData: 01
+ - Name: .data
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
+ Alignment: 1
+ SectionData: 02
symbols:
- Name: .text
Value: 0
More information about the llvm-commits
mailing list