COFF: Fill imort table HintName field.
Currently we set the field to zero, but as per the spec, we should
set numbers we read from import library files. The loader uses the
values as starting offsets for binary search when looking up imported
symbols from DLL.
llvm-svn: 238562
diff --git a/lld/COFF/Chunks.cpp b/lld/COFF/Chunks.cpp
index 18181ac..8f24885 100644
--- a/lld/COFF/Chunks.cpp
+++ b/lld/COFF/Chunks.cpp
@@ -172,11 +172,11 @@
write32le(Buf + FileOff + 2, Operand);
}
-HintNameChunk::HintNameChunk(StringRef N)
- : Name(N), Size(RoundUpToAlignment(Name.size() + 4, 2)) {}
+HintNameChunk::HintNameChunk(StringRef N, uint16_t H)
+ : Name(N), Hint(H), Size(RoundUpToAlignment(Name.size() + 4, 2)) {}
void HintNameChunk::writeTo(uint8_t *Buf) {
- // The first two bytes is Hint/Name field.
+ write16le(Buf + FileOff, Hint);
memcpy(Buf + FileOff + 2, Name.data(), Name.size());
}
@@ -196,7 +196,8 @@
DLLName = new StringChunk(N);
DirTab = new DirectoryChunk(DLLName);
for (DefinedImportData *S : Symbols)
- HintNameTables.push_back(new HintNameChunk(S->getExportName()));
+ HintNameTables.push_back(
+ new HintNameChunk(S->getExportName(), S->getOrdinal()));
for (HintNameChunk *H : HintNameTables) {
LookupTables.push_back(new LookupChunk(H));
diff --git a/lld/COFF/Chunks.h b/lld/COFF/Chunks.h
index c2168fc..0556147 100644
--- a/lld/COFF/Chunks.h
+++ b/lld/COFF/Chunks.h
@@ -194,12 +194,13 @@
// A chunk for the import descriptor table.
class HintNameChunk : public Chunk {
public:
- explicit HintNameChunk(StringRef Name);
+ HintNameChunk(StringRef Name, uint16_t Hint);
size_t getSize() const override { return Size; }
void writeTo(uint8_t *Buf) override;
private:
StringRef Name;
+ uint16_t Hint;
size_t Size;
};
diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp
index 6dcbe0b..d1a6076 100644
--- a/lld/COFF/InputFiles.cpp
+++ b/lld/COFF/InputFiles.cpp
@@ -232,7 +232,7 @@
StringRef Name = StringAlloc.save(StringRef(Buf + sizeof(*Hdr)));
StringRef ImpName = StringAlloc.save(Twine("__imp_") + Name);
StringRef DLLName(Buf + sizeof(coff_import_header) + Name.size() + 1);
- auto *ImpSym = new (Alloc) DefinedImportData(DLLName, ImpName, Name);
+ auto *ImpSym = new (Alloc) DefinedImportData(DLLName, ImpName, Name, Hdr);
SymbolBodies.push_back(ImpSym);
// If type is function, we need to create a thunk which jump to an
diff --git a/lld/COFF/Symbols.h b/lld/COFF/Symbols.h
index 7136ccc..13eee7f 100644
--- a/lld/COFF/Symbols.h
+++ b/lld/COFF/Symbols.h
@@ -24,6 +24,7 @@
using llvm::object::Archive;
using llvm::object::COFFSymbolRef;
+using llvm::object::coff_import_header;
class ArchiveFile;
class InputFile;
@@ -158,9 +159,10 @@
// table in an output. The former has "__imp_" prefix.
class DefinedImportData : public Defined {
public:
- DefinedImportData(StringRef D, StringRef ImportName, StringRef ExportName)
+ DefinedImportData(StringRef D, StringRef ImportName, StringRef ExportName,
+ const coff_import_header *H)
: Defined(DefinedImportDataKind, ImportName), DLLName(D),
- ExpName(ExportName) {}
+ ExpName(ExportName), Hdr(H) {}
static bool classof(const SymbolBody *S) {
return S->kind() == DefinedImportDataKind;
@@ -171,10 +173,12 @@
StringRef getDLLName() { return DLLName; }
StringRef getExportName() { return ExpName; }
void setLocation(Chunk *AddressTable) { Location = AddressTable; }
+ uint16_t getOrdinal() { return Hdr->OrdinalHint; }
private:
StringRef DLLName;
StringRef ExpName;
+ const coff_import_header *Hdr;
Chunk *Location = nullptr;
};
diff --git a/lld/test/COFF/imports.test b/lld/test/COFF/imports.test
index 5631023..7b21b4c 100644
--- a/lld/test/COFF/imports.test
+++ b/lld/test/COFF/imports.test
@@ -23,5 +23,5 @@
IMPORT-NEXT: ImportLookupTableRVA: 0x3028
IMPORT-NEXT: ImportAddressTableRVA: 0x3040
IMPORT-NEXT: Symbol: ExitProcess (0)
-IMPORT-NEXT: Symbol: MessageBoxA (0)
+IMPORT-NEXT: Symbol: MessageBoxA (1)
IMPORT-NEXT: }