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:
Rui Ueyama 2015-06-28 19:35:15 +00:00
parent 5126186b32
commit 95925fd1ab
4 changed files with 54 additions and 0 deletions

View File

@ -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;

View File

@ -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();

View File

@ -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;

43
lld/test/COFF/force.test Normal file
View File

@ -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
...