From 29f74c312ae33064825cc53264bead3680fb1a48 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Wed, 29 Jul 2015 16:30:31 +0000 Subject: [PATCH] COFF: Set load config table entry on non-x86. llvm-svn: 243532 --- lld/COFF/Config.h | 1 + lld/COFF/Driver.cpp | 8 ++++---- lld/COFF/Writer.cpp | 4 ++-- lld/test/COFF/loadcfg.test | 42 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 lld/test/COFF/loadcfg.test diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h index 8479491..3d74def 100644 --- a/lld/COFF/Config.h +++ b/lld/COFF/Config.h @@ -79,6 +79,7 @@ struct Configuration { std::vector Exports; std::set DelayLoads; Undefined *DelayLoadHelper = nullptr; + StringRef LoadConfigUsed; // Used for SafeSEH. DefinedRelative *SEHTable = nullptr; diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 88671ef..b7e7f4c 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -622,6 +622,7 @@ bool LinkerDriver::link(llvm::ArrayRef ArgsArr) { Config->SEHTable = Symtab.addRelative("___safe_se_handler_table", 0); Config->SEHCount = Symtab.addAbsolute("___safe_se_handler_count", 0); } + Config->LoadConfigUsed = mangle("_load_config_used"); // Read as much files as we can from directives sections. if (auto EC = Symtab.run()) { @@ -659,10 +660,9 @@ bool LinkerDriver::link(llvm::ArrayRef ArgsArr) { } // Windows specific -- if __load_config_used can be resolved, resolve it. - if (Config->Machine == I386) - if (Symbol *Sym = Symtab.find("__load_config_used")) - if (isa(Sym->Body)) - Symtab.addUndefined("__load_config_used"); + if (Symbol *Sym = Symtab.find(Config->LoadConfigUsed)) + if (isa(Sym->Body)) + Symtab.addUndefined(Config->LoadConfigUsed); if (Symtab.queueEmpty()) break; diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp index aca44ea..506adf6 100644 --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -526,10 +526,10 @@ template void Writer::writeHeader() { Dir[TLS_TABLE].Size = 40; } } - if (Symbol *Sym = Symtab->findUnderscore("_load_config_used")) { + if (Symbol *Sym = Symtab->find(Config->LoadConfigUsed)) { if (Defined *B = dyn_cast(Sym->Body)) { Dir[LOAD_CONFIG_TABLE].RelativeVirtualAddress = B->getRVA(); - Dir[LOAD_CONFIG_TABLE].Size = 64; + Dir[LOAD_CONFIG_TABLE].Size = Config->is64() ? 112 : 64; } } diff --git a/lld/test/COFF/loadcfg.test b/lld/test/COFF/loadcfg.test new file mode 100644 index 0000000..16ee538 --- /dev/null +++ b/lld/test/COFF/loadcfg.test @@ -0,0 +1,42 @@ +# RUN: yaml2obj < %s > %t.obj +# RUN: lld -flavor link2 /out:%t.exe %t.obj /entry:main /subsystem:console +# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s + +# CHECK: LoadConfigTableRVA: 0x1000 +# CHECK: LoadConfigTableSize: 0x70 + +--- +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: B82A000000C3 +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: main + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: _load_config_used + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_EXTERNAL +... -- 2.7.4