COFF: Fix x86 delay-load helper function name.

If /delayload option is given, we have to resolve __delayLoadHelper2
since the function is the dynamic loader to delay-load DLLs.
The function name is mangled in x86 as ___delayLoadHelper2@8.

llvm-svn: 242078
This commit is contained in:
Rui Ueyama 2015-07-13 22:31:45 +00:00
parent abbd6d6824
commit 6d24908fe7
4 changed files with 27 additions and 8 deletions

View File

@ -70,6 +70,7 @@ struct Configuration {
StringRef Implib;
std::vector<Export> Exports;
std::set<std::string> DelayLoads;
Undefined *DelayLoadHelper = nullptr;
// Used for /opt:icf
bool ICF = false;

View File

@ -418,12 +418,6 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
}
}
// Handle /delayload
for (auto *Arg : Args.filtered(OPT_delayload)) {
Config->DelayLoads.insert(StringRef(Arg->getValue()).lower());
addUndefined("__delayLoadHelper2");
}
// Handle /failifmismatch
for (auto *Arg : Args.filtered(OPT_failifmismatch))
if (checkFailIfMismatch(Arg->getValue()))
@ -598,6 +592,16 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
return false;
}
// Handle /delayload
for (auto *Arg : Args.filtered(OPT_delayload)) {
Config->DelayLoads.insert(StringRef(Arg->getValue()).lower());
if (Config->is64()) {
Config->DelayLoadHelper = addUndefined("__delayLoadHelper2");
} else {
Config->DelayLoadHelper = addUndefined("___delayLoadHelper2@8");
}
}
Symtab.addAbsolute(mangle("__ImageBase"), Config->ImageBase);
// Read as much files as we can from directives sections.

View File

@ -248,8 +248,7 @@ void Writer::createImportTables() {
Sec->addChunk(C);
}
if (!DelayIdata.empty()) {
Symbol *Sym = Symtab->find("__delayLoadHelper2");
Defined *Helper = cast<Defined>(Sym->Body);
Defined *Helper = cast<Defined>(Config->DelayLoadHelper->repl());
DelayIdata.create(Helper);
OutputSection *Sec = createSection(".didat");
for (Chunk *C : DelayIdata.getChunks())

View File

@ -0,0 +1,15 @@
# RUN: yaml2obj < %p/Inputs/hello32.yaml > %t.obj
# RUN: lld -flavor link2 %t.obj %p/Inputs/std32.lib /subsystem:console \
# RUN: /entry:main@0 /alternatename:___delayLoadHelper2@8=main@0 /out:%t.exe
# RUN: llvm-readobj -coff-imports %t.exe | FileCheck %s
CHECK: Format: COFF-i386
CHECK: Arch: i386
CHECK: AddressSize: 32bit
CHECK: Import {
CHECK: Name: std32.dll
CHECK: ImportLookupTableRVA: 0x3028
CHECK: ImportAddressTableRVA: 0x3034
CHECK: Symbol: ExitProcess (0)
CHECK: Symbol: MessageBoxA (1)
CHECK: }