123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- /* darwin.cc - class loader stuff for Darwin. */
- /* Copyright (C) 2004, 2007 Free Software Foundation
- This file is part of libgcj.
- This software is copyrighted work licensed under the terms of the
- Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
- details. */
- #include <config.h>
- #include <jvm.h>
- /* In theory, we should be able to do:
- #include <mach-o/getsect.h>
- #include <mach-o/dyld.h>
- but all the types in these headers changed between Panther and Tiger,
- so the only way to be avoid type mismatches is to declare the routines
- ourself. */
- #include <stdint.h>
- #if !defined (__LP64__)
- struct mach_header;
- # define JAVA_MACH_HEADER mach_header
- # define mh_size_t uint32_t
- extern "C" void _dyld_register_func_for_add_image
- (void (*func)(const struct mach_header *mh, intptr_t vmaddr_slide));
- extern "C" void _dyld_register_func_for_remove_image
- (void (*func)(const struct mach_header *mh, intptr_t vmaddr_slide));
- extern "C" char *getsectdatafromheader
- (const struct mach_header *mhp, const char *segname, const char *sectname,
- uint32_t *size);
- # define GETSECTDATA getsectdatafromheader
- #else
- struct mach_header_64;
- # define JAVA_MACH_HEADER mach_header_64
- # define mh_size_t uint64_t
- extern "C" void _dyld_register_func_for_add_image
- (void (*func)(const struct mach_header_64 *mh, intptr_t vmaddr_slide));
- extern "C" void _dyld_register_func_for_remove_image
- (void (*func)(const struct mach_header_64 *mh, intptr_t vmaddr_slide));
- extern "C" char *getsectdatafromheader_64
- (const struct mach_header_64 *mhp, const char *segname,
- const char *sectname, uint64_t *size);
- # define GETSECTDATA getsectdatafromheader_64
- #endif
- /* When a new image is loaded, look to see if it has a jcr section
- and if so register the classes listed in it. */
- static void
- darwin_java_register_dyld_add_image_hook (const struct JAVA_MACH_HEADER *mh,
- intptr_t slide)
- {
- char *fde;
- mh_size_t sz;
- fde = GETSECTDATA (mh, "__DATA", "jcr", &sz);
- if (! fde)
- return;
-
- /* As far as I can tell, you're only supposed to load shared
- libraries while having a lock on java.lang.Class. So there's
- no need to synchronize on anything here. (I'm not sure how exactly
- you can ensure this given lazy library loading. FIXME.) */
-
- _Jv_RegisterClasses_Counted ((const jclass *) (fde + slide),
- sz / sizeof (jclass *));
- }
- static struct darwin_constructor_s{
- darwin_constructor_s()
- {
- _dyld_register_func_for_add_image
- (darwin_java_register_dyld_add_image_hook);
- /* At present, you mustn't unload any java plugin. */
- };
- } darwin_constructor;
|