From 604ed881a401017ff5e36d561f233eda277e1819 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Sun, 23 Jun 2013 02:26:03 -0700 Subject: [PATCH] Use yet more indirection to detect iOS simulator. --- Makefile.am | 34 ++++++++++++++--------- Select.cpp | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 8 +++--- 3 files changed, 102 insertions(+), 16 deletions(-) create mode 100644 Select.cpp diff --git a/Makefile.am b/Makefile.am index 1945785..f1e6334 100644 --- a/Makefile.am +++ b/Makefile.am @@ -35,17 +35,24 @@ AM_LDFLAGS = $(CY_ARCH) CY_LDFLAGS = -no-undefined -avoid-version -export-dynamic -lib_LTLIBRARIES = libcycript.la -libcycript_la_SOURCES = Highlight.cpp Network.cpp Output.cpp Parser.cpp Replace.cpp +lib_LTLIBRARIES = + +lib_LTLIBRARIES += libcycript.la +libcycript_la_SOURCES = Select.cpp libcycript_la_LDFLAGS = $(AM_LDFLAGS) $(CY_LDFLAGS) -libcycript_la_LIBADD = $(LTLIBFFI) $(LTLIBICONV) -ldl +libcycript_la_LIBADD = -ldl + +lib_LTLIBRARIES += libcycript-sys.la +libcycript_sys_la_SOURCES = Highlight.cpp Network.cpp Output.cpp Parser.cpp Replace.cpp +libcycript_sys_la_LDFLAGS = $(AM_LDFLAGS) $(CY_LDFLAGS) +libcycript_sys_la_LIBADD = $(LTLIBFFI) $(LTLIBICONV) -ldl -libcycript_la_SOURCES += Cycript.tab.cc -libcycript_la_SOURCES += lex.cy.cpp +libcycript_sys_la_SOURCES += Cycript.tab.cc +libcycript_sys_la_SOURCES += lex.cy.cpp bin_PROGRAMS = cycript cycript_SOURCES = Console.cpp Display.cpp -cycript_LDADD = libcycript.la $(LTLIBAPR) $(LTLIBREADLINE) $(LTLIBTERMCAP) -ldl +cycript_LDADD = libcycript.la libcycript-sys.la $(LTLIBAPR) $(LTLIBREADLINE) $(LTLIBTERMCAP) -ldl ldid = true entitle = $(ldid) -Scycript.xml @@ -53,8 +60,9 @@ entitle = $(ldid) -Scycript.xml filters = $(CY_FILTERS) if CY_EXECUTE -libcycript_la_SOURCES += sig/ffi_type.cpp sig/parse.cpp sig/copy.cpp -libcycript_la_SOURCES += Bridge.cpp Execute.cpp JavaScriptCore.cpp Library.cpp +libcycript_sys_la_SOURCES += sig/ffi_type.cpp sig/parse.cpp sig/copy.cpp +libcycript_sys_la_SOURCES += Bridge.cpp Execute.cpp JavaScriptCore.cpp Library.cpp +libcycript_sys_la_LIBADD += $(LTJAVASCRIPTCORE) AM_CPPFLAGS += -DCY_EXECUTE filters += C @@ -72,11 +80,12 @@ endif if CY_OBJECTIVEC filters += ObjectiveC -libcycript_la_SOURCES += ObjectiveC/Output.mm ObjectiveC/Replace.cpp ObjectiveC/Library.mm +libcycript_sys_la_SOURCES += ObjectiveC/Output.mm ObjectiveC/Replace.cpp ObjectiveC/Library.mm +libcycript_sys_la_LIBADD += $(LTOBJECTIVEC) endif if CY_MACH -libcycript_la_SOURCES += Handler.mm +libcycript_sys_la_SOURCES += Handler.mm cycript_SOURCES += Mach/Inject.cpp AM_CPPFLAGS += -DCY_ATTACH @@ -100,7 +109,7 @@ endif libcycript_sim_la_SHORTNAME = sim if CY_IOS_SIMULATOR lib_LTLIBRARIES += libcycript-sim.la -libcycript_sim_la_SOURCES = $(libcycript_la_SOURCES) +libcycript_sim_la_SOURCES = $(libcycript_sys_la_SOURCES) libcycript_sim_la_CPPFLAGS = $(AM_CPPFLAGS) CY_SIM_FLAGS = -arch i386 -isysroot $(CY_IOS_SIMULATOR) @@ -108,7 +117,8 @@ libcycript_sim_la_CXXFLAGS = $(CY_SIM_FLAGS) libcycript_sim_la_OBJCXXFLAGS = $(CY_SIM_FLAGS) libcycript_sim_la_LDFLAGS = $(CY_SIM_FLAGS) $(CY_LDFLAGS) -libcycript_sim_la_LIBADD = $(LTLIBICONV) -ldl +libcycript_sim_la_LIBADD = $(LTOBJECTIVEC) $(LTLIBICONV) -ldl +libcycript_sim_la_LIBADD += $(LTOBJECTIVEC) $(LTJAVASCRIPTCORE) libcycript_sim_la_CPPFLAGS += -idirafter /usr/include libcycript_sim_la_LDFLAGS += -Wl,/usr/lib/libffi.dylib diff --git a/Select.cpp b/Select.cpp new file mode 100644 index 0000000..3143be2 --- /dev/null +++ b/Select.cpp @@ -0,0 +1,76 @@ +/* Cycript - Optimizing JavaScript Compiler/Runtime + * Copyright (C) 2009-2013 Jay Freeman (saurik) +*/ + +/* GNU General Public License, Version 3 {{{ */ +/* + * Cycript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * Cycript is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cycript. If not, see . +**/ +/* }}} */ + +#include + +#include + +#include +#include +#include + +#include + +extern "C" void CYHandleServer(pid_t pid) { + Dl_info addr; + if (dladdr(reinterpret_cast(&CYHandleServer), &addr) == 0) + return; + + const char *fname(addr.dli_fname); + size_t length(strlen(fname)); + + const char *ext(strrchr(fname, '.')); + size_t prefix(ext - fname); + + const char *addition; +#ifdef __APPLE__ + // XXX: THIS IS HORRIBLE OMG I NEED TO FIX THIS ASAP + bool simulator(false); + for (uint32_t i(0), e(_dyld_image_count()); i != e; ++i) { + if (strstr(_dyld_get_image_name(i), "/SDKs/iPhoneSimulator") != NULL) + simulator = true; + } + if (simulator) + addition = "-sim"; + else +#endif + // someone threw a fit about dangling #endif + else + // the idea that this bothers someone gives me glee + addition = "-sys"; + + char library[length + 5]; + memcpy(library, fname, prefix); + memcpy(library + prefix, addition, 4); + memcpy(library + prefix + 4, fname + prefix, length - prefix); + library[length + 4] = '\0'; + + void *handle(dlopen(library, RTLD_LOCAL | RTLD_LAZY)); + if (handle == NULL) { + syslog(LOG_ERR, "dlopen() -> %s", dlerror()); + return; + } + + void *symbol(dlsym(handle, "CYHandleServer")); + if (symbol == NULL) + return; + + reinterpret_cast(symbol)(pid); +} diff --git a/configure.ac b/configure.ac index d5d72f6..90f2f5c 100644 --- a/configure.ac +++ b/configure.ac @@ -170,7 +170,7 @@ AC_DEFUN([CY_LT_LIB], [ dnl --enable-javascript {{{ AC_DEFUN([CY_CHECK_JAVASCRIPTCORE], [ - AC_CHECK_FRAMEWORK([JavaScriptCore], [ + CY_LT_LIB([LTJAVASCRIPTCORE], [AC_CHECK_FRAMEWORK([JavaScriptCore], [ #include ], [ JSEvaluateScript(0, 0, 0, 0, 0, 0); @@ -184,7 +184,7 @@ AC_DEFUN([CY_CHECK_JAVASCRIPTCORE], [ AC_LIB_APPENDTOVAR([LIBS], [`$PKG_CONFIG --libs $cy_webkit_pkg`]) ], [:]); if test "x$CY_EXECUTE" = x1; then break; fi done - ]) + ])]) ]) AC_DEFUN([CY_CHECK_JAVASCRIPT], [ @@ -241,7 +241,7 @@ AS_CASE([$CY_EXECUTE], [1], [ ], [AC_MSG_RESULT([no])]) AS_IF([test "x$CY_OBJECTIVEC" = x1], [ - AC_CHECK_FRAMEWORK([CoreFoundation], [ + CY_LT_LIB([LTOBJECTIVEC], [AC_CHECK_FRAMEWORK([CoreFoundation], [ #include ], [CFAllocatorGetDefault();], [ AC_SUBST([CY_OBJECTIVEC]) @@ -258,7 +258,7 @@ AS_CASE([$CY_EXECUTE], [1], [ AC_LIB_APPENDTOVAR([OBJCXXFLAGS], [`$GNUSTEP_CONFIG --objc-flags`]) AC_LIB_APPENDTOVAR([LIBS], [`$GNUSTEP_CONFIG --base-libs`]) ], [AC_SUBST([CY_OBJECTIVEC], [0])]) - ]) + ])]) ]) AC_LANG_POP([Objective C++]) -- 2.47.2