From 3ab93b6e2b002066b3d13dee0d15cb2dc4ece962 Mon Sep 17 00:00:00 2001 From: Cheng XU Date: Wed, 17 Jul 2019 16:57:01 +0800 Subject: [PATCH 1/2] elf: fix caching of dynamic_elf? --- Library/Homebrew/os/linux/elf.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/os/linux/elf.rb b/Library/Homebrew/os/linux/elf.rb index 4e3a99a494..3b4e8f3211 100644 --- a/Library/Homebrew/os/linux/elf.rb +++ b/Library/Homebrew/os/linux/elf.rb @@ -71,7 +71,7 @@ module ELFShim def dynamic_elf? return @dynamic_elf if defined? @dynamic_elf - if which "readelf" + @dynamic_elf = if 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? From 2c82623318010a31f49e9795b15417aec69a8a0a Mon Sep 17 00:00:00 2001 From: Cheng XU Date: Thu, 18 Jul 2019 15:22:09 +0800 Subject: [PATCH 2/2] keg_relocate: relocate the interpreter for elf files with INTERP header (Linux) Some elf files (e.g. created by rust compiler) have INTERP header despite their magic header denotes shared object instead of executable. We should relocate the interpreter elf files as long as they have INTERP header. This should fix the broken bottles for rust based formulae. --- .../Homebrew/extend/os/linux/keg_relocate.rb | 2 +- Library/Homebrew/os/linux/elf.rb | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/extend/os/linux/keg_relocate.rb b/Library/Homebrew/extend/os/linux/keg_relocate.rb index a3da66d279..34fcb9b5cc 100644 --- a/Library/Homebrew/extend/os/linux/keg_relocate.rb +++ b/Library/Homebrew/extend/os/linux/keg_relocate.rb @@ -39,7 +39,7 @@ class Keg new_rpath = rpath.join(":") cmd = [patchelf, "--force-rpath", "--set-rpath", new_rpath] - if file.binary_executable? + 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" diff --git a/Library/Homebrew/os/linux/elf.rb b/Library/Homebrew/os/linux/elf.rb index 3b4e8f3211..4d85ae9858 100644 --- a/Library/Homebrew/os/linux/elf.rb +++ b/Library/Homebrew/os/linux/elf.rb @@ -68,6 +68,24 @@ module ELFShim elf_type == :executable end + def with_interpreter? + return @with_interpreter if defined? @with_interpreter + + @with_interpreter = if binary_executable? + true + elsif dylib? + if 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." + end + else + false + end + end + def dynamic_elf? return @dynamic_elf if defined? @dynamic_elf