Revert "Binary patching of build prefixes"

This commit is contained in:
Mike McQuaid 2022-02-14 10:55:08 +00:00 committed by GitHub
parent a831962afe
commit a37f24f439
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 9 additions and 125 deletions

View File

@ -183,14 +183,4 @@ class Keg
# it's wrong. -O is a BSD-grep-only option.
"-lrO"
end
def egrep_args
grep_bin = "egrep"
grep_args = recursive_fgrep_args
[grep_bin, grep_args]
end
def codesign_patched_binary(binary_file)
apply_ad_hoc_signature(binary_file)
end
end

View File

@ -1230,10 +1230,6 @@ class FormulaInstaller
keg = Keg.new(formula.prefix)
skip_linkage = formula.bottle_specification.skip_relocation?
keg.replace_placeholders_with_locations tab.changed_files, skip_linkage: skip_linkage
return if formula.bottle_specification.skip_prefix_relocation?
keg.relocate_build_prefix(keg, Utils::Bottles.tag.default_prefix, HOMEBREW_PREFIX)
end
sig { params(output: T.nilable(String)).void }

View File

@ -8,7 +8,6 @@ class Keg
LIBRARY_PLACEHOLDER = "@@HOMEBREW_LIBRARY@@"
PERL_PLACEHOLDER = "@@HOMEBREW_PERL@@"
JAVA_PLACEHOLDER = "@@HOMEBREW_JAVA@@"
BINARY_NULL_CHARACTER = "\x00"
class Relocation
extend T::Sig
@ -164,49 +163,6 @@ class Keg
changed_files
end
def relocate_build_prefix(keg, old_prefix, new_prefix)
# Find binaries which match prefix strings.
string_matches = Set.new
keg.each_unique_file_matching(old_prefix) do |file|
string_matches << file
end
binary_string_matches = Set.new
keg.each_unique_binary_file do |file|
binary_string_matches << file if string_matches.include?(file)
end
# Only consider string matches which are binary files with null bytes, and remove any
# matches which are sharballs found by text_files.
binary_string_matches -= text_files
# Split binary by null characters into array and substitute new cellar for old cellar.
# Null padding is added if the new string is too short.
binary_string_matches.each do |binary_file|
binary_file.ensure_writable do
binary = File.binread binary_file
puts "Replacing build prefix in: #{binary_file}"
binary_strings = binary.split(BINARY_NULL_CHARACTER)
match_indices = binary_strings.each_index.select { |i| binary_strings[i].include?(old_prefix) }
# Only perform substitution on strings which match prefix regex.
match_indices.each do |i|
s = binary_strings[i]
binary_strings[i] = s.gsub(old_prefix, new_prefix).ljust(s.size, BINARY_NULL_CHARACTER)
end
# Add back null padding at the end of the binary if needed.
patched_binary = binary_strings.join(BINARY_NULL_CHARACTER).ljust(binary.size, BINARY_NULL_CHARACTER)
if patched_binary.size != binary.size
raise "Patching failed! Original and patched binary sizes do not match."
end
binary_file.atomic_write patched_binary
end
codesign_patched_binary(binary_file)
end
end
def detect_cxx_stdlibs(_options = {})
[]
end
@ -217,45 +173,17 @@ class Keg
end
alias generic_recursive_fgrep_args recursive_fgrep_args
def egrep_args
grep_bin = "grep"
grep_args = recursive_fgrep_args
grep_args += "Pa"
[grep_bin, grep_args]
end
alias generic_egrep_args egrep_args
def each_unique_file(io)
def each_unique_file_matching(string)
Utils.popen_read("fgrep", recursive_fgrep_args, string, to_s) do |io|
hardlinks = Set.new
until io.eof?
file = Pathname.new(io.readline.chomp)
# Don't yield symlinks
next if file.symlink?
# Only yield a file if it has a unique inode.
# This makes sure we don't yield hardlinks.
yield file if hardlinks.add? file.stat.ino
end
end
def each_unique_file_matching(string)
Utils.popen_read("fgrep", recursive_fgrep_args, string, to_s) do |io|
each_unique_file(io)
end
end
def each_unique_binary_file
grep_bin, grep_args = egrep_args
# An extra \ is needed for the null character when calling grep
Utils.popen_read(grep_bin, grep_args, "\#{BINARY_NULL_CHARACTER}", to_s) do |io|
each_unique_file(io)
end
end
def codesign_patched_binary(_binary_file)
[]
end
def lib

View File

@ -347,11 +347,6 @@ class Bottle
@spec.compatible_locations?(tag: @tag)
end
# Should the build prefix be relocated?
def skip_prefix_relocation?
@spec.skip_prefix_relocation?(tag: @tag)
end
# Does the bottle need to be relocated?
def skip_relocation?
@spec.skip_relocation?(tag: @tag)
@ -478,8 +473,6 @@ class Bottle
end
class BottleSpecification
RELOCATABLE_CELLARS = [:any, :any_skip_relocation].freeze
extend T::Sig
attr_rw :rebuild
@ -520,30 +513,7 @@ class BottleSpecification
tag.default_cellar
end
return true if RELOCATABLE_CELLARS.include?(cellar)
prefix = Pathname(cellar).parent.to_s
cellar_relocatable = cellar.size >= HOMEBREW_CELLAR.to_s.size && ENV["HOMEBREW_RELOCATE_BUILD_PREFIX"]
prefix_relocatable = prefix.size >= HOMEBREW_PREFIX.to_s.size && ENV["HOMEBREW_RELOCATE_BUILD_PREFIX"]
compatible_cellar = cellar == HOMEBREW_CELLAR.to_s || cellar_relocatable
compatible_prefix = prefix == HOMEBREW_PREFIX.to_s || prefix_relocatable
compatible_cellar && compatible_prefix
end
# Should the build prefix for the {Bottle} this {BottleSpecification} belongs to be relocated?
sig { params(tag: Utils::Bottles::Tag).returns(T::Boolean) }
def skip_prefix_relocation?(tag: Utils::Bottles.tag)
spec = collector.specification_for(tag)
cellar = if spec.present?
spec.cellar
else
tag.default_cellar
end
return true if RELOCATABLE_CELLARS.include?(cellar)
return true if [:any, :any_skip_relocation].include?(cellar)
prefix = Pathname(cellar).parent.to_s