From 35328ed5351a7df7f3fe09fb23d2d23bb088017a Mon Sep 17 00:00:00 2001 From: rmnull Date: Tue, 23 Jun 2020 03:18:29 +0530 Subject: [PATCH] [draft] refactoring keg_relocate to use ELFShim#interpreter instead of .with_interpreter? --- .../Homebrew/extend/os/linux/keg_relocate.rb | 17 +++++----- Library/Homebrew/os/linux/elf.rb | 34 ++++++++----------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/Library/Homebrew/extend/os/linux/keg_relocate.rb b/Library/Homebrew/extend/os/linux/keg_relocate.rb index 5371e2ab1e051..a707898c03e8d 100644 --- a/Library/Homebrew/extend/os/linux/keg_relocate.rb +++ b/Library/Homebrew/extend/os/linux/keg_relocate.rb @@ -27,6 +27,7 @@ def change_rpath(file, old_prefix, new_prefix) # patchelf requires that the ELF file have a .dynstr section. # Skip ELF files that do not have a .dynstr section. return if ["cannot find section .dynstr", "strange: no string table"].include?(old_rpath) + unless $CHILD_STATUS.success? raise ErrorDuringExecution.new(cmd_rpath, status: $CHILD_STATUS, output: [[:stderr, old_rpath]]) end @@ -41,15 +42,15 @@ def change_rpath(file, old_prefix, new_prefix) new_rpath = rpath.join(":") cmd = [patchelf, "--force-rpath", "--set-rpath", new_rpath] - if file.with_interpreter? - old_interpreter = Utils.safe_popen_read(patchelf, "--print-interpreter", file).strip - new_interpreter = if File.readable? "#{new_prefix}/lib/ld.so" - "#{new_prefix}/lib/ld.so" - else - old_interpreter.sub old_prefix, new_prefix - end - cmd << "--set-interpreter" << new_interpreter if old_interpreter != new_interpreter + old_interpreter = file.interpreter + new_interpreter = if old_interpreter.nil? + nil + elsif File.readable? "#{new_prefix}/lib/ld.so" + "#{new_prefix}/lib/ld.so" + else + old_interpreter.sub old_prefix, new_prefix end + cmd << "--set-interpreter" << new_interpreter if old_interpreter != new_interpreter return if old_rpath == new_rpath && old_interpreter == new_interpreter diff --git a/Library/Homebrew/os/linux/elf.rb b/Library/Homebrew/os/linux/elf.rb index 83cd6e89826b9..51a12402075bc 100644 --- a/Library/Homebrew/os/linux/elf.rb +++ b/Library/Homebrew/os/linux/elf.rb @@ -68,28 +68,24 @@ def binary_executable? elf_type == :executable end - def with_interpreter? - return @with_interpreter if defined? @with_interpreter + def interpreter + return @interpreter if defined? @interpreter - @with_interpreter = if binary_executable? - true - elsif dylib? - if HOMEBREW_PATCHELF_RB - begin - patchelf_patcher.interpreter.present? - rescue PatchELF::PatchError => e - opoo e unless e.to_s.start_with? "No interpreter found" - 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 ") - else - raise "Please install either readelf (from binutils) or file." + @interpreter = if HOMEBREW_PATCHELF_RB + begin + patchelf_patcher.interpreter + rescue PatchELF::PatchError => e + opoo e unless e.to_s.start_with? "No interpreter found" + nil end + elsif (patchelf = DevelopmentTools.locate "patchelf") + interp = Utils.popen_read(patchelf, "--print-interpreter", to_s, err: :out).strip + $CHILD_STATUS.success? ? interp : nil + elsif (file = DevelopmentTools.locate("file")) + output = Utils.popen_read(file, "-L", "-b", to_s, err: :out).strip + output[/^ELF.*, interpreter (.+?), /, 1] else - false + raise "Please install either patchelf or file." end end