Module: Prebake::ElfInspector
- Defined in:
- lib/prebake/elf_inspector.rb
Class Method Summary collapse
- .parse_glibc_version(output) ⇒ Object
- .required_glibc(path) ⇒ Object
- .required_glibc_for_gem(gem_path) ⇒ Object
- .run_objdump(path) ⇒ Object
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.}" 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 |