Merge branch 'master' of https://github.com/iroiro123/unicorn into iroiro123-master

This commit is contained in:
Nguyen Anh Quynh 2016-01-01 14:01:39 +08:00
commit b3ebd1b7cb
8 changed files with 76 additions and 32 deletions

1
.gitignore vendored
View file

@ -7,6 +7,7 @@
*.so *.so
*.so.* *.so.*
*.exe *.exe
*.dll
qemu/config-all-devices.mak qemu/config-all-devices.mak

View file

@ -62,6 +62,11 @@ Unicorn requires few dependent packages as follows.
$ pacman -S mingw-w64-x86_64-glib2 $ pacman -S mingw-w64-x86_64-glib2
$ pacman -S mingw-w64-x86_64-toolchain $ pacman -S mingw-w64-x86_64-toolchain
- For Cygwin, "make", "gcc-core", "pkg-config", "libpcre-devel", "zlib-devel" and "libglib2.0-devel" are needed.
If apt-cyg is available, you can install these with:
$ apt-cyg install make gcc-core pkg-config libpcre-devel zlib-devel libglib2.0-devel
[1] Tailor Unicorn to your need. [1] Tailor Unicorn to your need.
@ -172,7 +177,30 @@ Unicorn requires few dependent packages as follows.
[4] Cross-compile for Windows from *nix [4] Compile and install from source on Cygwin
To build Unicorn on Cygwin, run:
$ ./make.sh
After compiling, install Unicorn with:
$ ./make.sh install
Resulted files cygunicorn.dll, libunicorn.dll.a and libunicorn.a can be
used on Cygwin but not native Windows.
NOTE: The core framework installed by "./make.sh install" consist of
following files:
/usr/include/unicorn/*.h
/usr/bin/cygunicorn.dll
/usr/lib/libunicorn.dll.a
/usr/lib/libunicorn.a
[5] Cross-compile for Windows from *nix
To cross-compile for Windows, Linux & gcc-mingw-w64-i686 (and also gcc-mingw-w64-x86-64 To cross-compile for Windows, Linux & gcc-mingw-w64-i686 (and also gcc-mingw-w64-x86-64
for 64-bit binaries) are required. for 64-bit binaries) are required.
@ -205,7 +233,7 @@ Unicorn requires few dependent packages as follows.
[5] Cross-compile for iOS from Mac OSX. [6] Cross-compile for iOS from Mac OSX.
To cross-compile for iOS (iPhone/iPad/iPod), Mac OSX with XCode installed is required. To cross-compile for iOS (iPhone/iPad/iPod), Mac OSX with XCode installed is required.
@ -226,7 +254,7 @@ Unicorn requires few dependent packages as follows.
[6] Cross-compile for Android [7] Cross-compile for Android
To cross-compile for Android (smartphone/tablet), Android NDK is required. To cross-compile for Android (smartphone/tablet), Android NDK is required.
NOTE: Only ARM and ARM64 are currently supported. NOTE: Only ARM and ARM64 are currently supported.
@ -240,7 +268,7 @@ Unicorn requires few dependent packages as follows.
[7] By default, "cc" (default C compiler on the system) is used as compiler. [8] By default, "cc" (default C compiler on the system) is used as compiler.
- To use "clang" compiler instead, run the command below: - To use "clang" compiler instead, run the command below:
@ -252,20 +280,20 @@ Unicorn requires few dependent packages as follows.
[8] To uninstall Unicorn, run the command below: [9] To uninstall Unicorn, run the command below:
$ sudo ./make.sh uninstall $ sudo ./make.sh uninstall
[9] Language bindings [10] Language bindings
Look for the bindings under directory bindings/, and refer to README file Look for the bindings under directory bindings/, and refer to README file
of corresponding languages. of corresponding languages.
[10] Unit tests [11] Unit tests
Automated unit tests use the cmocka unit testing framework (https://cmocka.org/). Automated unit tests use the cmocka unit testing framework (https://cmocka.org/).
It can be installed in most Linux distros using the package manager, e.g. It can be installed in most Linux distros using the package manager, e.g.

View file

@ -105,8 +105,10 @@ else
IS_CYGWIN := $(shell $(CC) -dumpmachine | grep -i cygwin | wc -l) IS_CYGWIN := $(shell $(CC) -dumpmachine | grep -i cygwin | wc -l)
ifeq ($(IS_CYGWIN),1) ifeq ($(IS_CYGWIN),1)
EXT = dll EXT = dll
AR_EXT = lib AR_EXT = a
BIN_EXT = .exe BIN_EXT = .exe
UNICORN_CFLAGS := $(UNICORN_CFLAGS:-fPIC=)
#UNICORN_QEMU_FLAGS += --disable-stack-protector
else else
# mingw? # mingw?
IS_MINGW := $(shell $(CC) --version | grep -i mingw | wc -l) IS_MINGW := $(shell $(CC) --version | grep -i mingw | wc -l)
@ -129,7 +131,10 @@ ifeq ($(UNICORN_SHARED),yes)
ifeq ($(IS_MINGW),1) ifeq ($(IS_MINGW),1)
LIBRARY = $(BLDIR)/$(LIBNAME).$(EXT) LIBRARY = $(BLDIR)/$(LIBNAME).$(EXT)
else ifeq ($(IS_CYGWIN),1) else ifeq ($(IS_CYGWIN),1)
LIBRARY = $(BLDIR)/$(LIBNAME).$(EXT) LIBRARY = $(BLDIR)/cyg$(LIBNAME).$(EXT)
LIBRARY_DLLA = $(BLDIR)/lib$(LIBNAME).$(EXT).$(AR_EXT)
$(LIBNAME)_LDFLAGS += -Wl,--out-implib=$(LIBRARY_DLLA)
$(LIBNAME)_LDFLAGS += -lssp
else # *nix else # *nix
LIBRARY = $(BLDIR)/lib$(LIBNAME).$(VERSION_EXT) LIBRARY = $(BLDIR)/lib$(LIBNAME).$(VERSION_EXT)
LIBRARY_SYMLINK = $(BLDIR)/lib$(LIBNAME).$(EXT) LIBRARY_SYMLINK = $(BLDIR)/lib$(LIBNAME).$(EXT)
@ -140,7 +145,7 @@ ifeq ($(UNICORN_STATIC),yes)
ifeq ($(IS_MINGW),1) ifeq ($(IS_MINGW),1)
ARCHIVE = $(BLDIR)/$(LIBNAME).$(AR_EXT) ARCHIVE = $(BLDIR)/$(LIBNAME).$(AR_EXT)
else ifeq ($(IS_CYGWIN),1) else ifeq ($(IS_CYGWIN),1)
ARCHIVE = $(BLDIR)/$(LIBNAME).$(AR_EXT) ARCHIVE = $(BLDIR)/lib$(LIBNAME).$(AR_EXT)
else else
ARCHIVE = $(BLDIR)/lib$(LIBNAME).$(AR_EXT) ARCHIVE = $(BLDIR)/lib$(LIBNAME).$(AR_EXT)
endif endif
@ -163,6 +168,7 @@ LIBDIRARCH ?= lib
LIBDIR ?= $(PREFIX)/$(LIBDIRARCH) LIBDIR ?= $(PREFIX)/$(LIBDIRARCH)
INCDIR ?= $(PREFIX)/include INCDIR ?= $(PREFIX)/include
BINDIR ?= $(PREFIX)/bin
LIBDATADIR ?= $(LIBDIR) LIBDATADIR ?= $(LIBDIR)
@ -188,9 +194,9 @@ all: compile_lib
ifeq (,$(findstring yes,$(UNICORN_BUILD_CORE_ONLY))) ifeq (,$(findstring yes,$(UNICORN_BUILD_CORE_ONLY)))
ifeq ($(UNICORN_SHARED),yes) ifeq ($(UNICORN_SHARED),yes)
ifeq ($(V),0) ifeq ($(V),0)
@$(INSTALL_DATA) $(LIBRARY) $(BLDIR)/samples/ @$(INSTALL_LIB) $(LIBRARY) $(BLDIR)/samples/
else else
$(INSTALL_DATA) $(LIBRARY) $(BLDIR)/samples/ $(INSTALL_LIB) $(LIBRARY) $(BLDIR)/samples/
endif endif
endif endif
@ -216,7 +222,7 @@ else
endif endif
compile_lib: config qemu/config-host.h-timestamp compile_lib: config qemu/config-host.h-timestamp
rm -rf lib$(LIBNAME)* $(LIBNAME)*.lib $(LIBNAME)*.dll && cd qemu && $(MAKE) -j 8 rm -rf lib$(LIBNAME)* $(LIBNAME)*.lib $(LIBNAME)*.dll cyg$(LIBNAME)*.dll && cd qemu && $(MAKE) -j 8
$(MAKE) unicorn $(MAKE) unicorn
cd samples && $(MAKE) clean cd samples && $(MAKE) clean
@ -226,9 +232,9 @@ $(LIBRARY): $(UC_TARGET_OBJ) uc.o hook.o
ifeq ($(UNICORN_SHARED),yes) ifeq ($(UNICORN_SHARED),yes)
ifeq ($(V),0) ifeq ($(V),0)
$(call log,GEN,$(LIBRARY)) $(call log,GEN,$(LIBRARY))
@$(CC) $(CFLAGS) $($(LIBNAME)_LDFLAGS) -shared $^ -o $(LIBRARY) $(GLIB) -lm @$(CC) $(CFLAGS) -shared $^ -o $(LIBRARY) $(GLIB) -lm $($(LIBNAME)_LDFLAGS)
else else
$(CC) $(CFLAGS) $($(LIBNAME)_LDFLAGS) -shared $^ -o $(LIBRARY) $(GLIB) -lm $(CC) $(CFLAGS) -shared $^ -o $(LIBRARY) $(GLIB) -lm $($(LIBNAME)_LDFLAGS)
endif endif
ifneq (,$(LIBRARY_SYMLINK)) ifneq (,$(LIBRARY_SYMLINK))
@ln -sf $(LIBRARY) $(LIBRARY_SYMLINK) @ln -sf $(LIBRARY) $(LIBRARY_SYMLINK)
@ -261,21 +267,26 @@ test: all
install: all $(PKGCFGF) install: all $(PKGCFGF)
mkdir -p $(DESTDIR)/$(LIBDIR) mkdir -p $(DESTDIR)$(LIBDIR)
ifeq ($(UNICORN_SHARED),yes) ifeq ($(UNICORN_SHARED),yes)
$(INSTALL_LIB) $(LIBRARY) $(DESTDIR)/$(LIBDIR) ifeq ($(IS_CYGWIN),1)
$(INSTALL_LIB) $(LIBRARY) $(DESTDIR)$(BINDIR)
$(INSTALL_DATA) $(LIBRARY_DLLA) $(DESTDIR)$(LIBDIR)
else
$(INSTALL_LIB) $(LIBRARY) $(DESTDIR)$(LIBDIR)
endif
ifneq ($(VERSION_EXT),) ifneq ($(VERSION_EXT),)
cd $(DESTDIR)/$(LIBDIR) && \ cd $(DESTDIR)$(LIBDIR) && \
ln -sf lib$(LIBNAME).$(VERSION_EXT) lib$(LIBNAME).$(EXT) ln -sf lib$(LIBNAME).$(VERSION_EXT) lib$(LIBNAME).$(EXT)
endif endif
endif endif
ifeq ($(UNICORN_STATIC),yes) ifeq ($(UNICORN_STATIC),yes)
$(INSTALL_DATA) $(ARCHIVE) $(DESTDIR)/$(LIBDIR) $(INSTALL_DATA) $(ARCHIVE) $(DESTDIR)$(LIBDIR)
endif endif
mkdir -p $(DESTDIR)/$(INCDIR)/$(LIBNAME) mkdir -p $(DESTDIR)$(INCDIR)/$(LIBNAME)
$(INSTALL_DATA) include/unicorn/*.h $(DESTDIR)/$(INCDIR)/$(LIBNAME) $(INSTALL_DATA) include/unicorn/*.h $(DESTDIR)$(INCDIR)/$(LIBNAME)
mkdir -p $(DESTDIR)/$(PKGCFGDIR) mkdir -p $(DESTDIR)$(PKGCFGDIR)
$(INSTALL_DATA) $(PKGCFGF) $(DESTDIR)/$(PKGCFGDIR)/ $(INSTALL_DATA) $(PKGCFGF) $(DESTDIR)$(PKGCFGDIR)/
TAG ?= HEAD TAG ?= HEAD
@ -301,13 +312,14 @@ header: FORCE
uninstall: uninstall:
rm -rf $(INCDIR)/$(LIBNAME) rm -rf $(INCDIR)/$(LIBNAME)
rm -f $(LIBDIR)/lib$(LIBNAME).* rm -f $(LIBDIR)/lib$(LIBNAME).*
rm -f $(BINDIR)/cyg$(LIBNAME).*
rm -f $(PKGCFGDIR)/$(LIBNAME).pc rm -f $(PKGCFGDIR)/$(LIBNAME).pc
clean: clean:
$(MAKE) -C qemu clean $(MAKE) -C qemu clean
rm -rf *.d *.o rm -rf *.d *.o
rm -rf lib$(LIBNAME)* $(LIBNAME)*.lib $(LIBNAME)*.dll rm -rf lib$(LIBNAME)* $(LIBNAME)*.lib $(LIBNAME)*.dll cyg$(LIBNAME)*.dll
ifeq (,$(findstring yes,$(UNICORN_BUILD_CORE_ONLY))) ifeq (,$(findstring yes,$(UNICORN_BUILD_CORE_ONLY)))
cd samples && $(MAKE) clean cd samples && $(MAKE) clean
rm -f $(BLDIR)/samples/lib$(LIBNAME).$(EXT) rm -f $(BLDIR)/samples/lib$(LIBNAME).$(EXT)

3
qemu/configure vendored
View file

@ -432,8 +432,7 @@ HOST_VARIANT_DIR=""
case $targetos in case $targetos in
CYGWIN*) CYGWIN*)
mingw32="yes" linux="yes"
QEMU_CFLAGS="-mno-cygwin $QEMU_CFLAGS"
;; ;;
MINGW32*) MINGW32*)
mingw32="yes" mingw32="yes"

View file

@ -65,7 +65,7 @@ static const int tcg_target_reg_alloc_order[] = {
static const int tcg_target_call_iarg_regs[] = { static const int tcg_target_call_iarg_regs[] = {
#if TCG_TARGET_REG_BITS == 64 #if TCG_TARGET_REG_BITS == 64
#if defined(_WIN64) #if (defined(_WIN64)||defined(__CYGWIN__))
TCG_REG_RCX, TCG_REG_RCX,
TCG_REG_RDX, TCG_REG_RDX,
#else #else
@ -2191,7 +2191,7 @@ static int tcg_target_callee_save_regs[] = {
#if TCG_TARGET_REG_BITS == 64 #if TCG_TARGET_REG_BITS == 64
TCG_REG_RBP, TCG_REG_RBP,
TCG_REG_RBX, TCG_REG_RBX,
#if defined(_WIN64) #if (defined(_WIN64)||defined(__CYGWIN__))
TCG_REG_RDI, TCG_REG_RDI,
TCG_REG_RSI, TCG_REG_RSI,
#endif #endif
@ -2316,7 +2316,7 @@ static void tcg_target_init(TCGContext *s)
tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_EDX); tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_EDX);
tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_ECX); tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_ECX);
if (TCG_TARGET_REG_BITS == 64) { if (TCG_TARGET_REG_BITS == 64) {
#if !defined(_WIN64) #if !(defined(_WIN64)||defined(__CYGWIN__))
tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_RDI); tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_RDI);
tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_RSI); tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_RSI);
#endif #endif

View file

@ -67,7 +67,7 @@ typedef enum {
/* used for function call generation */ /* used for function call generation */
#define TCG_REG_CALL_STACK TCG_REG_ESP #define TCG_REG_CALL_STACK TCG_REG_ESP
#define TCG_TARGET_STACK_ALIGN 16 #define TCG_TARGET_STACK_ALIGN 16
#if defined(_WIN64) #if defined(_WIN64) || (defined(__CYGWIN__)&&defined(__x86_64__))
#define TCG_TARGET_CALL_STACK_OFFSET 32 #define TCG_TARGET_CALL_STACK_OFFSET 32
#else #else
#define TCG_TARGET_CALL_STACK_OFFSET 0 #define TCG_TARGET_CALL_STACK_OFFSET 0

