In ELFShim, #needed_libraries, #dynamic_elf? and #with_interpreter? check using patchelf gem.
Having HOMEBREW_PATCHELF_RB set in the ENV, will conditionally install patchelf.rb gem, use patchelf.rb in the above mentioned methods. The installed vendored gems are listed in .gitignore to maintain a clean state.
This commit is contained in:
parent
67c843b91e
commit
486114282c
11
.gitignore
vendored
11
.gitignore
vendored
@ -129,9 +129,6 @@
|
||||
**/vendor/bundle/ruby/*/gems/simplecov-*/
|
||||
**/vendor/bundle/ruby/*/gems/simplecov-cobertura-*/
|
||||
**/vendor/bundle/ruby/*/gems/simplecov-html-*/
|
||||
**/vendor/bundle/ruby/*/gems/sorbet-*/
|
||||
**/vendor/bundle/ruby/*/gems/sorbet-runtime-*/
|
||||
**/vendor/bundle/ruby/*/gems/tapioca-*/
|
||||
**/vendor/bundle/ruby/*/gems/term-ansicolor-*/
|
||||
**/vendor/bundle/ruby/*/gems/thor-*/
|
||||
**/vendor/bundle/ruby/*/gems/tins-*/
|
||||
@ -140,6 +137,14 @@
|
||||
**/vendor/bundle/ruby/*/gems/unicode-display_width-*/
|
||||
**/vendor/bundle/ruby/*/gems/webrobots-*/
|
||||
|
||||
# Ignore conditional dependencies we don't wish to vendor
|
||||
**/vendor/bundle/ruby/*/gems/bindata-*/
|
||||
**/vendor/bundle/ruby/*/gems/elftools-*/
|
||||
**/vendor/bundle/ruby/*/gems/patchelf-*/
|
||||
**/vendor/bundle/ruby/*/gems/sorbet-*/
|
||||
**/vendor/bundle/ruby/*/gems/sorbet-runtime-*/
|
||||
**/vendor/bundle/ruby/*/gems/tapioca-*/
|
||||
|
||||
# Ignore `bin` contents (again).
|
||||
/bin
|
||||
|
||||
|
||||
@ -23,6 +23,7 @@ end
|
||||
gem "activesupport"
|
||||
gem "concurrent-ruby"
|
||||
gem "mechanize"
|
||||
gem "patchelf" if ENV["HOMEBREW_PATCHELF_RB"]
|
||||
gem "plist"
|
||||
gem "rubocop-performance"
|
||||
gem "rubocop-rspec"
|
||||
|
||||
@ -74,7 +74,14 @@ module ELFShim
|
||||
@with_interpreter = if binary_executable?
|
||||
true
|
||||
elsif dylib?
|
||||
if which "readelf"
|
||||
if HOMEBREW_PATCHELF_RB
|
||||
begin
|
||||
patchelf_patcher.interpreter.present?
|
||||
rescue PatchELF::PatchError => e
|
||||
opoo e
|
||||
false
|
||||
end
|
||||
elsif which "readelf"
|
||||
Utils.popen_read("readelf", "-l", to_path).include?(" INTERP ")
|
||||
elsif which "file"
|
||||
Utils.popen_read("file", "-L", "-b", to_path).include?(" interpreter ")
|
||||
@ -89,7 +96,9 @@ module ELFShim
|
||||
def dynamic_elf?
|
||||
return @dynamic_elf if defined? @dynamic_elf
|
||||
|
||||
@dynamic_elf = if which "readelf"
|
||||
@dynamic_elf = if HOMEBREW_PATCHELF_RB
|
||||
patchelf_patcher.instance_variable_get(:@elf).segment_by_type(:DYNAMIC).present?
|
||||
elsif which "readelf"
|
||||
Utils.popen_read("readelf", "-l", to_path).include?(" DYNAMIC ")
|
||||
elsif which "file"
|
||||
!Utils.popen_read("file", "-L", "-b", to_path)[/dynamic|shared/].nil?
|
||||
@ -127,7 +136,9 @@ module ELFShim
|
||||
private
|
||||
|
||||
def needed_libraries(path)
|
||||
if DevelopmentTools.locate "readelf"
|
||||
if HOMEBREW_PATCHELF_RB
|
||||
needed_libraries_using_patchelf_rb path
|
||||
elsif DevelopmentTools.locate "readelf"
|
||||
needed_libraries_using_readelf path
|
||||
elsif DevelopmentTools.locate "patchelf"
|
||||
needed_libraries_using_patchelf path
|
||||
@ -138,6 +149,25 @@ module ELFShim
|
||||
end
|
||||
end
|
||||
|
||||
def needed_libraries_using_patchelf_rb(path)
|
||||
patcher = path.patchelf_patcher
|
||||
return [nil, []] unless patcher
|
||||
|
||||
soname = begin
|
||||
patcher.soname
|
||||
rescue PatchELF::PatchError => e
|
||||
opoo e unless e.to_s.start_with? "Entry DT_SONAME not found, not a shared library?"
|
||||
nil
|
||||
end
|
||||
needed = begin
|
||||
patcher.needed
|
||||
rescue PatchELF::PatchError => e
|
||||
opoo e
|
||||
[]
|
||||
end
|
||||
[soname, needed]
|
||||
end
|
||||
|
||||
def needed_libraries_using_patchelf(path)
|
||||
return [nil, []] unless path.dynamic_elf?
|
||||
|
||||
@ -172,6 +202,16 @@ module ELFShim
|
||||
end
|
||||
end
|
||||
|
||||
def patchelf_patcher
|
||||
return unless HOMEBREW_PATCHELF_RB
|
||||
|
||||
@patchelf_patcher ||= begin
|
||||
Homebrew.install_bundler_gems!
|
||||
require "patchelf"
|
||||
PatchELF::Patcher.new to_s, logging: false
|
||||
end
|
||||
end
|
||||
|
||||
def metadata
|
||||
@metadata ||= Metadata.new(self)
|
||||
end
|
||||
|
||||
@ -1,5 +1,8 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
# enables experimental readelf.rb, patchelf support.
|
||||
HOMEBREW_PATCHELF_RB = ENV["HOMEBREW_PATCHELF_RB"].present?.freeze
|
||||
|
||||
module Homebrew
|
||||
DEFAULT_PREFIX ||= if Homebrew::EnvConfig.force_homebrew_on_linux?
|
||||
HOMEBREW_DEFAULT_PREFIX
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user