diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -1140,16 +1140,20 @@ Optional Writer::createSymbol(Defined *def) { coff_symbol16 sym; switch (def->kind()) { - case Symbol::DefinedAbsoluteKind: - sym.Value = def->getRVA(); + case Symbol::DefinedAbsoluteKind: { + auto *da = dyn_cast(def); + // Note: COFF symbol can only store 32-bit values, so 64-bit absolute + // values will be truncated. + sym.Value = da->getVA(); sym.SectionNumber = IMAGE_SYM_ABSOLUTE; break; - case Symbol::DefinedSyntheticKind: - // Relative symbols are unrepresentable in a COFF symbol table. - return None; + } default: { // Don't write symbols that won't be written to the output to the symbol // table. + // We also try to write DefinedSynthetic as a normal symbol. Some of these + // symbols do point to an actual chunk, like __safe_se_handler_table. Others + // like __ImageBase are outside of sections and thus cannot be represented. Chunk *c = def->getChunk(); if (!c) return None; diff --git a/lld/test/COFF/symtab-DefinedSynthetic.s b/lld/test/COFF/symtab-DefinedSynthetic.s new file mode 100644 --- /dev/null +++ b/lld/test/COFF/symtab-DefinedSynthetic.s @@ -0,0 +1,53 @@ +# REQUIRES: x86 + +# The __guard_fids_table is a DefinedSynthetic when control flow guard is +# enabled and there are entries to be added to the fids table. This test uses +# this to check that DefinedSynthetic symbols are being written to the COFF +# symbol table. + +# RUN: llvm-mc -triple x86_64-windows-msvc %s -filetype=obj -o %t.obj +# RUN: lld-link %t.obj -guard:cf -out:%t.exe -entry:main -debug:symtab +# RUN: llvm-readobj --symbols %t.exe | FileCheck --check-prefix=CHECK %s + +# CHECK: Name: __guard_fids_table +# CHECK-NEXT: Value: +# CHECK-NEXT: Section: .rdata (2) + + +# We need @feat.00 to have 0x800 to indicate /guard:cf. + .def @feat.00; + .scl 3; + .type 0; + .endef + .globl @feat.00 +@feat.00 = 0x800 + .def main; .scl 2; .type 32; .endef + .globl main # -- Begin function main + .p2align 4, 0x90 +main: + retq + # -- End function + .section .gfids$y,"dr" + .symidx main + .section .giats$y,"dr" + .section .gljmp$y,"dr" + .addrsig_sym main + .section .rdata,"dr" + +.globl _load_config_used + .p2align 3 +_load_config_used: + .long 312 + .fill 124, 1, 0 + .quad __guard_fids_table + .quad __guard_fids_count + .long __guard_flags + .fill 12, 1, 0 + .quad __guard_iat_table + .quad __guard_iat_count + .quad __guard_longjmp_table + .quad __guard_longjmp_count + .fill 72, 1, 0 + .quad __guard_eh_cont_table + .quad __guard_eh_cont_count + .fill 32, 1, 0 diff --git a/lld/test/COFF/symtab.test b/lld/test/COFF/symtab.test --- a/lld/test/COFF/symtab.test +++ b/lld/test/COFF/symtab.test @@ -75,7 +75,7 @@ # CHECK-NEXT: } # CHECK-NEXT: Symbol { # CHECK-NEXT: Name: abs_symbol -# CHECK-NEXT: Value: 2662186735 +# CHECK-NEXT: Value: 3735928559 # CHECK-NEXT: Section: IMAGE_SYM_ABSOLUTE (-1) # CHECK-NEXT: BaseType: Null (0x0) # CHECK-NEXT: ComplexType: Null (0x0) diff --git a/lld/test/COFF/wrap-i386.s b/lld/test/COFF/wrap-i386.s --- a/lld/test/COFF/wrap-i386.s +++ b/lld/test/COFF/wrap-i386.s @@ -16,16 +16,16 @@ // RUN: FileCheck --check-prefix=SYM2 %s < %t.dump // RUN: FileCheck --check-prefix=SYM3 %s < %t.dump -// _foo = 0xffc11000 = 4290842624 -// ___wrap_foo = ffc11010 = 4290842640 +// _foo = 0x00011000 = 69632 +// ___wrap_foo = 0x00011010 = 69648 // SYM1: Name: _foo -// SYM1-NEXT: Value: 4290842624 +// SYM1-NEXT: Value: 69632 // SYM1-NEXT: Section: IMAGE_SYM_ABSOLUTE // SYM1-NEXT: BaseType: Null // SYM1-NEXT: ComplexType: Null // SYM1-NEXT: StorageClass: External // SYM2: Name: ___wrap_foo -// SYM2-NEXT: Value: 4290842640 +// SYM2-NEXT: Value: 69648 // SYM2-NEXT: Section: IMAGE_SYM_ABSOLUTE // SYM2-NEXT: BaseType: Null // SYM2-NEXT: ComplexType: Null diff --git a/lld/test/COFF/wrap.s b/lld/test/COFF/wrap.s --- a/lld/test/COFF/wrap.s +++ b/lld/test/COFF/wrap.s @@ -18,16 +18,16 @@ // RUN: FileCheck --check-prefix=SYM2 %s < %t.dump // RUN: FileCheck --check-prefix=SYM3 %s < %t.dump -// foo = 0xC0011000 = 3221295104 -// __wrap_foo = 0xC0011010 = 3221295120 +// foo = 0x00011000 = 69632 +// __wrap_foo = 0x00011010 = 69648 // SYM1: Name: foo -// SYM1-NEXT: Value: 3221295104 +// SYM1-NEXT: Value: 69632 // SYM1-NEXT: Section: IMAGE_SYM_ABSOLUTE // SYM1-NEXT: BaseType: Null // SYM1-NEXT: ComplexType: Null // SYM1-NEXT: StorageClass: External // SYM2: Name: __wrap_foo -// SYM2-NEXT: Value: 3221295120 +// SYM2-NEXT: Value: 69648 // SYM2-NEXT: Section: IMAGE_SYM_ABSOLUTE // SYM2-NEXT: BaseType: Null // SYM2-NEXT: ComplexType: Null