diff options
-rw-r--r-- | lld/COFF/Symbols.h | 2 | ||||
-rw-r--r-- | lld/COFF/Writer.cpp | 8 | ||||
-rw-r--r-- | lld/test/COFF/secrel-common.s | 41 |
3 files changed, 51 insertions, 0 deletions
diff --git a/lld/COFF/Symbols.h b/lld/COFF/Symbols.h index feebb6dde1f..8c1390c4587 100644 --- a/lld/COFF/Symbols.h +++ b/lld/COFF/Symbols.h @@ -187,6 +187,8 @@ public: } uint64_t getRVA() { return Data->getRVA(); } + uint32_t getSecrel() { return Data->OutputSectionOff; } + uint16_t getSectionIndex(); private: friend SymbolTable; diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp index 03e5d4d675b..d32577b361f 100644 --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -215,6 +215,8 @@ uint32_t Defined::getSecrel() { switch (kind()) { case DefinedRegularKind: return cast<DefinedRegular>(this)->getSecrel(); + case DefinedCommonKind: + return cast<DefinedCommon>(this)->getSecrel(); case DefinedSyntheticKind: return cast<DefinedSynthetic>(this)->getSecrel(); default: @@ -235,6 +237,8 @@ uint16_t Defined::getSectionIndex() { return D->getChunk()->getOutputSection()->SectionIndex; if (isa<DefinedAbsolute>(this)) return DefinedAbsolute::OutputSectionIndex; + if (auto *D = dyn_cast<DefinedCommon>(this)) + return D->getSectionIndex(); if (auto *D = dyn_cast<DefinedSynthetic>(this)) { if (!D->getChunk()) return 0; @@ -244,6 +248,10 @@ uint16_t Defined::getSectionIndex() { toString(*this)); } +uint16_t DefinedCommon::getSectionIndex() { + return Data->getOutputSection()->SectionIndex; +} + bool Defined::isExecutable() { const auto X = IMAGE_SCN_MEM_EXECUTE; if (auto *D = dyn_cast<DefinedRegular>(this)) diff --git a/lld/test/COFF/secrel-common.s b/lld/test/COFF/secrel-common.s new file mode 100644 index 00000000000..0188f6cb967 --- /dev/null +++ b/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 |