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:
parent
abbd6d6824
commit
6d24908fe7
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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: }
|
Loading…
Reference in New Issue