blob: 375dc7e4193eead62a24fb77ab5a9d0570d47af8 [file] [log] [blame]
#!/bin/bash
#
# Copyright 2017 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the 'License');
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an 'AS IS' BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Create a callgraph from an x86 or x86-64 binary.
#
# Example Usage:
# cobalt/tools/binary_to_callgraph.sh out/linux-x64x11_debug/cobalt > callgraph.txt
#
# TODO: It'd be cool to include "...->PostTask(...)" stuff in here too.
# TODO: It'd be cool to output to a sqlite database instead of text, and then
# have a command line program to search through it.
# TODO: It'd be cool to support ARM and MIPS too.
set -e
objdump -d "$1" |
python3 -c '
import collections
import re
import sys
caller = None
callee = None
graph = collections.defaultdict(set)
for line in sys.stdin:
m = re.match(r"\w+ <(.*?)>:", line)
if m:
caller = m.group(1)
continue
m = re.match(".*callq?.*?<(.*?)>", line)
if m:
callee = m.group(1)
graph[caller].add(callee)
for key, value in graph.items():
for item in value:
print(key)
print(item)
' | c++filt |
python3 -c '
import sys
buffer = []
for line in sys.stdin:
buffer.append(line.rstrip())
if len(buffer) == 2:
print("{} @@ {}".format(*buffer))
buffer = []
'