diff --git a/Library/Homebrew/linkage_checker.rb b/Library/Homebrew/linkage_checker.rb index 55b14339deb78..915352842d9b2 100644 --- a/Library/Homebrew/linkage_checker.rb +++ b/Library/Homebrew/linkage_checker.rb @@ -3,6 +3,7 @@ require "keg" require "formula" require "linkage_cache_store" +require "fiddle" class LinkageChecker attr_reader :undeclared_deps @@ -125,6 +126,11 @@ def check_dylibs(rebuild_cache:) if (dep = dylib_to_dep(dylib)) @broken_deps[dep] |= [dylib] + elsif MacOS.version >= :big_sur && dylib_found_via_dlopen(dylib) + # If we cannot associate the dylib with a dependency, then it may be a system library. + # In macOS Big Sur and later, system libraries do not exist on-disk and instead exist in a cache. + # If dlopen finds the dylib, then the linkage is not broken. + @system_dylibs << dylib else @broken_dylibs << dylib end @@ -151,6 +157,13 @@ def check_dylibs(rebuild_cache:) end alias generic_check_dylibs check_dylibs + def dylib_found_via_dlopen(dylib) + Fiddle.dlopen(dylib).close + true + rescue Fiddle::DLError + false + end + def check_formula_deps filter_out = proc do |dep| next true if dep.build?