Module: Prebake::ElfInspector

Defined in:
lib/prebake/elf_inspector.rb

Class Method Summary collapse

Class Method Details

.libruby_needed?(path) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
# File 'lib/prebake/elf_inspector.rb', line 46

def self.libruby_needed?(path)
  needed_libraries(path).any? { |lib| lib.start_with?("libruby") }
end

.libruby_needed_for_gem?(gem_path) ⇒ Boolean

Returns:

  • (Boolean)


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

def self.libruby_needed_for_gem?(gem_path)
  each_gem_binary(gem_path) { |binary| return true if libruby_needed?(binary) }
  false
rescue StandardError => e
  Logger.debug "libruby inspection failed for #{File.basename(gem_path)}: #{e.message}"
  false
end

.needed_libraries(path) ⇒ Object



50
51
52
53
54
55
56
57
# File 'lib/prebake/elf_inspector.rb', line 50

def self.needed_libraries(path)
  out, status = Open3.capture2e("objdump", "-p", path)
  return [] unless status.success?

  out.scan(/NEEDED\s+(\S+)/).flatten
rescue Errno::ENOENT
  []
end

.parse_glibc_version(output) ⇒ Object



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

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



22
23
24
25
26
27
28
29
# File 'lib/prebake/elf_inspector.rb', line 22

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
# File 'lib/prebake/elf_inspector.rb', line 11

def self.required_glibc_for_gem(gem_path)
  versions = []
  each_gem_binary(gem_path) { |binary| v = required_glibc(binary); versions << v if v }
  versions.empty? ? nil : versions.max_by { |v| Gem::Version.new(v) }
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



59
60
61
62
63
64
65
66
# File 'lib/prebake/elf_inspector.rb', line 59

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

  out
rescue Errno::ENOENT
  nil
end