[lld] c8c3fe7 - [LLD][COFF] Align import directory chunk. (#80014)

via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 30 15:51:52 PST 2024


Author: Jacek Caban
Date: 2024-01-31T00:51:48+01:00
New Revision: c8c3fe70ae09a48408ee15a256e52a4624e0291c

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

LOG: [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.

Added: 
    

Modified: 
    lld/COFF/DLL.cpp
    lld/test/COFF/imports.test
    lld/test/COFF/pdb-publics-import.test

Removed: 
    


################################################################################
diff  --git a/lld/COFF/DLL.cpp b/lld/COFF/DLL.cpp
index 6b516d8c6d5ef..d0b74ac445499 100644
--- a/lld/COFF/DLL.cpp
+++ b/lld/COFF/DLL.cpp
@@ -110,7 +110,7 @@ class OrdinalOnlyChunk : public NonSectionChunk {
 // A chunk for the import descriptor table.
 class ImportDirectoryChunk : public NonSectionChunk {
 public:
-  explicit ImportDirectoryChunk(Chunk *n) : dllName(n) {}
+  explicit ImportDirectoryChunk(Chunk *n) : dllName(n) { setAlignment(4); }
   size_t getSize() const override { return sizeof(ImportDirectoryTableEntry); }
 
   void writeTo(uint8_t *buf) const override {

diff  --git a/lld/test/COFF/imports.test b/lld/test/COFF/imports.test
index 390626bb782a2..b6464364b2401 100644
--- a/lld/test/COFF/imports.test
+++ b/lld/test/COFF/imports.test
@@ -48,3 +48,8 @@ MERGE-NEXT:   Symbol: ExitProcess (0)
 MERGE-NEXT:   Symbol:  (50)
 MERGE-NEXT:   Symbol: MessageBoxA (1)
 MERGE-NEXT: }
+
+# Verify that import table is properly aligned.
+# RUN: llvm-readobj --headers %t.exe | FileCheck -check-prefix=IMPORTDIR %s
+IMPORTDIR:      ImportTableRVA: 0x1068
+IMPORTDIR-NEXT: ImportTableSize: 0x28

diff  --git a/lld/test/COFF/pdb-publics-import.test b/lld/test/COFF/pdb-publics-import.test
index 83f087b662186..3f3ab3662f8f1 100644
--- a/lld/test/COFF/pdb-publics-import.test
+++ b/lld/test/COFF/pdb-publics-import.test
@@ -115,7 +115,7 @@ CHECK-NEXT:          characteristics =
 CHECK-NEXT:            initialized data
 CHECK-NEXT:            read permissions
 CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$2`
-CHECK-NEXT:          length = 40, addr = 0002:0061
+CHECK-NEXT:          length = 40, addr = 0002:0064
 CHECK-NEXT:          characteristics =
 CHECK-NEXT:            initialized data
 CHECK-NEXT:            read permissions
@@ -162,9 +162,9 @@ CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0000, size = 28, data crc = 0, reloc c
 CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
 CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0028, size = 33, data crc = 0, reloc crc = 0
 CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
-CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0061, size = 20, data crc = 0, reloc crc = 0
+CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0064, size = 20, data crc = 0, reloc crc = 0
 CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
-CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0081, size = 20, data crc = 0, reloc crc = 0
+CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0084, size = 20, data crc = 0, reloc crc = 0
 CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
 CHECK-NEXT:   SC[.rdata]  | mod = 3, 0002:0104, size = 8, data crc = 0, reloc crc = 0
 CHECK-NEXT:                 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ


        


More information about the llvm-commits mailing list