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