@@ -150,7 +150,7 @@ namespace {
150
150
class ObjectFactory {
151
151
using u16 = support::ulittle16_t ;
152
152
using u32 = support::ulittle32_t ;
153
- MachineTypes Machine ;
153
+ MachineTypes NativeMachine ;
154
154
BumpPtrAllocator Alloc;
155
155
StringRef ImportName;
156
156
StringRef Library;
@@ -159,7 +159,7 @@ class ObjectFactory {
159
159
160
160
public:
161
161
ObjectFactory (StringRef S, MachineTypes M)
162
- : Machine (M), ImportName(S), Library(llvm::sys::path::stem(S)),
162
+ : NativeMachine (M), ImportName(S), Library(llvm::sys::path::stem(S)),
163
163
ImportDescriptorSymbolName ((" __IMPORT_DESCRIPTOR_" + Library).str()),
164
164
NullThunkSymbolName((" \x7f " + Library + " _NULL_THUNK_DATA" ).str()) {}
165
165
@@ -182,10 +182,14 @@ class ObjectFactory {
182
182
// Create a short import file which is described in PE/COFF spec 7. Import
183
183
// Library Format.
184
184
NewArchiveMember createShortImport (StringRef Sym, uint16_t Ordinal,
185
- ImportType Type, ImportNameType NameType);
185
+ ImportType Type, ImportNameType NameType,
186
+ MachineTypes Machine);
186
187
187
188
// Create a weak external file which is described in PE/COFF Aux Format 3.
188
- NewArchiveMember createWeakExternal (StringRef Sym, StringRef Weak, bool Imp);
189
+ NewArchiveMember createWeakExternal (StringRef Sym, StringRef Weak, bool Imp,
190
+ MachineTypes Machine);
191
+
192
+ bool is64Bit () const { return COFF::is64Bit (NativeMachine); }
189
193
};
190
194
} // namespace
191
195
@@ -197,7 +201,7 @@ ObjectFactory::createImportDescriptor(std::vector<uint8_t> &Buffer) {
197
201
198
202
// COFF Header
199
203
coff_file_header Header{
200
- u16 (Machine ),
204
+ u16 (NativeMachine ),
201
205
u16 (NumberOfSections),
202
206
u32 (0 ),
203
207
u32 (sizeof (Header) + (NumberOfSections * sizeof (coff_section)) +
@@ -208,7 +212,7 @@ ObjectFactory::createImportDescriptor(std::vector<uint8_t> &Buffer) {
208
212
(ImportName.size () + 1 )),
209
213
u32 (NumberOfSymbols),
210
214
u16 (0 ),
211
- u16 (is64Bit (Machine ) ? C_Invalid : IMAGE_FILE_32BIT_MACHINE),
215
+ u16 (is64Bit () ? C_Invalid : IMAGE_FILE_32BIT_MACHINE),
212
216
};
213
217
append (Buffer, Header);
214
218
@@ -250,11 +254,11 @@ ObjectFactory::createImportDescriptor(std::vector<uint8_t> &Buffer) {
250
254
251
255
const coff_relocation RelocationTable[NumberOfRelocations] = {
252
256
{u32 (offsetof (coff_import_directory_table_entry, NameRVA)), u32 (2 ),
253
- u16 (getImgRelRelocation (Machine ))},
257
+ u16 (getImgRelRelocation (NativeMachine ))},
254
258
{u32 (offsetof (coff_import_directory_table_entry, ImportLookupTableRVA)),
255
- u32 (3 ), u16 (getImgRelRelocation (Machine ))},
259
+ u32 (3 ), u16 (getImgRelRelocation (NativeMachine ))},
256
260
{u32 (offsetof (coff_import_directory_table_entry, ImportAddressTableRVA)),
257
- u32 (4 ), u16 (getImgRelRelocation (Machine ))},
261
+ u32 (4 ), u16 (getImgRelRelocation (NativeMachine ))},
258
262
};
259
263
append (Buffer, RelocationTable);
260
264
@@ -336,15 +340,15 @@ ObjectFactory::createNullImportDescriptor(std::vector<uint8_t> &Buffer) {
336
340
337
341
// COFF Header
338
342
coff_file_header Header{
339
- u16 (Machine ),
343
+ u16 (NativeMachine ),
340
344
u16 (NumberOfSections),
341
345
u32 (0 ),
342
346
u32 (sizeof (Header) + (NumberOfSections * sizeof (coff_section)) +
343
347
// .idata$3
344
348
sizeof (coff_import_directory_table_entry)),
345
349
u32 (NumberOfSymbols),
346
350
u16 (0 ),
347
- u16 (is64Bit (Machine ) ? C_Invalid : IMAGE_FILE_32BIT_MACHINE),
351
+ u16 (is64Bit () ? C_Invalid : IMAGE_FILE_32BIT_MACHINE),
348
352
};
349
353
append (Buffer, Header);
350
354
@@ -393,11 +397,11 @@ ObjectFactory::createNullImportDescriptor(std::vector<uint8_t> &Buffer) {
393
397
NewArchiveMember ObjectFactory::createNullThunk (std::vector<uint8_t > &Buffer) {
394
398
const uint32_t NumberOfSections = 2 ;
395
399
const uint32_t NumberOfSymbols = 1 ;
396
- uint32_t VASize = is64Bit (Machine ) ? 8 : 4 ;
400
+ uint32_t VASize = is64Bit () ? 8 : 4 ;
397
401
398
402
// COFF Header
399
403
coff_file_header Header{
400
- u16 (Machine ),
404
+ u16 (NativeMachine ),
401
405
u16 (NumberOfSections),
402
406
u32 (0 ),
403
407
u32 (sizeof (Header) + (NumberOfSections * sizeof (coff_section)) +
@@ -407,7 +411,7 @@ NewArchiveMember ObjectFactory::createNullThunk(std::vector<uint8_t> &Buffer) {
407
411
VASize),
408
412
u32 (NumberOfSymbols),
409
413
u16 (0 ),
410
- u16 (is64Bit (Machine ) ? C_Invalid : IMAGE_FILE_32BIT_MACHINE),
414
+ u16 (is64Bit () ? C_Invalid : IMAGE_FILE_32BIT_MACHINE),
411
415
};
412
416
append (Buffer, Header);
413
417
@@ -422,8 +426,7 @@ NewArchiveMember ObjectFactory::createNullThunk(std::vector<uint8_t> &Buffer) {
422
426
u32 (0 ),
423
427
u16 (0 ),
424
428
u16 (0 ),
425
- u32 ((is64Bit (Machine) ? IMAGE_SCN_ALIGN_8BYTES
426
- : IMAGE_SCN_ALIGN_4BYTES) |
429
+ u32 ((is64Bit () ? IMAGE_SCN_ALIGN_8BYTES : IMAGE_SCN_ALIGN_4BYTES) |
427
430
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
428
431
IMAGE_SCN_MEM_WRITE)},
429
432
{{' .' , ' i' , ' d' , ' a' , ' t' , ' a' , ' $' , ' 4' },
@@ -436,21 +439,20 @@ NewArchiveMember ObjectFactory::createNullThunk(std::vector<uint8_t> &Buffer) {
436
439
u32 (0 ),
437
440
u16 (0 ),
438
441
u16 (0 ),
439
- u32 ((is64Bit (Machine) ? IMAGE_SCN_ALIGN_8BYTES
440
- : IMAGE_SCN_ALIGN_4BYTES) |
442
+ u32 ((is64Bit () ? IMAGE_SCN_ALIGN_8BYTES : IMAGE_SCN_ALIGN_4BYTES) |
441
443
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
442
444
IMAGE_SCN_MEM_WRITE)},
443
445
};
444
446
append (Buffer, SectionTable);
445
447
446
448
// .idata$5, ILT
447
449
append (Buffer, u32 (0 ));
448
- if (is64Bit (Machine ))
450
+ if (is64Bit ())
449
451
append (Buffer, u32 (0 ));
450
452
451
453
// .idata$4, IAT
452
454
append (Buffer, u32 (0 ));
453
- if (is64Bit (Machine ))
455
+ if (is64Bit ())
454
456
append (Buffer, u32 (0 ));
455
457
456
458
// Symbol Table
@@ -475,7 +477,8 @@ NewArchiveMember ObjectFactory::createNullThunk(std::vector<uint8_t> &Buffer) {
475
477
NewArchiveMember ObjectFactory::createShortImport (StringRef Sym,
476
478
uint16_t Ordinal,
477
479
ImportType ImportType,
478
- ImportNameType NameType) {
480
+ ImportNameType NameType,
481
+ MachineTypes Machine) {
479
482
size_t ImpSize = ImportName.size () + Sym.size () + 2 ; // +2 for NULs
480
483
size_t Size = sizeof (coff_import_header) + ImpSize;
481
484
char *Buf = Alloc.Allocate <char >(Size );
@@ -501,7 +504,8 @@ NewArchiveMember ObjectFactory::createShortImport(StringRef Sym,
501
504
}
502
505
503
506
NewArchiveMember ObjectFactory::createWeakExternal (StringRef Sym,
504
- StringRef Weak, bool Imp) {
507
+ StringRef Weak, bool Imp,
508
+ MachineTypes Machine) {
505
509
std::vector<uint8_t > Buffer;
506
510
const uint32_t NumberOfSections = 1 ;
507
511
const uint32_t NumberOfSymbols = 5 ;
@@ -585,8 +589,11 @@ Error writeImportLibrary(StringRef ImportName, StringRef Path,
585
589
ArrayRef<COFFShortExport> Exports,
586
590
MachineTypes Machine, bool MinGW) {
587
591
592
+ MachineTypes NativeMachine =
593
+ isArm64EC (Machine) ? IMAGE_FILE_MACHINE_ARM64 : Machine;
594
+
588
595
std::vector<NewArchiveMember> Members;
589
- ObjectFactory OF (llvm::sys::path::filename (ImportName), Machine );
596
+ ObjectFactory OF (llvm::sys::path::filename (ImportName), NativeMachine );
590
597
591
598
std::vector<uint8_t > ImportDescriptor;
592
599
Members.push_back (OF.createImportDescriptor (ImportDescriptor));
@@ -620,13 +627,15 @@ Error writeImportLibrary(StringRef ImportName, StringRef Path,
620
627
return Name.takeError ();
621
628
622
629
if (!E.AliasTarget .empty () && *Name != E.AliasTarget ) {
623
- Members.push_back (OF.createWeakExternal (E.AliasTarget , *Name, false ));
624
- Members.push_back (OF.createWeakExternal (E.AliasTarget , *Name, true ));
630
+ Members.push_back (
631
+ OF.createWeakExternal (E.AliasTarget , *Name, false , Machine));
632
+ Members.push_back (
633
+ OF.createWeakExternal (E.AliasTarget , *Name, true , Machine));
625
634
continue ;
626
635
}
627
636
628
637
Members.push_back (
629
- OF.createShortImport (*Name, E.Ordinal , ImportType, NameType));
638
+ OF.createShortImport (*Name, E.Ordinal , ImportType, NameType, Machine ));
630
639
}
631
640
632
641
return writeArchive (Path, Members, SymtabWritingMode::NormalSymtab,
0 commit comments