mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			81 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
| /* 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;
 |