Index: lld/trunk/ELF/OutputSections.h =================================================================== --- lld/trunk/ELF/OutputSections.h +++ lld/trunk/ELF/OutputSections.h @@ -180,6 +180,8 @@ void writeLocalSymbols(uint8_t *&Buf); void writeGlobalSymbols(uint8_t *Buf); + static uint8_t getSymbolBinding(SymbolBody *Body); + SymbolTable &Table; StringTableSection &StrTabSec; unsigned NumVisible = 0; Index: lld/trunk/ELF/OutputSections.cpp =================================================================== --- lld/trunk/ELF/OutputSections.cpp +++ lld/trunk/ELF/OutputSections.cpp @@ -789,23 +789,17 @@ break; } - unsigned char Binding = Body->isWeak() ? STB_WEAK : STB_GLOBAL; unsigned char Type = STT_NOTYPE; uintX_t Size = 0; if (const auto *EBody = dyn_cast>(Body)) { const Elf_Sym &InputSym = EBody->Sym; - Binding = InputSym.getBinding(); Type = InputSym.getType(); Size = InputSym.st_size; } - unsigned char Visibility = Body->getMostConstrainingVisibility(); - if (Visibility != STV_DEFAULT && Visibility != STV_PROTECTED) - Binding = STB_LOCAL; - - ESym->setBindingAndType(Binding, Type); + ESym->setBindingAndType(getSymbolBinding(Body), Type); ESym->st_size = Size; - ESym->setVisibility(Visibility); + ESym->setVisibility(Body->getMostConstrainingVisibility()); ESym->st_value = getSymVA(*Body); if (Section) @@ -824,6 +818,16 @@ }); } +template +uint8_t SymbolTableSection::getSymbolBinding(SymbolBody *Body) { + uint8_t Visibility = Body->getMostConstrainingVisibility(); + if (Visibility != STV_DEFAULT && Visibility != STV_PROTECTED) + return STB_LOCAL; + if (const auto *EBody = dyn_cast>(Body)) + return EBody->Sym.getBinding(); + return Body->isWeak() ? STB_WEAK : STB_GLOBAL; +} + namespace lld { namespace elf2 { template class OutputSectionBase;