[WIP] mac/keg_relocate: Emulate dylinker behavior

Instead of assuming that #{lib} is the correct RPATH expansion,
test all RPATHS and substitute the first one that works.
This commit is contained in:
William Woodruff 2018-12-19 19:55:21 -05:00
parent 618c5cd01a
commit 27d6cfb12e
No known key found for this signature in database
GPG Key ID: 600D68320BE45ACC

View File

@ -75,6 +75,20 @@ class Keg
generic_fix_dynamic_linkage
end
def expand_rpath(file, bad_name)
suffix = bad_name.sub(/^@rpath/, "")
# short circuit: we expect lib to be usually correct, so we try it first
return (lib + suffix) if (lib + suffix).exist?
file.rpaths.each do |rpath|
return (rpath + suffix) if (rpath + suffix).exist?
end
opoo "Could not expand an RPATH in #{file}"
bad_name
end
# If file is a dylib or bundle itself, look for the dylib named by
# bad_name relative to the lib directory, so that we can skip the more
# expensive recursive search if possible.
@ -88,7 +102,7 @@ class Keg
elsif file.mach_o_executable? && (lib + bad_name).exist?
"#{lib}/#{bad_name}"
elsif bad_name.start_with? "@rpath"
bad_name.sub("@rpath", lib)
expand_rpath bad_name
elsif (abs_name = find_dylib(bad_name)) && abs_name.exist?
abs_name.to_s
else