AutoBuild: fixup_patchelf started at 2025-05-13-14UTC (#11903)

* Adjust fixup and fix_interpreter_path to not break custom rpaths in packages.

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

* Add more documentation

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

---------

Signed-off-by: Satadru Pramanik <satadru@gmail.com>
Co-authored-by: Satadru Pramanik <satadru@gmail.com>
This commit is contained in:
github-actions[bot]
2025-05-13 15:24:59 -05:00
committed by GitHub
parent 1622b34370
commit def2a6c281
3 changed files with 66 additions and 18 deletions

View File

@@ -12,6 +12,7 @@ require_gem('ptools')
require 'digest/sha2' require 'digest/sha2'
require 'fileutils' require 'fileutils'
require 'mkmf' require 'mkmf'
require 'open3'
require 'tmpdir' require 'tmpdir'
require 'uri' require 'uri'
begin begin
@@ -895,18 +896,38 @@ def fix_interpreter_path(dir)
puts 'Running upx to uncompress binaries and patchelf to patch binary interpreter paths.'.lightblue puts 'Running upx to uncompress binaries and patchelf to patch binary interpreter paths.'.lightblue
abort('No Patchelf found!').lightred unless File.file?("#{CREW_PREFIX}/bin/patchelf") abort('No Patchelf found!').lightred unless File.file?("#{CREW_PREFIX}/bin/patchelf")
abort('No Upx found!').lightred unless File.file?("#{CREW_PREFIX}/bin/upx") abort('No Upx found!').lightred unless File.file?("#{CREW_PREFIX}/bin/upx")
execfiles = `find . -executable -type f ! \\( -name '*.a' \\) | xargs -P#{CREW_NPROC} -n1 sh -c '[ "$(head -c4 ${1})" = "\x7FELF" ] && echo ${1}' --`.chomp # Look for installed binaries and libraries in the package install
# directory tree.
execfiles = `find #{Dir.pwd} -executable -type f ! \\( -name '*.a' \\) | xargs -P#{CREW_NPROC} -n1 sh -c '[ "$(head -c4 ${1})" = "\x7FELF" ] && echo ${1}' -- 2> /dev/null`.split
return if execfiles.empty? return if execfiles.empty?
execfiles.each_line(chomp: true) do |execfiletopatch| @localdir = File.expand_path('../../.')
execfiletopatch = Dir.pwd + execfiletopatch.delete_prefix('.') execfiles.each do |execfiletopatch|
next unless File.file?(execfiletopatch)
system "upx -qq -d #{execfiletopatch} 2> /dev/null" # Decompress the binary if compressed.
puts "Running patchelf on #{execfiletopatch}".orange if CREW_DEBUG system "upx -qq -d #{execfiletopatch}", %i[err] => File::NULL
system "patchelf --set-interpreter #{CREW_GLIBC_INTERPRETER} #{execfiletopatch} > /dev/null 2> /dev/null" # Check for existing interpreter.
@exec_rpath = `patchelf --print-rpath #{execfiletopatch}`.chomp @interpreter, _read_interpreter_stderr_s, @read_interpreter_status = Open3.capture3("patchelf --print-interpreter #{execfiletopatch}")
puts "#{execfiletopatch} has an existing rpath of #{@exec_rpath}".orange unless @exec_rpath.empty? # Set interpreter unless the interpreter read failed or is already
# system "patchelf --remove-rpath #{execfiletopatch} > /dev/null 2> /dev/null" # set appropriately.
unless @read_interpreter_status && @interpreter == CREW_GLIBC_INTERPRETER
puts "Running patchelf on #{execfiletopatch} to set interpreter".orange if CREW_VERBOSE
_set_interpreter_stdout, @set_interpreter_stderr = Open3.capture3("patchelf --set-interpreter #{CREW_GLIBC_INTERPRETER} #{execfiletopatch}")
puts "#{execfiletopatch}: @set_interpreter_stderr: #{@set_interpreter_stderr.chomp}".lightpurple if !@set_interpreter_stderr.blank? && CREW_VERBOSE
end
# Try to read any existing rpath.
@read_rpath_stdout_s, @read_rpath_stderr_s, @read_rpath_status = Open3.capture3("patchelf --print-rpath #{execfiletopatch}")
@exec_rpath = @read_rpath_stdout_s.chomp
@rpath_status = @read_rpath_status
puts "#{execfiletopatch}: @read_rpath_stderr_s: #{@read_rpath_stderr_s}".lightpurple if !@read_rpath_stderr_s.blank? && CREW_VERBOSE
# Set rpath if rpath read didn't fail, an rpath exists, and does not
# already contain CREW_GLIBC_PREFIX.
next if !@read_rpath_rpath_status || @exec_rpath.blank? || @exec_rpath.include?(CREW_GLIBC_PREFIX)
puts "#{execfiletopatch.gsub(@localdir, '')} has an existing rpath of #{@exec_rpath}".lightpurple if CREW_VERBOSE
puts "Prefixing #{CREW_GLIBC_PREFIX} to #{@exec_rpath} rpath for #{execfiletopatch.gsub(@localdir, '')}.".lightblue
@set_rpath_stdout_s, @set_rpath_stderr_s, @set_rpath_status = Open3.capture3("patchelf --set-rpath #{CREW_GLIBC_PREFIX}:#{@exec_rpath} #{execfiletopatch}")
puts "#{execfiletopatch}: @set_rpath_stderr_s: #{@set_rpath_stderr_s}".lightpurple if !@set_rpath_stderr_s.blank? && CREW_VERBOSE
end end
end end
end end

View File

@@ -3,7 +3,7 @@
require 'etc' require 'etc'
OLD_CREW_VERSION ||= defined?(CREW_VERSION) ? CREW_VERSION : '1.0' OLD_CREW_VERSION ||= defined?(CREW_VERSION) ? CREW_VERSION : '1.0'
CREW_VERSION ||= '1.60.6' unless defined?(CREW_VERSION) && CREW_VERSION == OLD_CREW_VERSION CREW_VERSION ||= '1.60.7' unless defined?(CREW_VERSION) && CREW_VERSION == OLD_CREW_VERSION
# Kernel architecture. # Kernel architecture.
KERN_ARCH ||= Etc.uname[:machine] KERN_ARCH ||= Etc.uname[:machine]

View File

@@ -2,10 +2,12 @@
# Add fixups to be run during crew update here. # Add fixups to be run during crew update here.
require 'etc' require 'etc'
require 'json' require 'json'
require 'open3'
require_relative 'color' require_relative 'color'
require_relative 'package' require_relative 'package'
require_relative 'require_gem' require_relative 'require_gem'
require_gem('activesupport', 'active_support/core_ext/object/blank')
require_gem('highline') require_gem('highline')
# All needed constants & variables should be defined here in case they # All needed constants & variables should be defined here in case they
@@ -255,15 +257,40 @@ unless installed_pkgs_to_deprecate.empty?
end end
if File.exist?("#{CREW_PREFIX}/bin/upx") && File.exist?("#{CREW_PREFIX}/bin/patchelf") if File.exist?("#{CREW_PREFIX}/bin/upx") && File.exist?("#{CREW_PREFIX}/bin/patchelf")
# Decompress all upx-compressed libraries puts 'Running upx to uncompress binaries and patchelf to patch binary interpreter paths.'.lightblue
puts 'Decompressing binaries with upx...'.yellow abort('No Patchelf found!').lightred unless File.file?("#{CREW_PREFIX}/bin/patchelf")
system "find #{CREW_PREFIX}/bin -type f -executable -print | xargs -P#{CREW_NPROC} -n1 upx -qq -d 2> /dev/null" abort('No Upx found!').lightred unless File.file?("#{CREW_PREFIX}/bin/upx")
system "find #{CREW_LIB_PREFIX} -type f -executable -print | xargs -P#{CREW_NPROC} -n1 upx -qq -d 2> /dev/null" # Look for installed binaries and libraries in /usr/local and the lib
# prefix directories.
execfiles = `find #{CREW_PREFIX}/bin #{CREW_LIB_PREFIX} -executable -type f ! \\( -name '*.a' \\) | xargs -P#{CREW_NPROC} -n1 sh -c '[ "$(head -c4 ${1})" = "\x7FELF" ] && echo ${1}' -- 2> /dev/null`.split
return if execfiles.empty?
# Switch to glibc_standalone if installed execfiles.each do |execfiletopatch|
puts 'Switching to glibc_standalone for all installed executables...'.yellow next unless File.file?(execfiletopatch)
system "find #{CREW_PREFIX}/bin -type f -executable -print | xargs -P#{CREW_NPROC} -n1 patchelf --set-interpreter #{CREW_GLIBC_INTERPRETER} 2> /dev/null" # Decompress the binary if compressed.
system "find #{CREW_PREFIX}/bin -type f -executable -print | xargs -P#{CREW_NPROC} -n1 patchelf --remove-rpath 2> /dev/null" system "upx -qq -d #{execfiletopatch}", %i[err] => File::NULL
# Check for existing interpreter.
@interpreter, _read_interpreter_stderr_s, @read_interpreter_status = Open3.capture3("patchelf --print-interpreter #{execfiletopatch}")
# Set interpreter unless the interpreter read failed or is already
# set appropriately.
unless @read_interpreter_status && @interpreter == CREW_GLIBC_INTERPRETER
puts "Running patchelf on #{execfiletopatch} to set interpreter".orange if CREW_VERBOSE
_set_interpreter_stdout, @set_interpreter_stderr = Open3.capture3("patchelf --set-interpreter #{CREW_GLIBC_INTERPRETER} #{execfiletopatch}")
puts "#{execfiletopatch}: @set_interpreter_stderr: #{@set_interpreter_stderr.chomp}".lightpurple if !@set_interpreter_stderr.blank? && CREW_VERBOSE
end
# Try to read any existing rpath.
@read_rpath_stdout_s, @read_rpath_stderr_s, @read_rpath_status = Open3.capture3("patchelf --print-rpath #{execfiletopatch}")
@exec_rpath = @read_rpath_stdout_s.chomp
@rpath_status = @read_rpath_status
puts "#{execfiletopatch}: @read_rpath_stderr_s: #{@read_rpath_stderr_s}".lightpurple if !@read_rpath_stderr_s.blank? && CREW_VERBOSE
# Set rpath if rpath read didn't fail, an rpath exists, and does not
# already contain CREW_GLIBC_PREFIX.
next if !@read_rpath_rpath_status || @exec_rpath.blank? || @exec_rpath.include?(CREW_GLIBC_PREFIX)
puts "#{execfiletopatch} has an existing rpath of #{@exec_rpath}".lightpurple if CREW_VERBOSE
puts "Prefixing #{CREW_GLIBC_PREFIX} to #{@exec_rpath} rpath for #{execfiletopatch}.".lightblue
@set_rpath_stdout_s, @set_rpath_stderr_s, @set_rpath_status = Open3.capture3("patchelf --set-rpath #{CREW_GLIBC_PREFIX}:#{@exec_rpath} #{execfiletopatch}")
puts "#{execfiletopatch}: @set_rpath_stderr_s: #{@set_rpath_stderr_s}".lightpurple if !@set_rpath_stderr_s.blank? && CREW_VERBOSE
end
else else
abort 'Please install upx and patchelf first by running \'crew install upx patchelf\'.'.lightred abort 'Please install upx and patchelf first by running \'crew install upx patchelf\'.'.lightred
end end