On Fri, Feb 20, 2009 at 7:48 PM, tom fogal <tfo...@alumni.unh.edu> wrote: > 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)
I opted for #2 by just skipping the 'm' prefix for the mangled case. There's some other strcmp() calls that may need updating too. Maybe you could follow-up with patches if more changes are needed. Updated code in git (plus your other two issues). -Brian ------------------------------------------------------------------------------ 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