Merge pull request #7213 from rmNULL/linux-shelless-elftools

Use patchelf.rb to set interpreter instead of patchelf. First step towards shelless elftools
This commit is contained in:
Mike McQuaid 2020-08-28 08:31:39 +01:00 committed by GitHub
commit f908b355b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 36 additions and 12 deletions

View File

@ -18,10 +18,7 @@ class Keg
def change_rpath(file, old_prefix, new_prefix) def change_rpath(file, old_prefix, new_prefix)
return if !file.elf? || !file.dynamic_elf? return if !file.elf? || !file.dynamic_elf?
patchelf = DevelopmentTools.locate "patchelf" updated = {}
odie "Could not locate patchelf, please: brew install patchelf." if patchelf.nil?
cmd = [patchelf]
old_rpath = file.rpath old_rpath = file.rpath
new_rpath = if old_rpath new_rpath = if old_rpath
rpath = old_rpath.split(":") rpath = old_rpath.split(":")
@ -30,11 +27,10 @@ class Keg
lib_path = "#{new_prefix}/lib" lib_path = "#{new_prefix}/lib"
rpath << lib_path unless rpath.include? lib_path rpath << lib_path unless rpath.include? lib_path
new_rpath = rpath.join(":")
cmd.push "--force-rpath", "--set-rpath", new_rpath
new_rpath rpath.join(":")
end end
updated[:rpath] = new_rpath if old_rpath != new_rpath
old_interpreter = file.interpreter old_interpreter = file.interpreter
new_interpreter = if old_interpreter.nil? new_interpreter = if old_interpreter.nil?
@ -44,11 +40,9 @@ class Keg
else else
old_interpreter.sub old_prefix, new_prefix old_interpreter.sub old_prefix, new_prefix
end end
cmd << "--set-interpreter" << new_interpreter if old_interpreter != new_interpreter updated[:interpreter] = new_interpreter if old_interpreter != new_interpreter
return if old_rpath == new_rpath && old_interpreter == new_interpreter file.patch!(interpreter: updated[:interpreter], rpath: updated[:rpath])
safe_system(*cmd, file)
end end
def detect_cxx_stdlibs(options = {}) def detect_cxx_stdlibs(options = {})

View File

@ -98,6 +98,16 @@ module ELFShim
@interpreter = patchelf_patcher.interpreter @interpreter = patchelf_patcher.interpreter
end end
def patch!(interpreter: nil, rpath: nil)
return if interpreter.blank? && rpath.blank?
if HOMEBREW_PATCHELF_RB_WRITE
save_using_patchelf_rb interpreter, rpath
else
save_using_patchelf interpreter, rpath
end
end
def dynamic_elf? def dynamic_elf?
return @dynamic_elf if defined? @dynamic_elf return @dynamic_elf if defined? @dynamic_elf
@ -148,13 +158,30 @@ module ELFShim
end end
private_constant :Metadata private_constant :Metadata
def save_using_patchelf(new_interpreter, new_rpath)
patchelf = DevelopmentTools.locate "patchelf"
odie "Could not locate patchelf, please: brew install patchelf." if patchelf.blank?
args = []
args << "--set-interpreter" << new_interpreter if new_interpreter.present?
args << "--force-rpath" << "--set-rpath" << new_rpath if new_rpath.present?
Homebrew.safe_system(patchelf, *args, to_s)
end
def save_using_patchelf_rb(new_interpreter, new_rpath)
patcher = patchelf_patcher
patcher.interpreter = new_interpreter if new_interpreter.present?
patcher.rpath = new_rpath if new_rpath.present?
patcher.save(patchelf_compatible: true)
end
def rpath_using_patchelf_rb def rpath_using_patchelf_rb
patchelf_patcher.runpath || patchelf_patcher.rpath patchelf_patcher.runpath || patchelf_patcher.rpath
end end
def patchelf_patcher def patchelf_patcher
require "patchelf" require "patchelf"
@patchelf_patcher ||= PatchELF::Patcher.new to_s, on_error: :silent @patchelf_patcher ||= ::PatchELF::Patcher.new to_s, on_error: :silent
end end
def metadata def metadata

View File

@ -1,5 +1,8 @@
# frozen_string_literal: true # frozen_string_literal: true
# enables experimental patchelf.rb write support.
HOMEBREW_PATCHELF_RB_WRITE = ENV["HOMEBREW_PATCHELF_RB_WRITE"].present?.freeze
module Homebrew module Homebrew
DEFAULT_PREFIX ||= if Homebrew::EnvConfig.force_homebrew_on_linux? DEFAULT_PREFIX ||= if Homebrew::EnvConfig.force_homebrew_on_linux?
HOMEBREW_DEFAULT_PREFIX HOMEBREW_DEFAULT_PREFIX