for (uint32_t i=0; i <= _mainProgLoadIndex; ++i)
computeInitOrder(writers[i], i);
+ if ( _diag.hasError() )
+ return nullptr;
+
// combine all Image objects into one ImageArray
ImageArrayWriter imageArrayWriter(_startImageNum, (uint32_t)writers.count());
for (ImageWriter& writer : writers) {
}
}
+ if ( _diag.hasError() )
+ return nullptr;
+
// check if top image loaded is in shared cache along with everything it depends on
*topImageNum = foundTopImage->imageNum;
if ( writers.count() == 0 ) {
// add initializer order into top level Image
computeInitOrder(writers[0], (uint32_t)alreadyLoadedList.count());
+ if ( _diag.hasError() )
+ return nullptr;
+
// combine all Image objects into one ImageArray
ImageArrayWriter imageArrayWriter(_startImageNum, (uint32_t)writers.count());
for (ImageWriter& writer : writers) {
const char* installName = aFile.mh->installName();
if ( (pathsWithDuplicateInstallName.count(aFile.runtimePath) != 0) && (aFile.runtimePath != installName) ) {
- if (warn) fprintf(stderr, "update_dyld_shared_cache: warning: %s skipping because of duplicate install name %s\n", archName.c_str(), aFile.runtimePath.c_str());
+ // <rdar://problem/46431467> if a dylib moves and a symlink is installed into its place, bom iterator will see both and issue a warning
+ struct stat statBuf;
+ bool isSymLink = ( (lstat(aFile.runtimePath.c_str(), &statBuf) == 0) && S_ISLNK(statBuf.st_mode) );
+ if (!isSymLink && warn) fprintf(stderr, "update_dyld_shared_cache: warning: %s skipping because of duplicate install name %s\n", archName.c_str(), aFile.runtimePath.c_str());
return true;
}
}
for (DyldSharedCache::MappedMachO& aFile : fileSet.dylibsForCache) {
- if ( dontCache(volumePrefix, fileSet.archName, pathsWithDuplicateInstallName, aFile, true, skipDylibs) )
- fileSet.otherDylibsAndBundles.push_back(aFile);
+ if ( dontCache(volumePrefix, fileSet.archName, pathsWithDuplicateInstallName, aFile, true, skipDylibs) ) {
+ // <rdar://problem/46423929> don't build dlopen closures for symlinks to something in the dyld cache
+ if ( pathsWithDuplicateInstallName.count(aFile.runtimePath) == 0 )
+ fileSet.otherDylibsAndBundles.push_back(aFile);
+ }
}
fileSet.dylibsForCache.erase(std::remove_if(fileSet.dylibsForCache.begin(), fileSet.dylibsForCache.end(),
[&](const DyldSharedCache::MappedMachO& aFile) { return dontCache(volumePrefix, fileSet.archName, pathsWithDuplicateInstallName, aFile, false, skipDylibs); }),