There is an issue loading mangled mesa symbols.

In _glapi_get_proc_address, there is the code:

   #ifdef MANGLE
      if (funcName[0] != 'm' || funcName[1] != 'g' || funcName[2] != 'l')
         return NULL;
   #else
      if (funcName[0] != 'g' || funcName[1] != 'l')
         return NULL;
   #endif

thus, if the user is mangling mesa, any string they give which does not
have the mangled name will quickly return NULL.  Sure, fine, but then
eventually `find_entry' will be called for some paths, which contains
the code:

   for(i from 1 to N...) {
     const char *testName = gl_string_table + static_functions[i].Name_offset;
     if (strcmp(testName, n) == 0) {
        return &static_functions[i];
     }
   }

Unfortunately the static_functions table only contains the demangled
names.  Thus, the user *cannot* load functions from a mangled mesa
library: if they use the non-mangled name, then the #ifdef in
_glapi_get_proc_address will bail on them without even searching; if
they use the mangled name, find_entry will iterate through the entire
table and never find a match because the table only contains the
non-mangled name.

I have verified that removing the `#ifdef MANGLE' case and simply
using the else clause allows the user to load basic functions, e.g.
`glBegin'.  Of course, this means that a user must load `glBegin'
instead of `mglBegin' regardless of whether or not they are using
mangled Mesa.

I'm not really sure if that's a good thing or a bad thing, but I'll let
you decide.  Please inform me which of these solutions you'd like to
see:

  1. Remove the #ifdef MANGLE case.  To load `glBegin', for example,
     users must call `mglXGetProcAddress("glBegin")'. [1]
  2. use an #ifdef MANGLE case in find_entry to dynamically build a
     string which is essentially ("m" concat gl_string_table +
     static_functions[i].Name_offset).  Do the comparison based on
     the dynamic string and the argument.
  3. Change the table such that it contains `glBegin' (etc.) in the
     unmangled case, and `mglBegin' in the mangled case.
  4. other that I haven't thought of (please explain)

Thanks,

-tom

[1] I imagine glXGetProcAddressARB("glBegin") would work too.  My use
    case necessitates the former though, so I haven't tried.

------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to