mirror of
https://github.com/radareorg/r2ghidra.git
synced 2026-11-07 06:25:57 -10:00
Implement ACR/MAKE build system support ##build (#1)
This commit is contained in:
1 parent
6626930f0d
commit
b73d743e5f
9 files changed
+855
-4
No files matched your search
@@ -0,0 +1,54 @@
|
||||
-include config.mk
|
||||
DESTDIR?=
|
||||
|
||||
all: ghidra/ghidra
|
||||
$(MAKE) -C src
|
||||
$(MAKE) -C src sleigh-build
|
||||
|
||||
help:
|
||||
@echo
|
||||
@echo "./configure # first you need to run configure"
|
||||
@echo "make # build r2ghidra plugins"
|
||||
@echo "make install # install plugin and sleighs into prefix"
|
||||
@echo "make user-install # install in your home"
|
||||
@echo "make uninstall # uninstall r2ghidra from prefix (see user-uninstall)"
|
||||
@echo
|
||||
|
||||
clean:
|
||||
$(MAKE) -C src clean
|
||||
rm -f config.mk
|
||||
|
||||
install:
|
||||
mkdir -p $(DESTDIR)/$(BINDIR)
|
||||
cp -f src/sleighc $(DESTDIR)/$(BINDIR)
|
||||
$(MAKE) -C src install R2_USER_PLUGINS=$(DESTDIR)/$(shell r2 -H R2_LIBR_PLUGINS)
|
||||
$(MAKE) -C src sleigh-install D=$(DESTDIR)/$(DATADIR)/r2ghidra/sleigh
|
||||
|
||||
uninstall:
|
||||
$(MAKE) -C src uninstall R2_USER_PLUGINS=$(DESTDIR)/$(shell r2 -H R2_LIBR_PLUGINS)
|
||||
$(MAKE) -C src sleigh-uninstall D=$(DESTDIR)/$(DATADIR)/r2ghidra/sleigh
|
||||
rm -f $(DESTDIR)/$(BINDIR)/sleighc
|
||||
|
||||
HOMEBIN=$(shell r2 -H R2_RDATAHOME)/prefix/bin
|
||||
|
||||
user-install:
|
||||
mkdir -p $(HOMEBIN)
|
||||
cp -f src/sleighc $(HOMEBIN)
|
||||
$(MAKE) -C src install
|
||||
$(MAKE) -C src sleigh-install
|
||||
|
||||
|
||||
user-uninstall:
|
||||
$(MAKE) -C src uninstall
|
||||
$(MAKE) -C src sleigh-uninstall
|
||||
rm -f $(DESTDIR)/$(BINDIR)/sleighc
|
||||
|
||||
ghidra/ghidra:
|
||||
$(MAKE) -C ghidra
|
||||
|
||||
mrproper: clean
|
||||
rm -rf ghidra/ghidra
|
||||
rm -rf third-party/pugixml
|
||||
$(MAKE) -C src clean
|
||||
|
||||
.PHONY: mrproper clean install uninstall all
|
||||
@@ -13,13 +13,23 @@ This project was presented at r2con 2019 as part of the Cutter talk: [https://yo
|
||||
|
||||
An r2pm package is available that can easily be installed like:
|
||||
```
|
||||
r2pm -i r2ghidra
|
||||
r2pm update
|
||||
r2pm -ci r2ghidra
|
||||
```
|
||||
|
||||
This package only installs the radare2 part.
|
||||
To use r2ghidra from cutter, either use a provided pre-built release starting with
|
||||
Cutter 1.9, which bundles r2ghidra, or follow the build instructions below.
|
||||
|
||||
## Portability
|
||||
|
||||
r2ghidra is known to work on the following operating systems:
|
||||
|
||||
* Termux (Android-arm64)
|
||||
* macOS / iOS
|
||||
* GNU/Linux
|
||||
* Windows
|
||||
* FreeBSD/x86-64
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
@@ -50,7 +60,18 @@ Here, `r2ghidra.sleighhome` must point to a directory containing the `*.sla`, `*
|
||||
the architectures that should supported by the decompiler. This is however set up automatically when using
|
||||
the r2pm package or installing as shown below.
|
||||
|
||||
## Building
|
||||
## Building with ACR/Make
|
||||
|
||||
The procedure is like the standard autoconf:
|
||||
|
||||
```
|
||||
$ ./configure
|
||||
$ make
|
||||
$ make install # or make user-install
|
||||
```
|
||||
At the moment there is no way to select which processors to support, so it builds them all and takes a lot of time to compile the sleighfiles.
|
||||
|
||||
## Building with CMake
|
||||
|
||||
First, make sure the submodule contained within this repository is fetched and up to date:
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
# processed by ./configure
|
||||
|
||||
PKGCONFIG=@PKGCONFIG@
|
||||
PREFIX=@PREFIX@
|
||||
DATADIR=@DATADIR@
|
||||
BINDIR=$(PREFIX)/bin
|
||||
|
||||
R2_CFLAGS=@R2_CFLAGS@
|
||||
R2_LDFLAGS=@R2_LDFLAGS@
|
||||
R2_USER_PLUGINS=@R2_USER_PLUGINS@
|
||||
@@ -0,0 +1,561 @@
|
||||
#!/bin/sh
|
||||
# This script was automatically generated by ACR v1.9.6
|
||||
# @author: pancake <nopcode.org>
|
||||
# @url: http://www.nopcode.org
|
||||
# @repo: git clone https://github.com/radare/acr
|
||||
|
||||
[ -z "${AWK}" ] && AWK=awk
|
||||
do_remove() {
|
||||
if [ "${ACR_RMFILES}" ]; then
|
||||
printf "cleaning temporally files... "
|
||||
rm -f ${ACR_RMFILES}
|
||||
echo "done"
|
||||
fi
|
||||
}
|
||||
control_c() {
|
||||
printf "\n\n^C control-c : script execution interrupted.\n"
|
||||
do_remove
|
||||
exit 1
|
||||
}
|
||||
trap control_c 2
|
||||
printf "checking for cpp... "
|
||||
if [ "${CROSSBUILD}" = 1 ]; then
|
||||
(exec ${HOST}-${CPP} --help >/dev/null 2>&1)
|
||||
[ $? = 0 ] && CPP="${HOST}-${CPP}"
|
||||
fi
|
||||
(echo "int main(int ac, char **av){return 0;}" | ${CPP} >/dev/null 2>&1)
|
||||
if [ $? = 0 ]; then echo ${CPP}; else
|
||||
echo "ERROR: ${CPP} cannot parse sources"; fi
|
||||
|
||||
split_host() {
|
||||
S="$"
|
||||
while : ; do
|
||||
ENVWORDS="${ENVWORDS} $1_CPU $1_OS"
|
||||
STR=`eval "echo ${S}$1"`
|
||||
SPLIT_CPU="`echo "$STR" | cut -d - -f 1`"
|
||||
SPLIT_OS="`echo "$STR" | $AWK -F - '{
|
||||
if ($2=="unknown"){
|
||||
if (NF<3) { print $2; } else { print $3; }
|
||||
} else {
|
||||
if ($2=="linux") { print $2; } else
|
||||
if (NF<3) { print $2; } else { print $3; }
|
||||
}
|
||||
}'`"
|
||||
eval "$1_CPU=\"$SPLIT_CPU\""
|
||||
eval "$1_OS=\"$SPLIT_OS\""
|
||||
shift
|
||||
[ -z "$1" ] && break
|
||||
done
|
||||
}
|
||||
|
||||
QUIET=0
|
||||
be_quiet() {
|
||||
QUIET=1
|
||||
}
|
||||
|
||||
VPATH=`dirname ${0}`
|
||||
if [ "${VPATH}" = "." ]; then
|
||||
WODIS=current
|
||||
else
|
||||
if [ "${VPATH}" = "${PWD}" ]; then
|
||||
VPATH=.
|
||||
WODIS=current
|
||||
else
|
||||
WODIS=crosspath
|
||||
CURDIR=$PWD
|
||||
cd $VPATH
|
||||
VPATH="${PWD}/"
|
||||
cd $CURDIR
|
||||
fi
|
||||
fi
|
||||
|
||||
guess_os() {
|
||||
if [ -e "${VPATH}/config.guess" ]; then
|
||||
sh ${VPATH}/config.guess
|
||||
return
|
||||
fi
|
||||
CPU="`uname -m|sed -e 's, ,,g'|cut -d - -f 1`"
|
||||
OS="`uname -s|tr A-Z a-z`"
|
||||
uname -r | grep -qE "(Microsoft|WSL)" 2>/dev/null && OS="wsl"
|
||||
GNU="`uname --help 2>&1 | grep gnu`"
|
||||
[ "${GNU}" ] && OS="${OS}-gnu"
|
||||
[ "${CPU}" = ppc ] && CPU="powerpc"
|
||||
echo "${CPU}-unknown-${OS}"
|
||||
}
|
||||
|
||||
SEARCHPATH="/usr /usr/local /usr/pkg /sw"
|
||||
|
||||
: ${PREFIX:=/usr/local}
|
||||
CROSSBUILD=0
|
||||
BUILD=`guess_os`
|
||||
HOST="${BUILD}"
|
||||
TARGET="${HOST}"
|
||||
SYSCONFDIR=""
|
||||
|
||||
create_environ() {
|
||||
: ${EPREFIX:="${PREFIX}"}
|
||||
: ${SPREFIX:="${PREFIX}"}
|
||||
: ${BINDIR:="${SPREFIX}/bin"}
|
||||
: ${SBINDIR:="${PREFIX}/sbin"}
|
||||
: ${SYSCONFDIR:="${SPREFIX}/etc"}
|
||||
: ${LIBDIR:="${SPREFIX}/lib"}
|
||||
: ${LIBEXECDIR:="${SPREFIX}/libexec"}
|
||||
: ${INCLUDEDIR:="${SPREFIX}/include"}
|
||||
: ${DATADIR:="${SPREFIX}/share"}
|
||||
: ${INFODIR:="${DATADIR}/info"}
|
||||
: ${MANDIR:="${DATADIR}/man"}
|
||||
: ${DOCDIR:="${DATADIR}/doc/r2ghidra"}
|
||||
: ${LOCALSTATEDIR:="${SPREFIX}/var"}
|
||||
for A in `echo ${PATH} | sed -e 's,:, ,g'` ; do
|
||||
[ -e "$A"/ginstall ] && : ${INSTALL:="$A"/ginstall} && break
|
||||
[ -e "$A"/install ] && : ${INSTALL:="$A"/install} && break
|
||||
done
|
||||
: ${INSTALL_DIR:=${INSTALL} -d}
|
||||
: ${INSTALL_DATA:=${INSTALL} -m 644}
|
||||
: ${INSTALL_SCRIPT:=${INSTALL} -m 755}
|
||||
: ${INSTALL_PROGRAM:=${INSTALL} -m 755}
|
||||
: ${INSTALL_PROGRAM_STRIP:=${INSTALL} -m 755 -s}
|
||||
: ${INSTALL_MAN:=${INSTALL} -m 444}
|
||||
: ${INSTALL_LIB:=${INSTALL} -m 755 -c}
|
||||
PKGNAME='r2ghidra' ; VERSION='5.0.0-git' ; VERSION_MAJOR=5; VERSION_MINOR=0; VERSION_PATCH=0; VERSION_NUMBER=50000; CONTACT_MAIL="[email protected]" ; CONTACT_NAME="pancake" ; CONTACT="pancake <[email protected]>" ;
|
||||
}
|
||||
|
||||
show_usage() {
|
||||
cat <<EOF2
|
||||
'configure' configures r2ghidra-5.0.0-git to adapt to many kinds of systems.
|
||||
|
||||
Usage: ./configure [OPTION]... [VAR=VALUE]...
|
||||
|
||||
To assign environment variables (e.g., CC, CFLAGS...), specify them as
|
||||
VAR=VALUE. See below for descriptions of some of the useful variables.
|
||||
|
||||
Defaults for the options are specified in brackets.
|
||||
|
||||
Configuration:
|
||||
-h, --help display this help and exit
|
||||
-r, --report show what libs/programs require to work
|
||||
-q, --quiet be quiet, less verbose (see ./configure -qV)
|
||||
-V, --version display version information and exit
|
||||
|
||||
Installation directories:
|
||||
--exec-prefix=EPREFIX install arch-dependent files in EPREFIX [PREFIX]
|
||||
--prefix=PREFIX install arch-independent files in PREFIX [/usr/local]
|
||||
--sandbox=SPREFIX sandbox prefix directory: SPREFIX [PREFIX]
|
||||
|
||||
Fine tuning of the installation directories:
|
||||
--bindir=DIR user executables [EPREFIX/bin]
|
||||
--datadir=DIR read-only architecture-independent data [PREFIX/share]
|
||||
--docdir=DIR documentation directory [DATADIR/doc/r2ghidra]
|
||||
--includedir=DIR C header files [PREFIX/include]
|
||||
--infodir=DIR info documentation [DATADIR/info]
|
||||
--libexecdir=DIR program executables [EPREFIX/libexec]
|
||||
--libdir=DIR object code libraries [EPREFIX/lib]
|
||||
--libpath=DIR set rpath/libname-path to linker
|
||||
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
|
||||
--mandir=DIR man documentation [DATADIR/man]
|
||||
--sbindir=DIR system admin executables [EPREFIX/sbin]
|
||||
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
|
||||
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
|
||||
|
||||
System types:
|
||||
--build=BUILD configure for building on BUILD [guessed]
|
||||
--host=HOST cross-compile to build programs to run on HOST [BUILD]
|
||||
--target=TARGET configure for building compilers for TARGET [HOST]
|
||||
EOF2
|
||||
|
||||
printf "
|
||||
Some influential environment variables:
|
||||
CXX C++ compiler command
|
||||
CXXFLAGS C++ compiler flags
|
||||
"
|
||||
printf "
|
||||
Report bugs to: pancake <[email protected]>"
|
||||
echo ""
|
||||
exit 0
|
||||
}
|
||||
|
||||
take_environ() {
|
||||
: ${SH:=/bin/sh}
|
||||
: ${CPP:=cpp}
|
||||
: ${CXX:=g++}
|
||||
: ${PREFIX:=/usr/local/}
|
||||
}
|
||||
|
||||
ochof() {
|
||||
[ "$QUIET" = 1 ] && return
|
||||
printf "$*"
|
||||
}
|
||||
|
||||
ocho() {
|
||||
[ "$QUIET" = 1 ] && return
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
show_version() {
|
||||
if [ "$QUIET" = 1 ]; then
|
||||
echo "5.0.0-git"
|
||||
exit 0
|
||||
fi
|
||||
echo "r2ghidra-5.0.0-git configuration script done with acr v1.9.6.
|
||||
The 'Free Software Foundation' message is only for autodetection.
|
||||
Originally written by pancake <nopcode.org>."
|
||||
exit 0
|
||||
}
|
||||
|
||||
parse_options() {
|
||||
flag=`echo $1| cut -d = -f 1`
|
||||
value=`echo $1| $AWK 'BEGIN{FS="=";}{print $2}'`
|
||||
flag2=`echo $flag|cut -f2- -d -| sed -e 's,-,_,g' -e 's,^_,,g'|tr '[a-z]' '[A-Z]'`
|
||||
|
||||
if [ "${TARGET_OS}" = "darwin" ]; then
|
||||
LIBPATH=-Wl,-install_name,
|
||||
else
|
||||
LIBPATH=-Wl,-R
|
||||
fi
|
||||
|
||||
case $flag in
|
||||
-h|--help|--hel|--h|--he|-help)
|
||||
show_usage ; ;;
|
||||
-qV|-quiet-version|--quiet-version)
|
||||
be_quiet
|
||||
show_version ; ;;
|
||||
-q|-quiet|--quiet)
|
||||
be_quiet ; ;;
|
||||
-V|-version|--version)
|
||||
show_version ; ;;
|
||||
-r|--r|--report)
|
||||
echo "PKGNAME: r2ghidra"
|
||||
echo "VERSION: 5.0.0-git"
|
||||
echo "LANGS: c++"
|
||||
echo "PKG-CONFIG: r_core"
|
||||
exit 0
|
||||
;;
|
||||
--cache-file)
|
||||
# ignored: acr have no cache
|
||||
;;
|
||||
--build)
|
||||
BUILD="$value"; split_host BUILD ; ;;
|
||||
--host)
|
||||
CROSSBUILD=1 # XXX
|
||||
HOST="$value"; split_host HOST ; ;;
|
||||
--target)
|
||||
TARGET="$value"; split_host TARGET ; ;;
|
||||
--prefix)
|
||||
PREFIX="$value"; ;;
|
||||
--exec-prefix)
|
||||
EPREFIX="$value"; ;;
|
||||
--sandbox|--sprefix)
|
||||
SPREFIX="$value"; ;;
|
||||
--bindir)
|
||||
BINDIR="$value"; ;;
|
||||
--sbindir)
|
||||
SBINDIR="$value"; ;;
|
||||
--libexecdir)
|
||||
LIBEXECDIR="$value"; ;;
|
||||
--docdir)
|
||||
DOCDIR="$value"; ;;
|
||||
--datadir)
|
||||
DATADIR="$value"; ;;
|
||||
--sysconfdir)
|
||||
SYSCONFDIR="$value"; ;;
|
||||
--sharedstatedir)
|
||||
SHAREDSTATEDIR="$value"; ;;
|
||||
--localstatedir)
|
||||
LOCALSTATEDIR="$value"; ;;
|
||||
--libdir)
|
||||
LIBDIR="$value"; ;;
|
||||
--libpath)
|
||||
LDFLAGS="${LDFLAGS} ${LIBPATH}$value"; ;;
|
||||
--includedir)
|
||||
INCLUDEDIR="$value"; CFLAGS="${CFLAGS} -I$value"; ;;
|
||||
--infodir)
|
||||
INFODIR="$value"; ;;
|
||||
--mandir)
|
||||
MANDIR="$value"; ;;
|
||||
|
||||
*) if [ "$value" ]; then eval "`echo $flag2=$value`" ;
|
||||
else echo ; echo "WARNING: Unknown flag '$flag'." >&2 ; echo ; fi ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# MAIN #
|
||||
take_environ
|
||||
split_host BUILD HOST TARGET
|
||||
[ -z "$ACRHOOK" ] && ACRHOOK=./configure.hook
|
||||
[ -e "$ACRHOOK" ] && . ${ACRHOOK}
|
||||
|
||||
while : ; do
|
||||
[ -z "$1" ] && break
|
||||
parse_options "$1"
|
||||
shift
|
||||
done
|
||||
|
||||
ENVWORDS="MANDIR INFODIR LIBDIR INCLUDEDIR LOCALSTATEDIR SYSCONFDIR DATADIR DOCDIR LIBEXECDIR SBINDIR BINDIR EPREFIX PREFIX SPREFIX TARGET HOST BUILD INSTALL INSTALL_LIB INSTALL_MAN INSTALL_PROGRAM INSTALL_PROGRAM_STRIP INSTALL_DIR INSTALL_SCRIPT INSTALL_DATA HOST_OS HOST_CPU BUILD_OS BUILD_CPU TARGET_OS TARGET_CPU VERSION VERSION_MAJOR VERSION_MINOR VERSION_PATCH VERSION_NUMBER PKGNAME VPATH CONTACT CONTACT_NAME CONTACT_MAIL CXX CXXFLAGS LDFLAGS HAVE_LANG_CXX CPP HAVE_GIT GIT PKGCONFIG R2_CFLAGS R2_LDFLAGS HAVE_PKGCFG_R_CORE HAVE_R2 R2 HAVE_BISON BISON HAVE_flex flex R2_PREFIX R2_USER_PLUGINS R2_LIBR_PLUGINS"
|
||||
|
||||
create_environ
|
||||
|
||||
ocho "checking build system type... ${BUILD}"
|
||||
ocho "checking host system type... ${HOST}"
|
||||
ocho "checking target system type... ${TARGET}"
|
||||
[ "${CROSSBUILD}" = 1 ] && echo "using crosscompilation mode."
|
||||
|
||||
#split_host BUILD HOST TARGET
|
||||
[ -n "${prefix}" ] && PREFIX="${prefix}"
|
||||
ocho "checking for working directories... ${WODIS}"
|
||||
ocho "using prefix '${PREFIX}'"
|
||||
ACR_RMFILES=" test.c test.cxx a.out a.exe"
|
||||
|
||||
|
||||
|
||||
COMPILER=CXX
|
||||
HAVE_LANG_CXX=1
|
||||
printf "checking for c++ compiler... "
|
||||
if [ "${CROSSBUILD}" = 1 ]; then
|
||||
(command -v ${HOST}-${CXX} 2>&1 >/dev/null)
|
||||
if [ "$?" = 0 ]; then CXX="${HOST}-${CXX}"; fi
|
||||
fi
|
||||
echo "#include <iostream>" > test.cxx
|
||||
echo "int main(){ std::cout << 1; return 0;}" >> test.cxx
|
||||
(exec ${CXX} ${CXXFLAGS} ${LDFLAGS} test.cxx -lstdc++ >/dev/null 2>&1)
|
||||
if [ $? = 0 ]; then echo ${CXX}; else
|
||||
HAVE_LANG_CXX=0
|
||||
echo no
|
||||
|
||||
echo "ERROR: ${CXX} cannot create executables" >&2 ;
|
||||
do_remove
|
||||
exit 1
|
||||
fi
|
||||
ochof "checking for git... "
|
||||
if [ -x "${GIT}" ]; then
|
||||
FIND=${GIT}
|
||||
else
|
||||
FIND=""
|
||||
IFS=:
|
||||
for A in ${PATH} ; do
|
||||
if [ -x "${A}/git" ]; then
|
||||
FIND="${A}/git"
|
||||
break;
|
||||
fi
|
||||
done
|
||||
unset IFS
|
||||
fi
|
||||
if [ -n "${FIND}" ]; then
|
||||
ocho ${FIND};
|
||||
HAVE_GIT=1
|
||||
GIT=${FIND}
|
||||
else
|
||||
HAVE_GIT=0
|
||||
GIT=git
|
||||
if [ "" = 1 ]; then
|
||||
echo "Cannot find git" >&2
|
||||
else
|
||||
echo no
|
||||
fi
|
||||
echo "error: This program is required." >&2
|
||||
exit 1 ; fi
|
||||
ochof "checking for pkg-config... "
|
||||
if [ -n "$PKGCONFIG" ]; then
|
||||
if [ -x "$PKGCONFIG" ]; then
|
||||
_HAVE_PKGCONFIG="${PKGCONFIG}"
|
||||
else
|
||||
ocho "PKGCONFIG env is not executable"
|
||||
PKGCONFIG=""
|
||||
fi
|
||||
else
|
||||
IFS=:
|
||||
for A in ${PATH} ; do
|
||||
if [ -x "${A}/pkg-config" ]; then
|
||||
PKGCONFIG="${A}/pkg-config"
|
||||
elif [ -x "${A}/pkgconf" ]; then
|
||||
PKGCONFIG="${A}/pkgconf"
|
||||
else
|
||||
continue
|
||||
fi
|
||||
break
|
||||
done
|
||||
unset IFS
|
||||
fi
|
||||
if [ -n "${PKGCONFIG}" ]; then
|
||||
ocho ${PKGCONFIG}
|
||||
else
|
||||
echo "Cannot find pkg-config or pkgconf in PATH" >&2
|
||||
exit 1 ocho no; fi
|
||||
if [ -z "${PKGCONFIG}" ]; then pkg-config --version >/dev/null 2>&1 ; if [ 0 = 0 ]; then PKGCONFIG=pkg-config ; else PKGCONFIG=pkgconf ; fi; fi
|
||||
type ${PKGCONFIG} > /dev/null 2>&1 || echo "ERROR: Cannot find valid PKGCONFIG, pkg-config or pkgconf in PATH"
|
||||
echo 'Using PKGCONFIG: '${PKGCONFIG}
|
||||
printf 'checking pkg-config flags for r_core... '
|
||||
tmp=`${PKGCONFIG} --cflags r_core 2>/dev/null`
|
||||
if [ $? != 0 ]; then echo no ; HAVE_PKGCFG_R_CORE=0;
|
||||
R2_CFLAGS='';R2_LDFLAGS='';
|
||||
echo 'This package is required'
|
||||
exit 1
|
||||
else
|
||||
R2_CFLAGS=$tmp;
|
||||
tmp=`${PKGCONFIG} --libs r_core 2>/dev/null`
|
||||
if [ $? = 0 ]; then
|
||||
echo yes; HAVE_PKGCFG_R_CORE=1;
|
||||
R2_LDFLAGS=$tmp; fi; fi
|
||||
ochof "checking for r2... "
|
||||
if [ -x "${R2}" ]; then
|
||||
FIND=${R2}
|
||||
else
|
||||
FIND=""
|
||||
IFS=:
|
||||
for A in ${PATH} ; do
|
||||
if [ -x "${A}/r2" ]; then
|
||||
FIND="${A}/r2"
|
||||
break;
|
||||
fi
|
||||
done
|
||||
unset IFS
|
||||
fi
|
||||
if [ -n "${FIND}" ]; then
|
||||
ocho ${FIND};
|
||||
HAVE_R2=1
|
||||
R2=${FIND}
|
||||
else
|
||||
HAVE_R2=0
|
||||
R2=r2
|
||||
if [ "" = 1 ]; then
|
||||
echo "Cannot find r2" >&2
|
||||
else
|
||||
echo no
|
||||
fi
|
||||
echo "error: This program is required." >&2
|
||||
exit 1 ; fi
|
||||
ochof "checking for bison... "
|
||||
if [ -x "${BISON}" ]; then
|
||||
FIND=${BISON}
|
||||
else
|
||||
FIND=""
|
||||
IFS=:
|
||||
for A in ${PATH} ; do
|
||||
if [ -x "${A}/bison" ]; then
|
||||
FIND="${A}/bison"
|
||||
break;
|
||||
fi
|
||||
done
|
||||
unset IFS
|
||||
fi
|
||||
if [ -n "${FIND}" ]; then
|
||||
ocho ${FIND};
|
||||
HAVE_BISON=1
|
||||
BISON=${FIND}
|
||||
else
|
||||
HAVE_BISON=0
|
||||
BISON=bison
|
||||
if [ "" = 1 ]; then
|
||||
echo "Cannot find bison" >&2
|
||||
else
|
||||
echo no
|
||||
fi
|
||||
echo "error: This program is required." >&2
|
||||
exit 1 ; fi
|
||||
ochof "checking for flex... "
|
||||
if [ -x "${flex}" ]; then
|
||||
FIND=${flex}
|
||||
else
|
||||
FIND=""
|
||||
IFS=:
|
||||
for A in ${PATH} ; do
|
||||
if [ -x "${A}/flex" ]; then
|
||||
FIND="${A}/flex"
|
||||
break;
|
||||
fi
|
||||
done
|
||||
unset IFS
|
||||
fi
|
||||
if [ -n "${FIND}" ]; then
|
||||
ocho ${FIND};
|
||||
HAVE_flex=1
|
||||
flex=${FIND}
|
||||
else
|
||||
HAVE_flex=0
|
||||
flex=flex
|
||||
if [ "" = 1 ]; then
|
||||
echo "Cannot find flex" >&2
|
||||
else
|
||||
echo no
|
||||
fi
|
||||
echo "error: This program is required." >&2
|
||||
exit 1 ; fi
|
||||
printf "checking exec r2 -H R2_PREFIX... "
|
||||
R2_PREFIX="`r2 -H R2_PREFIX 2>/dev/null`"
|
||||
if [ $? = 0 ]; then
|
||||
echo "ok"
|
||||
else
|
||||
R2_PREFIX=""
|
||||
echo "not found"
|
||||
echo 'required'; exit 1
|
||||
fi
|
||||
printf "checking exec r2 -H R2_USER_PLUGINS... "
|
||||
R2_USER_PLUGINS="`r2 -H R2_USER_PLUGINS 2>/dev/null`"
|
||||
if [ $? = 0 ]; then
|
||||
echo "ok"
|
||||
else
|
||||
R2_USER_PLUGINS=""
|
||||
echo "not found"
|
||||
echo 'required'; exit 1
|
||||
fi
|
||||
printf "checking exec r2 -H R2_LIBR_PLUGINS... "
|
||||
R2_LIBR_PLUGINS="`r2 -H R2_LIBR_PLUGINS 2>/dev/null`"
|
||||
if [ $? = 0 ]; then
|
||||
echo "ok"
|
||||
else
|
||||
R2_LIBR_PLUGINS=""
|
||||
echo "not found"
|
||||
echo 'required'; exit 1
|
||||
fi
|
||||
SEDFLAGS=" -e '"
|
||||
COUNT=0
|
||||
for A in ${ENVWORDS} ; do
|
||||
[ "${A}" = VPATH ] && continue
|
||||
[ "${A}" = srcdir ] && continue
|
||||
eval "VAR=\$${A}"
|
||||
VAR="`echo ${VAR} | sed -e 's/\,/\\\,/g'`"
|
||||
[ $COUNT = 10 ] && COUNT=0 && SEDFLAGS="${SEDFLAGS}' -e '"
|
||||
COUNT=$(($COUNT+1))
|
||||
SEDFLAGS="${SEDFLAGS}s,@${A}@,${VAR},g;"
|
||||
done
|
||||
SEDFLAGS="${SEDFLAGS}'"
|
||||
for A in config.mk ; do # SUBDIRS
|
||||
if [ -f "${VPATH}/${A}.acr" ]; then
|
||||
SD_TARGET=${A}
|
||||
else
|
||||
if [ -d "${VPATH}/${A}" ]; then
|
||||
SD_TARGET=${A}/Makefile
|
||||
mkdir -p ${A}
|
||||
else
|
||||
echo "ERROR: Cannot find ${VPATH}/${A}.acr" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
ocho "creating ${SD_TARGET}"
|
||||
[ "${VPATH}" != '.' ] && mkdir -p $(echo ${A} | sed -e "s,/`basename ${A}`$,,g")
|
||||
cat ${VPATH}/${SD_TARGET}.acr | \
|
||||
eval sed -e "s,@VPATH@,${VPATH}/${A},g" ${SEDFLAGS} > ${SD_TARGET}.tmp
|
||||
|
||||
for A in ${ENVWORDS}; do
|
||||
VALUE=`eval echo "$"${A}`
|
||||
if [ "$VALUE" = 0 ]; then ## FALSE
|
||||
MARK="##${A}##"
|
||||
if [ -n "`grep \"${MARK}\" ${SD_TARGET}.tmp`" ]; then
|
||||
mv ${SD_TARGET}.tmp ${SD_TARGET}.tmp2
|
||||
cat ${SD_TARGET}.tmp2 | MARK=$MARK $AWK 'BEGIN{a=0;}{if($1==ENVIRON["MARK"]){if(a)a=0;else a=1}else{if(!a)print;}}' > ${SD_TARGET}.tmp
|
||||
fi
|
||||
fi
|
||||
done
|
||||
mv ${SD_TARGET}.tmp ${SD_TARGET} && rm -f ${SD_TARGET}.tmp2
|
||||
if [ ! $? = 0 ]; then echo Cannot write target file ; control_c ; fi
|
||||
done
|
||||
|
||||
do_remove
|
||||
if [ "$QUIET" = 0 ]; then
|
||||
echo
|
||||
echo "Final report:"
|
||||
for A in VERSION R2_PREFIX PREFIX PKGCONFIG ; do
|
||||
eval VAL="\$${A}"
|
||||
[ -z "${VAL}" ] && VAL="(null)"
|
||||
echo " - ${A} = ${VAL}"
|
||||
done
|
||||
fi
|
||||
@@ -0,0 +1,20 @@
|
||||
PKGNAME r2ghidra
|
||||
VERSION 5.0.0-git
|
||||
CONTACT pancake ; [email protected]
|
||||
|
||||
LANG_CXX!
|
||||
CHKPRG! GIT git
|
||||
USE_PKGCONFIG!
|
||||
|
||||
PKGCFG! R2_CFLAGS R2_LDFLAGS r_core
|
||||
CHKPRG! R2 r2
|
||||
CHKPRG! BISON bison
|
||||
CHKPRG! flex flex
|
||||
|
||||
EXEC! R2_PREFIX r2 -H R2_PREFIX ;
|
||||
EXEC! R2_USER_PLUGINS r2 -H R2_USER_PLUGINS ;
|
||||
EXEC! R2_LIBR_PLUGINS r2 -H R2_LIBR_PLUGINS ;
|
||||
|
||||
SUBDIRS config.mk ;
|
||||
|
||||
REPORT VERSION R2_PREFIX PREFIX PKGCONFIG ;
|
||||
@@ -0,0 +1,4 @@
|
||||
all: ghidra
|
||||
|
||||
ghidra:
|
||||
git submodule update --init
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
GHIDRA_HOME=../ghidra/ghidra/
|
||||
GHIDRA_DECOMPILER=$(GHIDRA_HOME)/Ghidra/Features/Decompiler/src/decompile/cpp
|
||||
|
||||
G_DECOMPILER= space.cc float.cc address.cc pcoderaw.cc
|
||||
G_DECOMPILER+=translate.cc opcodes.cc globalcontext.cc
|
||||
G_DECOMPILER+= capability.cc architecture.cc options.cc graph.cc
|
||||
G_DECOMPILER+= cover.cc block.cc cast.cc typeop.cc database.cc
|
||||
G_DECOMPILER+= cpool.cc comment.cc fspec.cc action.cc loadimage.cc
|
||||
G_DECOMPILER+= varnode.cc op.cc type.cc variable.cc varmap.cc
|
||||
G_DECOMPILER+= jumptable.cc emulate.cc emulateutil.cc flow.cc userop.cc
|
||||
G_DECOMPILER+= funcdata.cc funcdata_block.cc funcdata_varnode.cc
|
||||
G_DECOMPILER+= funcdata_op.cc pcodeinject.cc heritage.cc prefersplit.cc
|
||||
G_DECOMPILER+= rangeutil.cc ruleaction.cc subflow.cc blockaction.cc
|
||||
G_DECOMPILER+= merge.cc double.cc coreaction.cc condexe.cc override.cc
|
||||
G_DECOMPILER+= dynamic.cc crc32.cc prettyprint.cc printlanguage.cc
|
||||
G_DECOMPILER+= printc.cc printjava.cc memstate.cc opbehavior.cc
|
||||
G_DECOMPILER+= paramid.cc transform.cc string_ghidra.cc stringmanage.cc
|
||||
|
||||
G_DECOMPILER+= $(GHIDRA_LIBDECOMP_SRCS)
|
||||
|
||||
G_DECOMPILER+= sleigh_arch.cc
|
||||
G_DECOMPILER+= sleigh.cc
|
||||
G_DECOMPILER+= inject_sleigh.cc
|
||||
G_DECOMPILER+= filemanage.cc
|
||||
G_DECOMPILER+= semantics.cc
|
||||
G_DECOMPILER+= slghsymbol.cc
|
||||
G_DECOMPILER+= context.cc
|
||||
G_DECOMPILER+= sleighbase.cc
|
||||
G_DECOMPILER+= slghpatexpress.cc
|
||||
G_DECOMPILER+= slghpattern.cc
|
||||
G_DECOMPILER+= pcodecompile.cc
|
||||
|
||||
G_DECOMPILER+= xml.cc ## bison
|
||||
G_DECOMPILER+= pcodeparse.cc ## bison
|
||||
# G_DECOMPILER+= slghparse.cc ## bison
|
||||
|
||||
# ghidra/ghidra/Ghidra/Features/Decompiler/src/decompile/cpp/xml.y
|
||||
# ghidra/ghidra/Ghidra/Features/Decompiler/src/decompile/cpp/grammar.y
|
||||
# ghidra/ghidra/Ghidra/Features/Decompiler/src/decompile/cpp/ruleparse.y
|
||||
# ghidra/ghidra/Ghidra/Features/Decompiler/src/decompile/cpp/pcodeparse.y pcodeparse_lex
|
||||
# ghidra/ghidra/Ghidra/Features/Decompiler/src/decompile/cpp/slghparse.y yy_lex
|
||||
|
||||
$(GHIDRA_DECOMPILER)/grammar.cc: $(GHIDRA_DECOMPILER)/grammar.y
|
||||
bison -p grammar -o $(GHIDRA_DECOMPILER)/grammar.cc $(GHIDRA_DECOMPILER)/grammar.y
|
||||
|
||||
$(GHIDRA_DECOMPILER)/ruleparser.cc: $(GHIDRA_DECOMPILER)/grammar.y
|
||||
bison -p ruleparser -o $(GHIDRA_DECOMPILER)/ruleparser.cc $(GHIDRA_DECOMPILER)/ruleparser.y
|
||||
|
||||
$(GHIDRA_DECOMPILER)/xml.cc: $(GHIDRA_DECOMPILER)/xml.y
|
||||
bison -p xml -o $(GHIDRA_DECOMPILER)/xml.cc $(GHIDRA_DECOMPILER)/xml.y
|
||||
|
||||
$(GHIDRA_DECOMPILER)/pcodeparse.cc: $(GHIDRA_DECOMPILER)/pcodeparse.y
|
||||
bison -p pcodeparser -o $(GHIDRA_DECOMPILER)/pcodeparse.cc $(GHIDRA_DECOMPILER)/pcodeparse.y
|
||||
|
||||
$(GHIDRA_DECOMPILER)/slghparse.cc: $(GHIDRA_DECOMPILER)/slghparse.y
|
||||
echo '#include \"slghparse.hpp\"' > $(GHIDRA_DECOMPILER)/slghparse.tab.hpp
|
||||
bison -d -o $(GHIDRA_DECOMPILER)/slghparse.tab.hh $(GHIDRA_DECOMPILER)/slghparse.y
|
||||
bison -o $(GHIDRA_DECOMPILER)/slghparse.cc $(GHIDRA_DECOMPILER)/slghparse.y
|
||||
|
||||
.PHONY: $(GHIDRA_DECOMPILER)/slghparse.cc
|
||||
.PHONY: $(GHIDRA_DECOMPILER)/slghscan.cc
|
||||
|
||||
|
||||
$(GHIDRA_DECOMPILER)/slghscan.cc: $(GHIDRA_DECOMPILER)/slghscan.l $(GHIDRA_DECOMPILER)/slghparse.cc
|
||||
flex --header-file=$(GHIDRA_DECOMPILER)/slghscan.tab.hh -o $(GHIDRA_DECOMPILER)/slghscan.cc $(GHIDRA_DECOMPILER)/slghscan.l
|
||||
|
||||
GHIDRA_SRCS=$(addprefix $(GHIDRA_DECOMPILER)/,$(G_DECOMPILER))
|
||||
GHIDRA_OBJS+=$(subst .cc,.o,$(GHIDRA_SRCS))
|
||||
|
||||
GHIDRA_LIBDECOMP_SRCS=libdecomp.cc
|
||||
GHIDRA_LIBDECOMP_OBJS+=$(subst .cc,.o,$(GHIDRA_LIBDECOMP_SRCS))
|
||||
|
||||
GHIDRA_SLEIGH_COMPILER_SRCS=slgh_compile.cc
|
||||
GHIDRA_SLEIGH_COMPILER_OBJS=$(subst .cc,.o,$(GHIDRA_SLEIGH_COMPILER_SRCS))
|
||||
|
||||
sleigh: sleighc
|
||||
$(SLEIGHC) $(SPECFILE) $(SLAFILE)
|
||||
|
||||
sleighc: $(GHIDRA_DECOMPILER)/slgh_compile.o $(GHIDRA_DECOMPILER)/slghscan.o $(GHIDRA_DECOMPILER)/slghparse.o
|
||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -o sleighc $(GHIDRA_DECOMPILER)/slgh_compile.o $(GHIDRA_DECOMPILER)/slghparse.o $(GHIDRA_DECOMPILER)/slghscan.o $(GHIDRA_OBJS)
|
||||
|
||||
GHIDRA_SLEIGH_SLASPECS=$(GHIDRA_HOME)/Ghidra/Processors/*.slaspec
|
||||
GHIDRA_SLEIGH_FILES=$(GHIDRA_HOME)/Ghidra/Processors/*.cspec
|
||||
GHIDRA_SLEIGH_FILES+=$(GHIDRA_HOME)/Ghidra/Processors/*.ldefs
|
||||
GHIDRA_SLEIGH_FILES+=$(GHIDRA_HOME)/Ghidra/Processors/*.pspec
|
||||
|
||||
sleigh-build: sleighc
|
||||
./sleighc -a $(GHIDRA_HOME)/Ghidra/Processors 2>&1 | perl -ne '$$|=1;s/\n/\r/;print "\x1b[2K$$_";'
|
||||
|
||||
GHIDRA_PROCS=$(GHIDRA_HOME)/Ghidra/Processors/*/*/*
|
||||
|
||||
D=$(R2_USER_PLUGINS)/r2ghidra_sleigh
|
||||
|
||||
sleigh-install:
|
||||
mkdir -p $(D)
|
||||
cp -rf $(GHIDRA_PROCS)/*.cspec $(D)
|
||||
cp -rf $(GHIDRA_PROCS)/*.ldefs $(D)
|
||||
cp -rf $(GHIDRA_PROCS)/*.pspec $(D)
|
||||
cp -rf $(GHIDRA_PROCS)/*.sla $(D)
|
||||
|
||||
sleigh-uninstall:
|
||||
rm -rf "$(D)"
|
||||
@@ -0,0 +1,79 @@
|
||||
all: plugins
|
||||
|
||||
include ../config.mk
|
||||
include ../ghidra/deps.mk
|
||||
|
||||
|
||||
R2GHIDRA_SRCS= ArchMap.cpp CodeXMLParse.cpp R2Architecture.cpp R2CommentDatabase.cpp R2LoadImage.cpp
|
||||
R2GHIDRA_SRCS+= R2PrintC.cpp R2Scope.cpp R2TypeFactory.cpp RCoreMutex.cpp SleighAnalValue.cpp SleighAsm.cpp
|
||||
R2GHIDRA_SRCS+= SleighInstruction.cpp
|
||||
R2G_PLUG_SRCS= anal_ghidra.cpp asm_ghidra.cpp core_ghidra.cpp
|
||||
|
||||
PUGIXML_HOME=../third-party/pugixml/src/
|
||||
PUGIXML_CFLAGS=-I$(PUGIXML_HOME)
|
||||
PUGIXML_SRCS= $(PUGIXML_HOME)/pugixml.cpp
|
||||
PUGIXML_OBJS= $(PUGIXML_HOME)/pugixml.o
|
||||
#PUGIXML_OBJS= pugixml.o
|
||||
|
||||
$(PUGIXML_OBJS): $(PUGIXML_SRCS)
|
||||
$(CXX) -c $(R2_LDFLAGS) $(CXXFLAGS) -o $@ $(R2GHIDRA_OBJS) $(GHIDRA_OBJS) $<
|
||||
|
||||
CXXFLAGS+=$(PUGIXML_CFLAGS)
|
||||
# CXXFLAGS+=-DR2GHIDRA_SLEIGHHOME_DEFAULT=\"$(GHIDRA_HOME)\"
|
||||
|
||||
R2GHIDRA_OBJS=$(subst .cpp,.o,$(R2GHIDRA_SRCS))
|
||||
R2G_PLUGIN_OBJS=$(subst .cpp,.o,$(R2G_PLUG_SRCS))
|
||||
|
||||
CXX=clang++
|
||||
|
||||
CFLAGS+=-DR2GHIDRA_SLEIGHHOME_DEFAULT=\"$(R2_USER_PLUGINS)/r2ghidra_sleigh\"
|
||||
CFLAGS+=-w
|
||||
CFLAGS+=-fPIC
|
||||
CFLAGS+=-I$(GHIDRA_DECOMPILER)
|
||||
CFLAGS+=-I.
|
||||
ifeq ($(shell uname),FreeBSD)
|
||||
CFLAGS+=-DHOST_ENDIAN=1
|
||||
CFLAGS+=-Dint1=char
|
||||
CFLAGS+=-Dint2=short
|
||||
CFLAGS+=-Duint1=unsigned" char"
|
||||
CFLAGS+=-Duint2=unsigned" short"
|
||||
CFLAGS+=-Dint4=int
|
||||
CFLAGS+=-Duint4=unsigned" long long"
|
||||
CFLAGS+=-Dint8="long long"
|
||||
CFLAGS+=-Duint8="unsigned long long"
|
||||
CFLAGS+=-Duintm="unsigned long long"
|
||||
CFLAGS+=-Duintp="unsigned long long"
|
||||
endif
|
||||
|
||||
CXXFLAGS+=-std=c++11
|
||||
CXXFLAGS+=$(CFLAGS)
|
||||
|
||||
R2_LIBEXT=$(shell r2 -H R2_LIBEXT)
|
||||
R2G_CORE_PLUGIN=core_ghidra.$(R2_LIBEXT)
|
||||
R2G_ASM_PLUGIN=asm_ghidra.$(R2_LIBEXT)
|
||||
R2G_ANAL_PLUGIN=anal_ghidra.$(R2_LIBEXT)
|
||||
|
||||
clean:
|
||||
rm -f *.o $(GHIDRA_HOME)/*.o
|
||||
|
||||
plugins: $(R2G_CORE_PLUGIN) $(R2G_ASM_PLUGIN) $(R2G_ANAL_PLUGIN) sleighc
|
||||
|
||||
deps=$(R2GHIDRA_OBJS) $(GHIDRA_OBJS) $(R2G_PLUGIN_OBJS) $(PUGIXML_OBJS)
|
||||
|
||||
$(R2G_CORE_PLUGIN): $(deps)
|
||||
$(CXX) -shared $(R2_LDFLAGS) $(CXXFLAGS) -o $@ $(R2GHIDRA_OBJS) $(GHIDRA_OBJS) $(PUGIXML_OBJS) core_ghidra.o
|
||||
|
||||
$(R2G_ASM_PLUGIN): $(deps)
|
||||
$(CXX) -shared $(R2_LDFLAGS) $(CXXFLAGS) -o $@ $(R2GHIDRA_OBJS) $(GHIDRA_OBJS) $(PUGIXML_OBJS) asm_ghidra.o
|
||||
|
||||
$(R2G_ANAL_PLUGIN): $(deps)
|
||||
$(CXX) -shared $(R2_LDFLAGS) $(CXXFLAGS) -o $@ $(R2GHIDRA_OBJS) $(GHIDRA_OBJS) $(PUGIXML_OBJS) anal_ghidra.o
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) -fPIC $(CXXFLAGS) $(R2_CFLAGS) -c $<
|
||||
|
||||
install:
|
||||
cp -f *.$(R2_LIBEXT) $(R2_USER_PLUGINS)
|
||||
|
||||
uninstall:
|
||||
rm -f $(R2_USER_PLUGINS)/*ghidra*.$(R2_LIBEXT)
|
||||
Vendored
+1
-1
Submodule third-party/pugixml updated: fdf0295753...0e3f1699ff.
Reference in new issue
Block a user