⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dyn_load.c

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 C
📖 第 1 页 / 共 3 页
字号:
	} else#   else    while (p < GC_sysinfo.lpMaximumApplicationAddress) {        result = VirtualQuery(p, &buf, sizeof(buf));#   endif	{	    if (result != sizeof(buf)) {		ABORT("Weird VirtualQuery result");	    }	    new_limit = (char *)p + buf.RegionSize;	    protect = buf.Protect;	    if (buf.State == MEM_COMMIT		&& (protect == PAGE_EXECUTE_READWRITE		    || protect == PAGE_READWRITE)		&& !GC_is_heap_base(buf.AllocationBase)		/* This used to check for		 * !is_frame_buffer(p, buf.RegionSize, buf.Type)		 * instead of just checking for MEM_IMAGE.		 * If something breaks, change it back. */		&& buf.Type == MEM_IMAGE) {  #	        ifdef DEBUG_VIRTUALQUERY	          GC_dump_meminfo(&buf);#	        endif		if ((char *)p != limit) {		    GC_cond_add_roots(base, limit);		    base = p;		}		limit = new_limit;	    }	}        if (p > (LPVOID)new_limit /* overflow */) break;        p = (LPVOID)new_limit;    }    GC_cond_add_roots(base, limit);  }#endif /* MSWIN32 || MSWINCE */  #if defined(ALPHA) && defined(OSF1)#include <loader.h>void GC_register_dynamic_libraries(){  int status;  ldr_process_t mypid;  /* module */    ldr_module_t moduleid = LDR_NULL_MODULE;    ldr_module_info_t moduleinfo;    size_t moduleinfosize = sizeof(moduleinfo);    size_t modulereturnsize;      /* region */    ldr_region_t region;     ldr_region_info_t regioninfo;    size_t regioninfosize = sizeof(regioninfo);    size_t regionreturnsize;  /* Obtain id of this process */    mypid = ldr_my_process();    /* For each module */    while (TRUE) {      /* Get the next (first) module */        status = ldr_next_module(mypid, &moduleid);      /* Any more modules? */        if (moduleid == LDR_NULL_MODULE)            break;    /* No more modules */      /* Check status AFTER checking moduleid because */      /* of a bug in the non-shared ldr_next_module stub */        if (status != 0 ) {            GC_printf1("dynamic_load: status = %ld\n", (long)status);            {                extern char *sys_errlist[];                extern int sys_nerr;                extern int errno;                if (errno <= sys_nerr) {                    GC_printf1("dynamic_load: %s\n", (long)sys_errlist[errno]);               } else {                    GC_printf1("dynamic_load: %d\n", (long)errno);                }        }            ABORT("ldr_next_module failed");         }      /* Get the module information */        status = ldr_inq_module(mypid, moduleid, &moduleinfo,                                moduleinfosize, &modulereturnsize);         if (status != 0 )            ABORT("ldr_inq_module failed");      /* is module for the main program (i.e. nonshared portion)? */          if (moduleinfo.lmi_flags & LDR_MAIN)              continue;    /* skip the main module */#     ifdef VERBOSE          GC_printf("---Module---\n");          GC_printf("Module ID            = %16ld\n", moduleinfo.lmi_modid);          GC_printf("Count of regions     = %16d\n", moduleinfo.lmi_nregion);          GC_printf("flags for module     = %16lx\n", moduleinfo.lmi_flags);           GC_printf("pathname of module   = \"%s\"\n", moduleinfo.lmi_name);#     endif      /* For each region in this module */        for (region = 0; region < moduleinfo.lmi_nregion; region++) {          /* Get the region information */            status = ldr_inq_region(mypid, moduleid, region, &regioninfo,                                    regioninfosize, &regionreturnsize);            if (status != 0 )                ABORT("ldr_inq_region failed");          /* only process writable (data) regions */            if (! (regioninfo.lri_prot & LDR_W))                continue;#         ifdef VERBOSE              GC_printf("--- Region ---\n");              GC_printf("Region number    = %16ld\n",              	        regioninfo.lri_region_no);              GC_printf("Protection flags = %016x\n",  regioninfo.lri_prot);              GC_printf("Virtual address  = %16p\n",   regioninfo.lri_vaddr);              GC_printf("Mapped address   = %16p\n",   regioninfo.lri_mapaddr);              GC_printf("Region size      = %16ld\n",  regioninfo.lri_size);              GC_printf("Region name      = \"%s\"\n", regioninfo.lri_name);#         endif          /* register region as a garbage collection root */            GC_add_roots_inner (                (char *)regioninfo.lri_mapaddr,                (char *)regioninfo.lri_mapaddr + regioninfo.lri_size,                TRUE);        }    }}#endif#if defined(HPUX)#include <errno.h>#include <dl.h>extern int errno;extern char *sys_errlist[];extern int sys_nerr;void GC_register_dynamic_libraries(){  int status;  int index = 1; /* Ordinal position in shared library search list */  struct shl_descriptor *shl_desc; /* Shared library info, see dl.h */  /* For each dynamic library loaded */    while (TRUE) {      /* Get info about next shared library */        status = shl_get(index, &shl_desc);      /* Check if this is the end of the list or if some error occured */        if (status != 0) {#	 ifdef GC_HPUX_THREADS	   /* I've seen errno values of 0.  The man page is not clear	*/	   /* as to whether errno should get set on a -1 return.	*/	   break;#	 else          if (errno == EINVAL) {              break; /* Moved past end of shared library list --> finished */          } else {              if (errno <= sys_nerr) {                    GC_printf1("dynamic_load: %s\n", (long) sys_errlist[errno]);              } else {                    GC_printf1("dynamic_load: %d\n", (long) errno);	      }              ABORT("shl_get failed");          }#	 endif        }#     ifdef VERBOSE          GC_printf0("---Shared library---\n");          GC_printf1("\tfilename        = \"%s\"\n", shl_desc->filename);          GC_printf1("\tindex           = %d\n", index);          GC_printf1("\thandle          = %08x\n",					(unsigned long) shl_desc->handle);          GC_printf1("\ttext seg. start = %08x\n", shl_desc->tstart);          GC_printf1("\ttext seg. end   = %08x\n", shl_desc->tend);          GC_printf1("\tdata seg. start = %08x\n", shl_desc->dstart);          GC_printf1("\tdata seg. end   = %08x\n", shl_desc->dend);          GC_printf1("\tref. count      = %lu\n", shl_desc->ref_count);#     endif      /* register shared library's data segment as a garbage collection root */        GC_add_roots_inner((char *) shl_desc->dstart,			   (char *) shl_desc->dend, TRUE);        index++;    }}#endif /* HPUX */#ifdef RS6000#pragma alloca#include <sys/ldr.h>#include <sys/errno.h>void GC_register_dynamic_libraries(){	int len;	char *ldibuf;	int ldibuflen;	struct ld_info *ldi;	ldibuf = alloca(ldibuflen = 8192);	while ( (len = loadquery(L_GETINFO,ldibuf,ldibuflen)) < 0) {		if (errno != ENOMEM) {			ABORT("loadquery failed");		}		ldibuf = alloca(ldibuflen *= 2);	}	ldi = (struct ld_info *)ldibuf;	while (ldi) {		len = ldi->ldinfo_next;		GC_add_roots_inner(				ldi->ldinfo_dataorg,				(ptr_t)(unsigned long)ldi->ldinfo_dataorg			        + ldi->ldinfo_datasize,				TRUE);		ldi = len ? (struct ld_info *)((char *)ldi + len) : 0;	}}#endif /* RS6000 */#ifdef DARWIN/* __private_extern__ hack required for pre-3.4 gcc versions.	*/#ifndef __private_extern__# define __private_extern__ extern# include <mach-o/dyld.h># undef __private_extern__#else# include <mach-o/dyld.h>#endif#include <mach-o/getsect.h>/*#define DARWIN_DEBUG*/const static struct {         const char *seg;        const char *sect;} GC_dyld_sections[] = {        { SEG_DATA, SECT_DATA },        { SEG_DATA, SECT_BSS },        { SEG_DATA, SECT_COMMON }};    #ifdef DARWIN_DEBUGstatic const char *GC_dyld_name_for_hdr(struct mach_header *hdr) {    unsigned long i,c;    c = _dyld_image_count();    for(i=0;i<c;i++) if(_dyld_get_image_header(i) == hdr)        return _dyld_get_image_name(i);    return NULL;}#endif        /* This should never be called by a thread holding the lock */static void GC_dyld_image_add(struct mach_header* hdr, unsigned long slide) {    unsigned long start,end,i;    const struct section *sec;    if (GC_no_dls) return;    for(i=0;i<sizeof(GC_dyld_sections)/sizeof(GC_dyld_sections[0]);i++) {        sec = getsectbynamefromheader(            hdr,GC_dyld_sections[i].seg,GC_dyld_sections[i].sect);        if(sec == NULL || sec->size == 0) continue;        start = slide + sec->addr;        end = start + sec->size;#	ifdef DARWIN_DEBUG            GC_printf4("Adding section at %p-%p (%lu bytes) from image %s\n",                start,end,sec->size,GC_dyld_name_for_hdr(hdr));#       endif        GC_add_roots((char*)start,(char*)end);    }#   ifdef DARWIN_DEBUG        GC_print_static_roots();#   endif}/* This should never be called by a thread holding the lock */static void GC_dyld_image_remove(struct mach_header* hdr, unsigned long slide) {    unsigned long start,end,i;    const struct section *sec;    for(i=0;i<sizeof(GC_dyld_sections)/sizeof(GC_dyld_sections[0]);i++) {        sec = getsectbynamefromheader(            hdr,GC_dyld_sections[i].seg,GC_dyld_sections[i].sect);        if(sec == NULL || sec->size == 0) continue;        start = slide + sec->addr;        end = start + sec->size;#	ifdef DARWIN_DEBUG            GC_printf4("Removing section at %p-%p (%lu bytes) from image %s\n",                start,end,sec->size,GC_dyld_name_for_hdr(hdr));#		endif        GC_remove_roots((char*)start,(char*)end);    }#   ifdef DARWIN_DEBUG        GC_print_static_roots();#   endif}void GC_register_dynamic_libraries() {    /* Currently does nothing. The callbacks are setup by GC_init_dyld()     The dyld library takes it from there. */}/* The _dyld_* functions have an internal lock so no _dyld functions   can be called while the world is stopped without the risk of a deadlock.   Because of this we MUST setup callbacks BEFORE we ever stop the world.   This should be called BEFORE any thread in created and WITHOUT the   allocation lock held. */   void GC_init_dyld() {  static GC_bool initialized = FALSE;  char *bind_fully_env = NULL;    if(initialized) return;  #   ifdef DARWIN_DEBUG  GC_printf0("Registering dyld callbacks...\n");#   endif    /* Apple's Documentation:     When you call _dyld_register_func_for_add_image, the dynamic linker runtime     calls the specified callback (func) once for each of the images that is     currently loaded into the program. When a new image is added to the program,     your callback is called again with the mach_header for the new image, and the 	     virtual memory slide amount of the new image.           This WILL properly register already linked libraries and libraries      linked in the future  */      _dyld_register_func_for_add_image(GC_dyld_image_add);    _dyld_register_func_for_remove_image(GC_dyld_image_remove);    /* Set this early to avoid reentrancy issues. */    initialized = TRUE;    bind_fully_env = getenv("DYLD_BIND_AT_LAUNCH");        if (bind_fully_env == NULL) {#   ifdef DARWIN_DEBUG      GC_printf0("Forcing full bind of GC code...\n");#   endif            if(!_dyld_bind_fully_image_containing_address((unsigned long*)GC_malloc))        GC_abort("_dyld_bind_fully_image_containing_address failed");    }}#define HAVE_REGISTER_MAIN_STATIC_DATAGC_bool GC_register_main_static_data(){  /* Already done through dyld callbacks */  return FALSE;}#endif /* DARWIN */#else /* !DYNAMIC_LOADING */#ifdef PCR#   include "il/PCR_IL.h"#   include "th/PCR_ThCtl.h"#   include "mm/PCR_MM.h"void GC_register_dynamic_libraries(){    /* Add new static data areas of dynamically loaded modules.	*/        {          PCR_IL_LoadedFile * p = PCR_IL_GetLastLoadedFile();          PCR_IL_LoadedSegment * q;                    /* Skip uncommited files */          while (p != NIL && !(p -> lf_commitPoint)) {              /* The loading of this file has not yet been committed	*/              /* Hence its description could be inconsistent.  		*/              /* Furthermore, it hasn't yet been run.  Hence its data	*/              /* segments can't possibly reference heap allocated	*/              /* objects.						*/              p = p -> lf_prev;          }          for (; p != NIL; p = p -> lf_prev) {            for (q = p -> lf_ls; q != NIL; q = q -> ls_next) {              if ((q -> ls_flags & PCR_IL_SegFlags_Traced_MASK)                  == PCR_IL_SegFlags_Traced_on) {                GC_add_roots_inner                	((char *)(q -> ls_addr),                 	 (char *)(q -> ls_addr) + q -> ls_bytes,                	 TRUE);              }            }          }        }}#else /* !PCR */void GC_register_dynamic_libraries(){}int GC_no_dynamic_loading;#endif /* !PCR */#endif /* !DYNAMIC_LOADING */#ifndef HAVE_REGISTER_MAIN_STATIC_DATA/* Do we need to separately register the main static data segment? */GC_bool GC_register_main_static_data(){  return TRUE;}#endif /* HAVE_REGISTER_MAIN_STATIC_DATA */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -