Eyal Lebedinsky wrote:
> I have a system that uses some shared libraries. I find that
> when a library constructor runs the __wrap_main() did not
> yet execute and as a results I get many violations on the
> objects that it registers.

The attached patch seems to work for me, is it proper?

It registers the standard data items at init time. I allowed it
to register in wrap_main too, but maybe all we need is to register
it at init time rather than in wrap_main.

-- 
Eyal Lebedinsky ([EMAIL PROTECTED]) <http://samba.org/eyal/>
        attach .zip as .dat
--- gcc/libmudflap/mf-runtime.c.old	2005-07-30 18:53:17.000000000 +1000
+++ gcc/libmudflap/mf-runtime.c	2005-07-30 17:18:20.000000000 +1000
@@ -681,6 +681,38 @@
   return trees[type];
 }
 
+static void
+__mf_register_std_data (void)
+{
+  static int been_here = 0;
+  unsigned i;
+
+  if (!__mf_opts.heur_std_data || been_here)
+	  return;
+
+  been_here = 1;
+
+  for (i=0; ; i++)
+    {
+      char *e = environ[i];
+      unsigned j;
+      if (e == NULL) break;
+      j = strlen (environ[i]);
+      __mf_register (environ[i], j+1, __MF_TYPE_STATIC, "environ element");
+    }
+  __mf_register (environ, sizeof(char *)*(i+1), __MF_TYPE_STATIC, "environ[]");
+
+  __mf_register (& errno, sizeof (errno), __MF_TYPE_STATIC, "errno area");
+
+  __mf_register (stdin,  sizeof (*stdin),  __MF_TYPE_STATIC, "stdin");
+  __mf_register (stdout, sizeof (*stdout), __MF_TYPE_STATIC, "stdout");
+  __mf_register (stderr, sizeof (*stderr), __MF_TYPE_STATIC, "stderr");
+
+  /* Make some effort to register ctype.h static arrays.  */
+  /* XXX: e.g., on Solaris, may need to register __ctype, _ctype, __ctype_mask, __toupper, etc. */
+  /* On modern Linux GLIBC, these are thread-specific and changeable, and are dealt
+     with in mf-hooks2.c.  */
+}
 
 /* not static */void
 __mf_init ()
@@ -724,6 +756,8 @@
   /* Prevent access to *NULL. */
   __mf_register (MINPTR, 1, __MF_TYPE_NOACCESS, "NULL");
   __mf_lookup_cache[0].low = (uintptr_t) -1;
+
+  __mf_register_std_data ();
 }
 
 
@@ -740,6 +774,8 @@
     {
       unsigned i;
 
+      __mf_register_std_data ();
+
       been_here = 1;
       __mf_register (argv, sizeof(char *)*(argc+1), __MF_TYPE_STATIC, "argv[]");
       for (i=0; i<argc; i++)
@@ -748,26 +784,6 @@
           __mf_register (argv[i], j+1, __MF_TYPE_STATIC, "argv element");
         }
 
-      for (i=0; ; i++)
-        {
-          char *e = environ[i];
-          unsigned j;
-          if (e == NULL) break;
-          j = strlen (environ[i]);
-          __mf_register (environ[i], j+1, __MF_TYPE_STATIC, "environ element");
-        }
-      __mf_register (environ, sizeof(char *)*(i+1), __MF_TYPE_STATIC, "environ[]");
-
-      __mf_register (& errno, sizeof (errno), __MF_TYPE_STATIC, "errno area");
-
-      __mf_register (stdin,  sizeof (*stdin),  __MF_TYPE_STATIC, "stdin");
-      __mf_register (stdout, sizeof (*stdout), __MF_TYPE_STATIC, "stdout");
-      __mf_register (stderr, sizeof (*stderr), __MF_TYPE_STATIC, "stderr");
-
-      /* Make some effort to register ctype.h static arrays.  */
-      /* XXX: e.g., on Solaris, may need to register __ctype, _ctype, __ctype_mask, __toupper, etc. */
-      /* On modern Linux GLIBC, these are thread-specific and changeable, and are dealt
-         with in mf-hooks2.c.  */
     }
 
 #ifdef PIC

Reply via email to