Re: [Gc] gc, guile, and NetBSD

Thomas Klausner <tk-JlXkzPh5ucKzZXS1Dc/[email protected]> Wed, 29 Oct 2014 18:01:45 +0100
Newsgroups gmane.comp.programming.garbage-collection.boehmgc
Message-ID <[email protected]>
Hi Enami-san!

On Wed, Oct 29, 2014 at 01:06:59PM +0900, [email protected] wrote:
> Hi,
> 
> Thomas Klausner <tk-JlXkzPh5ucKzZXS1Dc/[email protected]> writes:
> 
> > The guile build fails with:
> >
> >   GEN      guile-procedures.texi
> > GC_is_visible test failed
> > [1]   Broken pipe             cat alist.doc ar... |
> >       Abort trap (core dumped) GUILE_INSTALL_LO...
> 
> Current GC_FirstDLOpenedLinkMap() for NetBSD calls dlinfo(RTLD_SELF,
> RTLD_DI_LINKMAP, &lm) to find link_map.  So it will find link_map of
> libgc.
> 
> With guile's case, libgc is link to libguile and libguile is linked to
> the guile command, so libgc is not the first one in the link_map chain.
> 
> That's why, data section of libguile, where scm_protects exists, isn't
> added to GC root and GC_is_visible fails.
> 
> The attaced patch works for me.

Thank you very much!

I can confirm that this patch makes guile2 build for me.

Can this patch please integrated into gc?
 Thomas

> 
> enami.

> --- dyn_load.c.orig	2014-06-03 15:08:02.000000000 +0900
> +++ dyn_load.c	2014-10-29 13:02:43.000000000 +0900
> @@ -687,8 +687,16 @@
>      if( cachedResult == 0 ) {
>  #     if defined(NETBSD) && defined(RTLD_DI_LINKMAP)
>          struct link_map *lm = NULL;
> -        if (!dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &lm))
> -            cachedResult = lm;
> +        if (!dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &lm) && lm != NULL) {
> +            /*
> +             * Now, lm points link_map object of libgc.  Since it
> +             * might not be the first dynamically linked object,
> +             * try to find it (object next to the main object).
> +             */
> +            while (lm->l_prev)
> +                lm = lm->l_prev;
> +            cachedResult = lm->l_next;
> +        }
>  #     else
>          int tag;
>          for( dp = _DYNAMIC; (tag = dp->d_tag) != 0; dp++ ) {