Implement ACR/MAKE build system support ##build (#1)

This commit is contained in:
pancake authored and GitHub committed 2020-12-22 01:47:29 +01:00
1 parent 6626930f0d
commit b73d743e5f
9 files changed
+855 -4

No files matched your search

+54
View File
@@ -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
+24 -3
View File
@@ -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:
+10
View File
@@ -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@
Vendored Executable
+561
View File
@@ -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
+20
View File
@@ -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 ;
+4
View File
@@ -0,0 +1,4 @@
all: ghidra
ghidra:
git submodule update --init
+102
View File
@@ -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)"
+79
View File
@@ -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)