diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 14d7e3472549..c935970f2505 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -89,6 +89,8 @@ private: void addCommonSymbols(std::vector &Syms); void addCopyRelSymbols(std::vector *> &Syms); + static uint32_t getAlignment(SharedSymbol *SS); + std::unique_ptr Buffer; BumpPtrAllocator Alloc; @@ -723,26 +725,32 @@ void Writer::addCommonSymbols(std::vector &Syms) { Out::Bss->setSize(Off); } +template +uint32_t Writer::getAlignment(SharedSymbol *SS) { + const Elf_Sym &Sym = SS->Sym; + const Elf_Shdr *Sec = SS->File->getSection(Sym); + uintX_t SecAlign = Sec->sh_addralign; + int TrailingZeros = std::min(countTrailingZeros(SecAlign), + countTrailingZeros((uintX_t)Sym.st_value)); + return 1 << TrailingZeros; +} + // Reserve space in .bss for copy relocations. template void Writer::addCopyRelSymbols(std::vector *> &Syms) { if (Syms.empty()) return; uintX_t Off = getBss()->getSize(); - for (SharedSymbol *C : Syms) { - const Elf_Sym &Sym = C->Sym; - const Elf_Shdr *Sec = C->File->getSection(Sym); - uintX_t SecAlign = Sec->sh_addralign; - unsigned TrailingZeros = - std::min(countTrailingZeros(SecAlign), - countTrailingZeros((uintX_t)Sym.st_value)); - uintX_t Align = 1 << TrailingZeros; - Out::Bss->updateAlign(Align); + uintX_t MaxAlign = Out::Bss->getAlign(); + for (SharedSymbol *SS : Syms) { + uintX_t Align = getAlignment(SS); Off = alignTo(Off, Align); - C->OffsetInBss = Off; - Off += Sym.st_size; + SS->OffsetInBss = Off; + Off += SS->Sym.st_size; + MaxAlign = std::max(MaxAlign, Align); } Out::Bss->setSize(Off); + Out::Bss->updateAlign(MaxAlign); } template