#!/bin/bash function check_tool() { tool=$1 cmd=$2 a=`${cmd} 2>/dev/null` if [ ! $? -eq 0 ] ; then echo "${tool} is missing" exit 1 fi } function check_tools() { check_tool "readelf" "readelf --version" check_tool "objdump" "objdump --version" check_tool "c++filt" "c++filt --version" if [ ! -e ./vtable-dumper ] ; then check_tool "git" "git --version" check_tool "make" "make --version" check_tool "g++" "g++ --version" fi } TARGET=$1 readelf_target="${TARGET}.readelf" sections_target="${TARGET}.sections" vtable_target="${TARGET}.vtable" if [ ! -f "${TARGET}" ] ; then echo "$0 " exit 1 fi check_tools if [ ${TARGET} -nt ${readelf_target} ] ; then echo "Regenerating ${readelf_target}" $((readelf -sW ${TARGET}|c++filt > ${readelf_target})) fi if [ ${TARGET} -nt ${sections_target} ] ; then echo "Regenerating ${sections_target}" $((readelf --sections ${TARGET}|c++filt > ${sections_target})) fi VTABLE_ARG="-V ${vtable_target}" if [ ${TARGET} -nt ${vtable_target} ] ; then `objdump -d ${TARGET} 2>/dev/null` if [ ! $? -eq 0 ]; then echo "Unable to do objdump, maybe ${TARGET} is for another platform" VTABLE_ARG="" else if [ ! -e ./vtable-dumper/vtable-dumper ] ; then git clone XXX || exit 1 cd ./vtable-dumper make cd - fi if [ -x ./vtable-dumper/vtable-dumper ] ; then echo "Regenerating ${vtable_target}" $((./vtable-dumper/vtable-dumper --demangle ${TARGET}|c++filt > ${vtable_target})) else echo "./vtable-dumper not available" VTABLE_ARG="" fi fi fi ./InterfaceDiscovery.py -f ${TARGET} -S ${readelf_target} -s ${sections_target} ${VTABLE_ARG} -c