return EC;
break;
case OPT_incl:
- Config->Includes.insert(Arg->getValue());
+ addUndefined(Arg->getValue());
break;
case OPT_merge:
// Ignore /merge for now.
}
}
+void LinkerDriver::addUndefined(StringRef Sym) {
+ Symtab.addUndefined(Sym);
+ Config->GCRoots.insert(Sym);
+}
+
static WindowsSubsystem inferSubsystem() {
if (Config->DLL)
return IMAGE_SUBSYSTEM_WINDOWS_GUI;
if (Args.hasArg(OPT_verbose))
Config->Verbose = true;
+ // Handle /entry
+ if (auto *Arg = Args.getLastArg(OPT_entry)) {
+ Config->EntryName = Arg->getValue();
+ addUndefined(Config->EntryName);
+ }
+
// Handle /dll
if (Args.hasArg(OPT_dll)) {
Config->DLL = true;
Config->ManifestID = 2;
+ if (Config->EntryName.empty()) {
+ Config->EntryName = "_DllMainCRTStartup";
+ addUndefined("_DllMainCRTStartup");
+ }
}
- // Handle /entry
- if (auto *Arg = Args.getLastArg(OPT_entry))
- Config->EntryName = Arg->getValue();
-
// Handle /fixed
if (Args.hasArg(OPT_fixed)) {
if (Args.hasArg(OPT_dynamicbase)) {
// Handle /include
for (auto *Arg : Args.filtered(OPT_incl))
- Config->Includes.insert(Arg->getValue());
+ addUndefined(Arg->getValue());
// Handle /implib
if (auto *Arg = Args.getLastArg(OPT_implib))
// Handle /delayload
for (auto *Arg : Args.filtered(OPT_delayload)) {
Config->DelayLoads.insert(Arg->getValue());
- Config->Includes.insert("__delayLoadHelper2");
+ addUndefined("__delayLoadHelper2");
}
// Handle /failifmismatch
for (;;) {
size_t Ver = Symtab.getVersion();
- // Add undefined symbols specified by /include.
- for (StringRef Sym : Config->Includes)
- Symtab.addUndefined(Sym);
-
// Windows specific -- Make sure we resolve all dllexported symbols.
for (Export &E : Config->Exports)
- Symtab.addUndefined(E.Name);
+ addUndefined(E.Name);
// Add weak aliases. Weak aliases is a mechanism to give remaining
// undefined symbols final chance to be resolved successfully.
}
Config->EntryName = EntryOrErr.get();
}
- Symtab.addUndefined(Config->EntryName);
+ addUndefined(Config->EntryName);
if (auto EC = Symtab.run()) {
llvm::errs() << EC.message() << "\n";
if (Symtab.reportRemainingUndefines())
return false;
- // Initialize a list of GC root.
- for (StringRef Sym : Config->Includes)
- Config->GCRoots.insert(Sym);
- for (Export &E : Config->Exports)
- Config->GCRoots.insert(E.Name);
- Config->GCRoots.insert(Config->EntryName);
-
// Do LTO by compiling bitcode input files to a native COFF file
// then link that file.
if (auto EC = Symtab.addCombinedLTOObject()) {