Skip to content

Commit

Permalink
Merge pull request #7797 from rmNULL/interpreter-method-for-elfshim
Browse files Browse the repository at this point in the history
Refactoring keg_relocate to use ELFShim#interpreter
  • Loading branch information
woodruffw committed Jun 26, 2020
2 parents db99886 + 35328ed commit b725d65
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 27 deletions.
17 changes: 9 additions & 8 deletions Library/Homebrew/extend/os/linux/keg_relocate.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand Down
34 changes: 15 additions & 19 deletions Library/Homebrew/os/linux/elf.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down

0 comments on commit b725d65

Please sign in to comment.