]> git.saurik.com Git - cycript.git/commitdiff
Use yet more indirection to detect iOS simulator.
authorJay Freeman (saurik) <saurik@saurik.com>
Sun, 23 Jun 2013 09:26:03 +0000 (02:26 -0700)
committerJay Freeman (saurik) <saurik@saurik.com>
Sun, 23 Jun 2013 12:28:41 +0000 (05:28 -0700)
Makefile.am
Select.cpp [new file with mode: 0644]
configure.ac

index 1945785e7f507e47e74ac3360d2a05ba83cab2a3..f1e63349ee0c7c94151fe73c09cfb3b49ee402f5 100644 (file)
@@ -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 (file)
index 0000000..3143be2
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+**/
+/* }}} */
+
+#include <cstring>
+
+#include <stdint.h>
+
+#include <dlfcn.h>
+#include <syslog.h>
+#include <unistd.h>
+
+#include <mach-o/dyld.h>
+
+extern "C" void CYHandleServer(pid_t pid) {
+    Dl_info addr;
+    if (dladdr(reinterpret_cast<void *>(&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<void (*)(pid_t)>(symbol)(pid);
+}
index d5d72f697d4e16e8442cc6e0ff3485ea3a6b59ff..90f2f5c2a0cf2d00c17ad7c6098ef159455a2d2f 100644 (file)
@@ -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 <JavaScriptCore/JSBase.h>
     ], [
         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 <CoreFoundation/CFBase.h>
         ], [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++])