diff -ru gc6.2alpha3/configure.in gc6.2alpha3-dylib/configure.in --- gc6.2alpha3/configure.in Wed Mar 5 15:01:13 2003 +++ gc6.2alpha3-dylib/configure.in Wed Mar 5 10:36:29 2003 @@ -179,7 +179,14 @@ esac AC_SUBST(THREADLIBS) -AC_CHECK_LIB(dl, dlopen, EXTRA_TEST_LIBS="$EXTRA_TEST_LIBS -ldl") +# I'm not too familiar with autoconf, is this the best way to do this? -Brian +case "$host" in + *-*-darwin*) ;; + *) + AC_CHECK_LIB(dl, dlopen, EXTRA_TEST_LIBS="$EXTRA_TEST_LIBS -ldl") + ;; +esac + AC_SUBST(EXTRA_TEST_LIBS) target_all=libgc.la diff -ru gc6.2alpha3/dyn_load.c gc6.2alpha3-dylib/dyn_load.c --- gc6.2alpha3/dyn_load.c Thu Jan 23 19:34:21 2003 +++ gc6.2alpha3-dylib/dyn_load.c Wed Mar 5 15:39:39 2003 @@ -57,7 +57,8 @@ !defined(HPUX) && !(defined(LINUX) && defined(__ELF__)) && \ !defined(RS6000) && !defined(SCO_ELF) && !defined(DGUX) && \ !(defined(FREEBSD) && defined(__ELF__)) && \ - !(defined(NETBSD) && defined(__ELF__)) && !defined(HURD) + !(defined(NETBSD) && defined(__ELF__)) && !defined(HURD) && \ + !defined(MACOSX) --> We only know how to find data segments of dynamic libraries for the --> above. Additional SVR4 variants might not be too --> hard to add. @@ -1077,7 +1078,63 @@ } #endif /* RS6000 */ +#ifdef MACOSX +#include +#include + +/*#define MACOSX_DEBUG */ + +void GC_register_dynamic_libraries() +{ + unsigned long image_count; + const struct mach_header *mach_header; + const struct section *sec; + unsigned long slide; + unsigned long filetype; + int i,j; + unsigned long start; + unsigned long end; + + static struct { + const char *seg; + const char *sect; + } sections[] = { + { SEG_DATA, SECT_DATA }, + { SEG_DATA, SECT_BSS }, + { SEG_DATA, SECT_COMMON } + }; + + image_count = _dyld_image_count(); + for(i=0;ifiletype; + + for(j=0;jsize == 0) continue; + start = slide + sec->addr; + end = start + sec->size; +# ifdef MACOSX_DEBUG + GC_printf4("Adding section at %p-%p (%lu bytes) from image %s\n", + start,end,sec->size,_dyld_get_image_name(i)); +# endif + + GC_add_roots_inner((char*)start,(char*)end, + filetype == MH_EXECUTE ? FALSE : TRUE); + } + } +} + +#define HAVE_REGISTER_MAIN_STATIC_DATA +GC_bool GC_register_main_static_data() +{ + return FALSE; +} + +#endif /* MACOSX */ #else /* !DYNAMIC_LOADING */ diff -ru gc6.2alpha3/include/private/gcconfig.h gc6.2alpha3-dylib/include/private/gcconfig.h --- gc6.2alpha3/include/private/gcconfig.h Wed Mar 5 15:01:14 2003 +++ gc6.2alpha3-dylib/include/private/gcconfig.h Wed Mar 5 10:27:26 2003 @@ -718,6 +718,7 @@ # define SIG_SUSPEND SIGXCPU # define SIG_THR_RESTART SIGXFSZ # endif +# define DYNAMIC_LOADING /* XXX: see get_end(3), get_etext() and get_end() should not be used */ # define DATASTART ((ptr_t) get_etext()) # define STACKBOTTOM ((ptr_t) 0xc0000000)