summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Writer.cpp25
1 files changed, 14 insertions, 11 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index c935970f250..4887c666fae 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -85,7 +85,7 @@ private:
return !Symtab.getSharedFiles().empty() || Config->Shared;
}
- OutputSection<ELFT> *getBss();
+ void ensureBss();
void addCommonSymbols(std::vector<DefinedCommon *> &Syms);
void addCopyRelSymbols(std::vector<SharedSymbol<ELFT> *> &Syms);
@@ -691,14 +691,15 @@ static bool compareSections(OutputSectionBase<ELFT> *A,
return false;
}
-template <class ELFT> OutputSection<ELFT> *Writer<ELFT>::getBss() {
- if (!Out<ELFT>::Bss) {
- Out<ELFT>::Bss =
- new OutputSection<ELFT>(".bss", SHT_NOBITS, SHF_ALLOC | SHF_WRITE);
- OwningSections.emplace_back(Out<ELFT>::Bss);
- OutputSections.push_back(Out<ELFT>::Bss);
- }
- return Out<ELFT>::Bss;
+// The .bss section does not exist if no input file has a .bss section.
+// This function creates one if that's the case.
+template <class ELFT> void Writer<ELFT>::ensureBss() {
+ if (Out<ELFT>::Bss)
+ return;
+ Out<ELFT>::Bss =
+ new OutputSection<ELFT>(".bss", SHT_NOBITS, SHF_ALLOC | SHF_WRITE);
+ OwningSections.emplace_back(Out<ELFT>::Bss);
+ OutputSections.push_back(Out<ELFT>::Bss);
}
// Until this function is called, common symbols do not belong to any section.
@@ -714,7 +715,8 @@ void Writer<ELFT>::addCommonSymbols(std::vector<DefinedCommon *> &Syms) {
return A->Alignment > B->Alignment;
});
- uintX_t Off = getBss()->getSize();
+ ensureBss();
+ uintX_t Off = Out<ELFT>::Bss->getSize();
for (DefinedCommon *C : Syms) {
Off = alignTo(Off, C->Alignment);
Out<ELFT>::Bss->updateAlign(C->Alignment);
@@ -740,7 +742,8 @@ template <class ELFT>
void Writer<ELFT>::addCopyRelSymbols(std::vector<SharedSymbol<ELFT> *> &Syms) {
if (Syms.empty())
return;
- uintX_t Off = getBss()->getSize();
+ ensureBss();
+ uintX_t Off = Out<ELFT>::Bss->getSize();
uintX_t MaxAlign = Out<ELFT>::Bss->getAlign();
for (SharedSymbol<ELFT> *SS : Syms) {
uintX_t Align = getAlignment(SS);
OpenPOWER on IntegriCloud