in lib/omnibus/health_check.rb [242:285]
def relocation_check
conflict_map = {}
embedded_bin = "#{project.install_dir}/embedded/bin"
Dir.glob("#{embedded_bin}/*.dll") do |lib_path|
log.debug(log_key) { "Analyzing dependencies for #{lib_path}" }
File.open(lib_path, "rb") do |f|
dump = PEdump.new(lib_path)
pe = dump.pe f
next if windows_arch_i386? == pe.x64?
lib_name = File.basename(lib_path)
base = pe.ioh.ImageBase
size = pe.ioh.SizeOfImage
conflicts = []
conflict_map.each do |candidate_name, details|
unless details[:base] >= base + size ||
details[:base] + details[:size] <= base
details[:conflicts] << lib_name
conflicts << candidate_name
end
end
conflict_map[lib_name] = {
base: base,
size: size,
conflicts: conflicts,
}
log.debug(log_key) { "Discovered #{lib_name} at #{hex} + #{hex}" % [ base, size ] }
end
end
conflict_map.delete_if do |lib_name, details|
details[:conflicts].empty?
end
end