View file

@ -61,7 +61,9 @@ extern int daemon(int, int);
#include <sys/signal.h> #include <sys/signal.h>
#ifdef CONFIG_LINUX #ifdef CONFIG_LINUX
#if !defined(__CYGWIN__)
#include <sys/syscall.h> #include <sys/syscall.h>
#endif
#include <sys/vfs.h> #include <sys/vfs.h>
#endif #endif

View file

@ -48,8 +48,10 @@ AR_EXT = a
IS_CYGWIN := $(shell $(CC) -dumpmachine | grep -i cygwin | wc -l) IS_CYGWIN := $(shell $(CC) -dumpmachine | grep -i cygwin | wc -l)
ifeq ($(IS_CYGWIN),1) ifeq ($(IS_CYGWIN),1)
CFLAGS := $(CFLAGS:-fPIC=) CFLAGS := $(CFLAGS:-fPIC=)
LDFLAGS += -lssp
LDFLAGS_STATIC += -lssp
BIN_EXT = .exe BIN_EXT = .exe
AR_EXT = lib AR_EXT = a
else else
# mingw? # mingw?
IS_MINGW := $(shell $(CC) --version | grep -i mingw | wc -l) IS_MINGW := $(shell $(CC) --version | grep -i mingw | wc -l)
@ -64,7 +66,7 @@ ifeq ($(UNICORN_STATIC),yes)
ifeq ($(IS_MINGW),1) ifeq ($(IS_MINGW),1)
ARCHIVE = $(LIBDIR)/$(LIBNAME).$(AR_EXT) ARCHIVE = $(LIBDIR)/$(LIBNAME).$(AR_EXT)
else ifeq ($(IS_CYGWIN),1) else ifeq ($(IS_CYGWIN),1)
ARCHIVE = $(LIBDIR)/$(LIBNAME).$(AR_EXT) ARCHIVE = $(LIBDIR)/lib$(LIBNAME).$(AR_EXT)
else else
ARCHIVE = $(LIBDIR)/lib$(LIBNAME).$(AR_EXT) ARCHIVE = $(LIBDIR)/lib$(LIBNAME).$(AR_EXT)
#ARCHIVE_X86 = $(LIBDIR)/lib$(LIBNAME)_x86.$(AR_EXT) #ARCHIVE_X86 = $(LIBDIR)/lib$(LIBNAME)_x86.$(AR_EXT)