forked from OSchip/llvm-project
COFF: Support /force flag.
This option is to ignore remaining undefined symbols and force the linker to create an output file anyways. The existing code assumes that there's no undefined symbol after reportRemainingUndefines(). That assumption is legitimate. I also don't want to mess up the existing code for this minor feature. In order to keep it as is, remaining undefined symbols are replaced with dummy defined symbols. llvm-svn: 240913
This commit is contained in:
parent
5126186b32
commit
95925fd1ab
|
@ -46,6 +46,7 @@ struct Configuration {
|
|||
std::string OutputFile;
|
||||
bool DoGC = true;
|
||||
bool Relocatable = true;
|
||||
bool Force = false;
|
||||
|
||||
// Symbols in this set are considered as live by the garbage collector.
|
||||
std::set<StringRef> GCRoots;
|
||||
|
|
|
@ -265,6 +265,10 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
|
|||
if (Args.hasArg(OPT_verbose))
|
||||
Config->Verbose = true;
|
||||
|
||||
// Handle /force or /force:unresolved
|
||||
if (Args.hasArg(OPT_force) || Args.hasArg(OPT_force_unresolved))
|
||||
Config->Force = true;
|
||||
|
||||
// Handle /entry
|
||||
if (auto *Arg = Args.getLastArg(OPT_entry)) {
|
||||
Config->EntryName = Arg->getValue();
|
||||
|
|
|
@ -92,6 +92,12 @@ bool SymbolTable::reportRemainingUndefines() {
|
|||
}
|
||||
}
|
||||
llvm::errs() << "undefined symbol: " << Name << "\n";
|
||||
// Remaining undefined symbols are not fatal if /force is specified.
|
||||
// They are replaced with dummy defined symbols.
|
||||
if (Config->Force) {
|
||||
Sym->Body = new (Alloc) DefinedAbsolute(Name, 0);
|
||||
continue;
|
||||
}
|
||||
Ret = true;
|
||||
}
|
||||
return Ret;
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
# RUN: yaml2obj < %s > %t.obj
|
||||
# RUN: not lld -flavor link2 /out:%t.exe %t.obj
|
||||
# RUN: FileCheck %s < %t.log
|
||||
# RUN: lld -flavor link2 /out:%t.exe %t.obj /force >& %t.log
|
||||
# RUN: FileCheck %s < %t.log
|
||||
|
||||
# CHECK: undefined symbol: foo
|
||||
|
||||
---
|
||||
header:
|
||||
Machine: IMAGE_FILE_MACHINE_AMD64
|
||||
Characteristics: []
|
||||
sections:
|
||||
- Name: .text
|
||||
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
|
||||
Alignment: 4
|
||||
SectionData: 000000000000
|
||||
symbols:
|
||||
- Name: .text
|
||||
Value: 0
|
||||
SectionNumber: 1
|
||||
SimpleType: IMAGE_SYM_TYPE_NULL
|
||||
ComplexType: IMAGE_SYM_DTYPE_NULL
|
||||
StorageClass: IMAGE_SYM_CLASS_STATIC
|
||||
SectionDefinition:
|
||||
Length: 6
|
||||
NumberOfRelocations: 0
|
||||
NumberOfLinenumbers: 0
|
||||
CheckSum: 0
|
||||
Number: 0
|
||||
- Name: mainCRTStartup
|
||||
Value: 0
|
||||
SectionNumber: 1
|
||||
SimpleType: IMAGE_SYM_TYPE_NULL
|
||||
ComplexType: IMAGE_SYM_DTYPE_NULL
|
||||
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
|
||||
- Name: foo
|
||||
Value: 0
|
||||
SectionNumber: 0
|
||||
SimpleType: IMAGE_SYM_TYPE_NULL
|
||||
ComplexType: IMAGE_SYM_DTYPE_NULL
|
||||
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
|
||||
...
|
Loading…
Reference in New Issue