Skip to content

Commit c8c3fe7

Browse files
authored
[LLD][COFF] Align import directory chunk. (#80014)
The loader can usually handle an unaligned import dir chunk, but It's not optimal and it's not what MSVC link.exe does. Windows refuses to load ARM64X binaries with unaligned import directory. aarch64 and arm64ec imports are shared in such binaries as much as possible. As long as they use the same set of functions from given import directory, both the directory and import addresses chunk are just shared. When used set of functions differs, ARM64X dynamic relocations are used to modify import dir to point to different names and import addresses for its EC view. I suspect that the loader expects some alignment on ARM64X dynamic relocation offset and may not be the case when relocated import dir is not aligned.
1 parent 86cd2fb commit c8c3fe7

File tree

3 files changed

+9
-4
lines changed

3 files changed

+9
-4
lines changed

lld/COFF/DLL.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ class OrdinalOnlyChunk : public NonSectionChunk {
110110
// A chunk for the import descriptor table.
111111
class ImportDirectoryChunk : public NonSectionChunk {
112112
public:
113-
explicit ImportDirectoryChunk(Chunk *n) : dllName(n) {}
113+
explicit ImportDirectoryChunk(Chunk *n) : dllName(n) { setAlignment(4); }
114114
size_t getSize() const override { return sizeof(ImportDirectoryTableEntry); }
115115

116116
void writeTo(uint8_t *buf) const override {

lld/test/COFF/imports.test

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,8 @@ MERGE-NEXT: Symbol: ExitProcess (0)
4848
MERGE-NEXT: Symbol: (50)
4949
MERGE-NEXT: Symbol: MessageBoxA (1)
5050
MERGE-NEXT: }
51+
52+
# Verify that import table is properly aligned.
53+
# RUN: llvm-readobj --headers %t.exe | FileCheck -check-prefix=IMPORTDIR %s
54+
IMPORTDIR: ImportTableRVA: 0x1068
55+
IMPORTDIR-NEXT: ImportTableSize: 0x28

lld/test/COFF/pdb-publics-import.test

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ CHECK-NEXT: characteristics =
115115
CHECK-NEXT: initialized data
116116
CHECK-NEXT: read permissions
117117
CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$2`
118-
CHECK-NEXT: length = 40, addr = 0002:0061
118+
CHECK-NEXT: length = 40, addr = 0002:0064
119119
CHECK-NEXT: characteristics =
120120
CHECK-NEXT: initialized data
121121
CHECK-NEXT: read permissions
@@ -162,9 +162,9 @@ CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0000, size = 28, data crc = 0, reloc c
162162
CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
163163
CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0028, size = 33, data crc = 0, reloc crc = 0
164164
CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
165-
CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0061, size = 20, data crc = 0, reloc crc = 0
165+
CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0064, size = 20, data crc = 0, reloc crc = 0
166166
CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
167-
CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0081, size = 20, data crc = 0, reloc crc = 0
167+
CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0084, size = 20, data crc = 0, reloc crc = 0
168168
CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
169169
CHECK-NEXT: SC[.rdata] | mod = 3, 0002:0104, size = 8, data crc = 0, reloc crc = 0
170170
CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ

0 commit comments

Comments
 (0)