Skip to content

Instantly share code, notes, and snippets.

@nasser
Last active December 16, 2015 21:20
Show Gist options
  • Save nasser/5498863 to your computer and use it in GitHub Desktop.
Save nasser/5498863 to your computer and use it in GitHub Desktop.
require 'graphviz'
require 'graphviz/theory'
g = GraphViz.new( :G, :type => :digraph, :layout => 'dot' )
binaries = {}
symbols = {}
nodes = {}
def list_symbols file, exported
`nm #{file} | grep " #{exported ? 'T' : 'U'} "`.split("\n").map { |l| l[/[^\s]+$/] }
end
ARGV.each do |file|
nodes[file] = g.add_nodes( File.basename(file) )
binaries[file] = {}
binaries[file][:exported] = list_symbols file, true
binaries[file][:undefined] = list_symbols file, false
binaries[file][:exported].each do |symbol|
symbols[symbol] = file
end
end
binaries.each do |file, dic|
dic[:undefined].each do |sym|
next unless symbols[sym]
g.add_edges(nodes[file], nodes[symbols[sym]]) unless nodes[file].neighbors.any? { |e| e == nodes[symbols[sym]] }
end
end
g.output( :png => "graph.png" )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment