Index: lld/COFF/Symbols.h =================================================================== --- lld/COFF/Symbols.h +++ lld/COFF/Symbols.h @@ -187,6 +187,8 @@ } uint64_t getRVA() { return Data->getRVA(); } + uint64_t getSecrel() { return Data->OutputSectionOff; } + uint64_t getSectionIndex(); private: friend SymbolTable; Index: lld/COFF/Writer.cpp =================================================================== --- lld/COFF/Writer.cpp +++ lld/COFF/Writer.cpp @@ -215,6 +215,8 @@ switch (kind()) { case DefinedRegularKind: return cast(this)->getSecrel(); + case DefinedCommonKind: + return cast(this)->getSecrel(); case DefinedSyntheticKind: return cast(this)->getSecrel(); default: @@ -235,6 +237,8 @@ return D->getChunk()->getOutputSection()->SectionIndex; if (isa(this)) return DefinedAbsolute::OutputSectionIndex; + if (auto *D = dyn_cast(this)) + return D->getSectionIndex(); if (auto *D = dyn_cast(this)) { if (!D->getChunk()) return 0; @@ -244,6 +248,10 @@ toString(*this)); } +uint64_t DefinedCommon::getSectionIndex() { + return Data->getOutputSection()->SectionIndex; +} + bool Defined::isExecutable() { const auto X = IMAGE_SCN_MEM_EXECUTE; if (auto *D = dyn_cast(this)) Index: lld/test/COFF/secrel-common.s =================================================================== --- /dev/null +++ lld/test/COFF/secrel-common.s @@ -0,0 +1,41 @@ +# RUN: llvm-mc %s -filetype=obj -triple=x86_64-windows-msvc -o %t.obj +# RUN: lld-link -entry:main -nodefaultlib %t.obj -out:%t.exe +# RUN: llvm-readobj %t.exe -sections -section-data | FileCheck %s + +# Section relocations against common symbols resolve to .bss. + +# CHECK: Sections [ +# CHECK: Section { +# CHECK: Number: 1 +# CHECK: Name: .bss (2E 62 73 73 00 00 00 00) +# CHECK: VirtualSize: 0x4 +# CHECK: } +# CHECK: Section { +# CHECK: Number: 2 +# CHECK: Name: .rdata (2E 72 64 61 74 61 00 00) +# CHECK: SectionData ( +# CHECK: 0000: 00000000 01000000 |........| +# CHECK: ) +# CHECK: } +# CHECK: Section { +# CHECK: Number: 3 +# CHECK: Name: .text (2E 74 65 78 74 00 00 00) +# CHECK: VirtualSize: 0x1 +# CHECK: SectionData ( +# CHECK: 0000: C3 |.| +# CHECK: ) +# CHECK: } +# CHECK-NOT: Section +# CHECK: ] + +.text +.global main +main: +ret + +.comm common_global,4,2 + +.section .rdata,"dr" +.secrel32 common_global +.secidx common_global +.short 0