diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp index dfe235942df0..9ff441824271 100644 --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -485,6 +485,12 @@ template void Writer::writeHeader() { Dir[TLS_TABLE].Size = 40; } } + if (Symbol *Sym = Symtab->find("__load_config_used")) { + if (Defined *B = dyn_cast(Sym->Body)) { + Dir[LOAD_CONFIG_TABLE].RelativeVirtualAddress = B->getRVA(); + Dir[LOAD_CONFIG_TABLE].Size = 64; + } + } // Write section table for (OutputSection *Sec : OutputSections) { diff --git a/lld/test/COFF/loadcfg32.test b/lld/test/COFF/loadcfg32.test new file mode 100644 index 000000000000..678bc9897e4d --- /dev/null +++ b/lld/test/COFF/loadcfg32.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: 0x40 + +--- +header: + Machine: IMAGE_FILE_MACHINE_I386 + 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 +...