Module: Prebake::ElfInspector

Defined in:
lib/prebake/elf_inspector.rb

Class Method Summary collapse

Class Method Details

.parse_glibc_version(output) ⇒ Object



39
40
41
42
43
44
# File 'lib/prebake/elf_inspector.rb', line 39

def self.parse_glibc_version(output)
  versions = output.scan(/GLIBC_(\d+(?:\.\d+)+)/).flatten
  return nil if versions.empty?

  versions.max_by { |v| Gem::Version.new(v) }
end

.required_glibc(path) ⇒ Object



30
31
32
33
34
35
36
37
# File 'lib/prebake/elf_inspector.rb', line 30

def self.required_glibc(path)
  return nil unless File.exist?(path)

  output = run_objdump(path)
  return nil if output.nil? || output.empty?

  parse_glibc_version(output)
end

.required_glibc_for_gem(gem_path) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/prebake/elf_inspector.rb', line 11

def self.required_glibc_for_gem(gem_path)
  Dir.mktmpdir("prebake-portability") do |tmpdir|
    Gem::Package.new(gem_path).extract_files(tmpdir)
    versions = Dir.glob(File.join(tmpdir, "**/*.{so,bundle,dll}")).filter_map do |binary|
      next if File.symlink?(binary) || File.size(binary).zero?

      required_glibc(binary)
    end
    return nil if versions.empty?

    versions.max_by { |v| Gem::Version.new(v) }
  end
rescue StandardError => e
  # Malformed gem, missing objdump, or I/O error — treat as unknown, let
  # downstream extraction catch real corruption.
  Logger.debug "Portability inspection failed for #{File.basename(gem_path)}: #{e.message}"
  nil
end

.run_objdump(path) ⇒ Object



46
47
48
49
50
51
52
53
# File 'lib/prebake/elf_inspector.rb', line 46

def self.run_objdump(path)
  out, status = Open3.capture2e("objdump", "-T", path)
  return nil unless status.success?

  out
rescue Errno::ENOENT
  nil
end