diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -1134,6 +1134,7 @@ } // Symbol resolution of non-local symbols. + SmallVector unds; for (size_t i = firstGlobal, end = eSyms.size(); i != end; ++i) { const Elf_Sym &eSym = eSyms[i]; uint8_t binding = eSym.getBinding(); @@ -1150,8 +1151,7 @@ // Handle global undefined symbols. if (eSym.st_shndx == SHN_UNDEF) { - this->symbols[i]->resolve(Undefined{this, name, binding, stOther, type}); - this->symbols[i]->referenced = true; + unds.push_back(i); continue; } @@ -1198,6 +1198,15 @@ fatal(toString(this) + ": unexpected binding: " + Twine((int)binding)); } + + for (size_t i : unds) { + const Elf_Sym &eSym = eSyms[i]; + uint8_t binding = eSym.getBinding(); + StringRefZ name = this->stringTable.data() + eSym.st_name; + this->symbols[i]->resolve(Undefined{this, name, eSym.getBinding(), + eSym.st_other, eSym.getType()}); + this->symbols[i]->referenced = true; + } } ArchiveFile::ArchiveFile(std::unique_ptr &&file)