diff --git a/lld/MachO/InputFiles.cpp b/lld/MachO/InputFiles.cpp --- a/lld/MachO/InputFiles.cpp +++ b/lld/MachO/InputFiles.cpp @@ -2107,27 +2107,31 @@ void ArchiveFile::addLazySymbols() { Error err = Error::success(); - Expected mbOrErr = - this->file->child_begin(err)->getMemoryBufferRef(); + auto child = file->child_begin(err); // Ignore the I/O error here - will be reported later. - if (!mbOrErr) { - llvm::consumeError(mbOrErr.takeError()); - } else if (!err) { - if (identify_magic(mbOrErr->getBuffer()) == file_magic::macho_object) { - if (target->wordSize == 8) - compatArch = compatWithTargetArch( - this, reinterpret_cast( - mbOrErr->getBufferStart())); - else - compatArch = compatWithTargetArch( - this, reinterpret_cast( - mbOrErr->getBufferStart())); - - if (!compatArch) - return; + // Also avoid calling getMemoryBUfferRef() on zero-symbol archive + // since that crashes. + if (!err && file->getNumberOfSymbols() > 0) { + Expected mbOrErr = child->getMemoryBufferRef(); + if (!mbOrErr) { + llvm::consumeError(mbOrErr.takeError()); + } else { + if (identify_magic(mbOrErr->getBuffer()) == file_magic::macho_object) { + if (target->wordSize == 8) + compatArch = compatWithTargetArch( + this, reinterpret_cast( + mbOrErr->getBufferStart())); + else + compatArch = compatWithTargetArch( + this, reinterpret_cast( + mbOrErr->getBufferStart())); + if (!compatArch) + return; + } } } + for (const object::Archive::Symbol &sym : file->symbols()) symtab->addLazyArchive(sym.getName(), this, sym); }