int (*pthread_join)(pthread_t, void **);
 
     void *(*dlopen)(const char *, int);
+    char *(*dlerror)();
     void *(*dlsym)(void *, const char *);
 
     mach_port_t (*mach_thread_self)();
 
 console += -framework Foundation
 library += -install_name /usr/lib/libcycript.$(dll)
 library += -framework Foundation
-library += -framework JavaScriptCore
+console += -framework JavaScriptCore
 # XXX: do I just need WebCore?
-library += -framework WebKit
+console += -framework WebKit
+library += -undefined dynamic_lookup
 library += -liconv
 flags += -I/usr/include/ffi
 apr_config := /usr/bin/apr-1-config
 
     baton->pthread_join = &pthread_join;
 
     baton->dlopen = &dlopen;
+    baton->dlerror = &dlerror;
     baton->dlsym = &dlsym;
 
     baton->mach_thread_self = &mach_thread_self;
 
 template <typename Type_>
 static _finline void dlset(Baton *baton, Type_ &function, const char *name, void *handle = RTLD_DEFAULT) {
     function = reinterpret_cast<Type_>(baton->dlsym(handle, name));
+    if (function == NULL)
+        baton->dlerror();
 }
 
 void *Routine(void *arg) {
     dlset(baton, dlopen, "dlopen");
 
     void *handle(dlopen(baton->library, RTLD_LAZY | RTLD_LOCAL));
+    if (handle == NULL) {
+        baton->dlerror();
+        return NULL;
+    }
 
     void (*CYHandleServer)(pid_t);
     dlset(baton, CYHandleServer, "CYHandleServer", handle);
 
     CYHandleServer(baton->pid);
 
-    return arg;
+    return NULL;
 }
 
 static void $bzero(void *data, size_t size) {