1 // natSharedLibLoader.cc - Implementation of SharedLibHelper native methods.
3 /* Copyright (C) 2001, 2003, 2004, 2005, 2006 Free Software Foundation
5 This file is part of libgcj.
7 This software is copyrighted work licensed under the terms of the
8 Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
16 #include <execution.h>
18 #include <gnu/gcj/runtime/SharedLibHelper.h>
19 #include <java/io/IOException.h>
20 #include <java/lang/UnsupportedOperationException.h>
21 #include <java/lang/UnknownError.h>
23 #include <java/lang/VMClassLoader.h>
25 // If we're using the Boehm GC, then we need this include to override dlopen.
27 // Set GC_DEBUG before including gc.h!
28 #ifdef LIBGCJ_GC_DEBUG
32 #endif /* HAVE_BOEHM_GC */
37 /* Only used during dlopen, while having a lock on Class.class. */
38 static java::lang::ClassLoader
*curLoader
;
39 static gnu::gcj::runtime::SharedLibHelper
*curHelper
;
41 typedef void (*ClassHookFunc
) (jclass
);
42 typedef void (*CoreHookFunc
) (_Jv_core_chain
*);
45 _Jv_sharedlib_register_hook (jclass cls
)
47 cls
->protectionDomain
= curHelper
->domain
;
48 cls
->loader
= curLoader
;
50 cls
->engine
= &_Jv_soleCompiledEngine
;
51 curHelper
->registerClass(cls
->getName(), cls
);
55 core_hook (_Jv_core_chain
*chain
)
57 chain
->next
= (_Jv_core_chain
*) curHelper
->core_chain
;
58 curHelper
->core_chain
= (gnu::gcj::RawData
*) chain
;
64 CoreHookFunc saved_core
;
67 saved
= _Jv_RegisterClassHook
;
68 saved_core
= _Jv_RegisterCoreHook
;
72 _Jv_RegisterClassHook
= saved
;
73 _Jv_RegisterCoreHook
= saved_core
;
80 gnu::gcj::runtime::SharedLibHelper::init(void)
83 char *lname
= (char *) __builtin_alloca (JvGetStringUTFLength (baseName
)
85 jsize total
= JvGetStringUTFRegion (baseName
, 0, baseName
->length(), lname
);
89 flags
= RTLD_GLOBAL
| RTLD_LAZY
;
90 JvSynchronize
dummy1(&::java::lang::Class::class$
);
91 SharedLibDummy dummy2
;
92 curLoader
= ((void*)loader
== ::java::lang::VMClassLoader::bootLoader
95 _Jv_RegisterClassHook
= _Jv_sharedlib_register_hook
;
96 _Jv_RegisterCoreHook
= core_hook
;
97 void *h
= dlopen(lname
, flags
);
100 const char *msg
= dlerror();
101 throw new ::java::lang::UnknownError(JvNewStringLatin1(msg
));
103 handler
= (gnu::gcj::RawData
*) h
;
106 = "shared library class loading is not supported on this platform";
107 throw new ::java::lang::UnsupportedOperationException(JvNewStringLatin1(msg
));
112 gnu::gcj::runtime::SharedLibHelper::hasResource (jstring name
)
115 _Jv_core_chain
*node
= _Jv_FindCore ((_Jv_core_chain
*) core_chain
, name
);
123 extern gnu::gcj::Core
*_Jv_create_core (_Jv_core_chain
*node
, jstring name
);
127 gnu::gcj::runtime::SharedLibHelper::findCore (jstring name
)
131 return _Jv_create_core ((_Jv_core_chain
*) core_chain
, name
);
138 gnu::gcj::runtime::SharedLibHelper::finalize()
140 _Jv_FreeCoreChain ((_Jv_core_chain
*) core_chain
);
148 gnu::gcj::runtime::SharedLibHelper::ensureSupersLinked(jclass k
)
150 _Jv_Linker::wait_for_state (k
, JV_STATE_LOADING
);