2009-03-29 07:30:54 +00:00
|
|
|
#!/usr/bin/env ruby
|
|
|
|
# This file is part of Metasm, the Ruby assembly manipulation suite
|
2010-09-09 18:19:35 +00:00
|
|
|
# Copyright (C) 2006-2009 Yoann GUILLOT
|
2009-03-29 07:30:54 +00:00
|
|
|
#
|
|
|
|
# Licence is LGPL, see LICENCE in the top-level directory
|
|
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
# this script reads a list of elf files, and lists its dependencies recursively
|
|
|
|
# libraries are searched in LD_LIBRARY_PATH, /usr/lib and /lib
|
|
|
|
# includes the elf interpreter
|
|
|
|
# can be useful when chrooting a binary
|
|
|
|
#
|
|
|
|
|
|
|
|
require 'metasm'
|
|
|
|
|
|
|
|
|
|
|
|
paths = ENV['LD_LIBRARY_PATH'].to_s.split(':') + %w[/usr/lib /lib]
|
|
|
|
todo = ARGV.map { |file| (file[0] == ?/) ? file : "./#{file}" }
|
|
|
|
done = []
|
|
|
|
while src = todo.shift
|
2013-08-30 21:28:33 +00:00
|
|
|
puts src
|
|
|
|
# could do a simple ELF.decode_file, but this is quicker
|
|
|
|
elf = Metasm::ELF.decode_file_header(src)
|
|
|
|
|
|
|
|
if s = elf.segments.find { |s_| s_.type == 'INTERP' }
|
|
|
|
interp = elf.encoded[s.offset, s.filesz].data.chomp("\0")
|
|
|
|
if not done.include? interp
|
|
|
|
puts interp
|
|
|
|
done << interp
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
elf.decode_tags
|
|
|
|
elf.decode_segments_tags_interpret
|
|
|
|
deps = elf.tag['NEEDED'].to_a - done
|
|
|
|
done.concat deps
|
|
|
|
|
|
|
|
deps.each { |dep|
|
|
|
|
if not path = paths.find { |path_| File.exist? File.join(path_, dep) }
|
|
|
|
$stderr.puts "cannot find #{dep} for #{src}"
|
|
|
|
else
|
|
|
|
todo << File.join(path, dep)
|
|
|
|
end
|
|
|
|
}
|
2009-03-29 07:30:54 +00:00
|
|
|
end
|