new elf fixtures, and basic tests for Pathname#rpath(=), and Pathname#interpreter(=).

This commit is contained in:
rmnull 2020-08-28 18:37:54 +05:30
parent 88f17b8b68
commit f5ca649e1d
No known key found for this signature in database
GPG Key ID: 35BAB82D31EFAD91
7 changed files with 81 additions and 4 deletions

View File

@ -4,19 +4,96 @@ require "extend/pathname"
describe Pathname do describe Pathname do
let(:elf_dir) { described_class.new "#{TEST_FIXTURE_DIR}/elf" } let(:elf_dir) { described_class.new "#{TEST_FIXTURE_DIR}/elf" }
let(:sho) { elf_dir/"libhello.so.0" } let(:sho) { elf_dir/"libforty.so.0" }
let(:exec) { elf_dir/"hello" } let(:sho_without_runpath_rpath) { elf_dir/"libhello.so.0" }
let(:exec) { elf_dir/"hello_with_rpath" }
def patch_elfs
mktmpdir do |tmp_dir|
%w[c.elf cpp.elf go.elf rust.elf].each do |elf|
FileUtils.cp(elf_dir/elf, tmp_dir/elf)
yield tmp_dir/elf
end
end
end
describe "#interpreter" do describe "#interpreter" do
it "returns interpreter" do it "returns interpreter" do
expect(exec.interpreter).to eq "/lib64/ld-linux-x86-64.so.2" expect(exec.interpreter).to eq "/lib64/ld-linux-x86-64.so.2"
end end
it "returns nil when absent" do
expect(sho.interpreter).to be_nil
end
end end
describe "#rpath" do describe "#rpath" do
it "prefers runpath over rpath when both are present" do
expect(sho.rpath).to eq "runpath"
end
it "returns runpath or rpath" do
expect(exec.rpath).to eq "@@HOMEBREW_PREFIX@@/lib"
end
it "returns nil when absent" do it "returns nil when absent" do
expect(exec.rpath).to be_nil expect(sho_without_runpath_rpath.rpath).to be_nil
expect(sho.rpath).to be_nil end
end
describe "#patch!" do
# testing only patchelf.rb as HOMEBREW_PREFIX is different for tests,
# and DevelopmentTools.locate fails to locate patchelf
HOMEBREW_PATCHELF_RB_WRITE = true
let(:placeholder_prefix) { "@@HOMEBREW_PREFIX@@" }
let(:short_prefix) { "/home/dwarf" }
let(:standard_prefix) { "/home/linuxbrew/.linuxbrew" }
let(:long_prefix) { "/home/organized/very organized/litter/more organized than/your words can describe" }
let(:prefixes) { [short_prefix, standard_prefix, long_prefix] }
# file is copied as modified_elf to avoid caching issues
it "only interpreter" do
prefixes.each do |new_prefix|
patch_elfs do |elf|
interpreter = elf.interpreter.gsub(placeholder_prefix, new_prefix)
elf.patch!(interpreter: interpreter)
modified_elf = elf.dirname/"mod.#{elf.basename}"
FileUtils.cp(elf, modified_elf)
expect(modified_elf.interpreter).to eq interpreter
expect(modified_elf.rpath).to eq "@@HOMEBREW_PREFIX@@/lib"
end
end
end
it "only rpath" do
prefixes.each do |new_prefix|
patch_elfs do |elf|
rpath = elf.rpath.gsub(placeholder_prefix, new_prefix)
elf.patch!(rpath: rpath)
modified_elf = elf.dirname/"mod.#{elf.basename}"
FileUtils.cp(elf, modified_elf)
expect(modified_elf.interpreter).to eq "@@HOMEBREW_PREFIX@@/lib/ld.so"
expect(modified_elf.rpath).to eq rpath
end
end
end
it "both" do
prefixes.each do |new_prefix|
patch_elfs do |elf|
interpreter = elf.interpreter.gsub(placeholder_prefix, new_prefix)
rpath = elf.rpath.gsub(placeholder_prefix, new_prefix)
elf.patch!(interpreter: interpreter, rpath: rpath)
modified_elf = elf.dirname/"mod.#{elf.basename}"
FileUtils.cp(elf, modified_elf)
expect(modified_elf.interpreter).to eq interpreter
expect(modified_elf.rpath).to eq rpath
end
end
end end
end end
end end

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.