Merge pull request #15769 from carlocab/resolve-rpath
os/mac/mach: resolve rpaths too
This commit is contained in:
commit
4c612ab324
@ -89,18 +89,15 @@ module MachOShim
|
|||||||
|
|
||||||
def dynamically_linked_libraries(except: :none, resolve_variable_references: true)
|
def dynamically_linked_libraries(except: :none, resolve_variable_references: true)
|
||||||
lcs = macho.dylib_load_commands.reject { |lc| lc.type == except }
|
lcs = macho.dylib_load_commands.reject { |lc| lc.type == except }
|
||||||
|
|
||||||
names = lcs.map(&:name).map(&:to_s).uniq
|
names = lcs.map(&:name).map(&:to_s).uniq
|
||||||
|
names.map!(&method(:resolve_variable_name)) if resolve_variable_references
|
||||||
names.map! { |name| resolve_variable_name(name) } if resolve_variable_references
|
|
||||||
|
|
||||||
names
|
names
|
||||||
end
|
end
|
||||||
|
|
||||||
def rpaths(resolve_variable_references: true)
|
def rpaths(resolve_variable_references: true)
|
||||||
names = macho.rpaths
|
names = macho.rpaths
|
||||||
|
names.map!(&method(:resolve_variable_name)) if resolve_variable_references
|
||||||
names.map! { |name| resolve_variable_name(name) } if resolve_variable_references
|
|
||||||
|
|
||||||
names
|
names
|
||||||
end
|
end
|
||||||
@ -110,11 +107,22 @@ module MachOShim
|
|||||||
Pathname(name.sub("@loader_path", dirname)).cleanpath.to_s
|
Pathname(name.sub("@loader_path", dirname)).cleanpath.to_s
|
||||||
elsif name.start_with?("@executable_path") && binary_executable?
|
elsif name.start_with?("@executable_path") && binary_executable?
|
||||||
Pathname(name.sub("@executable_path", dirname)).cleanpath.to_s
|
Pathname(name.sub("@executable_path", dirname)).cleanpath.to_s
|
||||||
|
elsif name.start_with?("@rpath") && (target = resolve_rpath(name)).present?
|
||||||
|
target
|
||||||
else
|
else
|
||||||
name
|
name
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def resolve_rpath(name)
|
||||||
|
target = T.let(nil, T.nilable(String))
|
||||||
|
return unless rpaths(resolve_variable_references: true).find do |rpath|
|
||||||
|
File.exist?(target = File.join(rpath, name.delete_prefix("@rpath")))
|
||||||
|
end
|
||||||
|
|
||||||
|
target
|
||||||
|
end
|
||||||
|
|
||||||
def archs
|
def archs
|
||||||
mach_data.map { |m| m.fetch :arch }
|
mach_data.map { |m| m.fetch :arch }
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user