Fixes PR46348.
ObjFile<ELFT>::initializeSymbols contains two symbol iteration loops:
for each symbol
if non-inheriting && non-local
fill in this->symbols[i]
for each symbol
if local
fill in this->symbols[i]
else
symbol resolutionSymbol resolution can trigger a duplicate symbol error which will call
InputSectionBase::getObjMsg to iterate over InputFile::symbols. If a
non-local symbol appears after the non-local symbol being resolved
(violating ELF spec), its this->symbols[i] entry has not been filled
in, InputSectionBase::getObjMsg will crash due to
dyn_cast<Defined>(nullptr).
To fix the bug, reorganize the two loops to ensure this->symbols is
complete before symbol resolution. This enforces the invariant:
InputFile::symbols has none null entry when InputFile::getSymbols() is called.
for each symbol
if non-inheriting
fill in this->symbols[i]
for each symbol starting from firstGlobal
if non-local
symbol resolutionAdditionally, move the (non-local symbol in local part of .symtab)
diagnostic from Writer<ELFT>::copyLocalSymbols() to initializeSymbols().
You can do:
if (eSym.getBinding() != STB_LOCAL) {and inline STB_LOCAL value.