Ian Romanick wrote: > > On Tue, Apr 23, 2002 at 12:49:20AM +0100, Keith Whitwell wrote: > > > Well, you're doing something you're not supposed to do & as a result > > glXGetProcAddress isn't working right. > > > > Do you really need to call your symbol glBegin? How about xyzBegin or > > similar? > > I have managed to solve this problem (see below), but first I'll give some > background. I had a rather large chunk of OpenGL code from a non-Linux > system that made some assumptions about what extensions would be available > in libGL.so. It checked to make sure that the extensions were enabled in > the driver before calling them, but it still assumed that the linker would > be able to resolve them at load time. Since a number of these extensions > don't exist in Mesa, the program would compile just fine, but it would not > link. > > I *really* did not want to have to make changes to the source code. It is > about 100,000 LOC, and changing the source with a bunch of ifdefs sounded > like way too much work. My initial attempt at working around this was to > write a script that would process glext.h and use the PFNGL* typedefs to > create a bunch of pointers-to-functions. It also generated a table of > structures that I would use with glXGetProcAddress to resolve the pointers. > > struct gl_extension > { > /* Name of the function that is needed. > */ > const char * name; > > /* Pointer to the pointer-to-function. > */ > void ** function; > }; > > A short stub routine would get called once at start up to fill in all of the > function pointers using glXGetProcAddress. Since all of the C files > included a header file that declared all of the extension functions as > pointer-to-function, the compiler would generate code to call it the right > way. If everything worked correctly, I would need to make no changes to the > 100,000 lines of application code. > > Everything did work correctly UNTIL it came time to resolve a function that > was exported by libGL.so. I believe the function that actually started the > whole mess was glTexImage3DEXT, but it could have just as easilly been any > of a number of functions. As near as I can tell, when ld.so loaded > libGL.so, it saw that glTexImage3DEXT was in address space already, so it > didn't bother to load it from the library. All references to > glTexImage3DEXT in the library were directed to the symbol in the > application. The end result being that glXGetProcAddress( "glTexImage3DEXT" ) > returned a pointer to the address where I was going to store it! > > I did find a very inelegant way to work around this (for those not > completely following, this is a work around to a work around *grin*). > Instead of having the script create a header file with the > pointers-to-functions having their actual OpenGL names, it prepends foo_ to > all of the names. glTexImage3DEXT becomes foo_glTexImage3DEXT. It then > generates a define to redirect the OpenGL name to the foo_ name. > > #define glTexImage3DEXT foo_glTexImage3DEXT > > Since this happens in the C preprocessor, ld.so never has any knowledge of > it. All it sees in the application is foo_glTexImage3DEXT, so it knows that > it still needs to resolve glTexImage3DEXT from libGL.so. > > I *KNOW* that I cannot be the first person who has ever had to try and solve > this problem. The OpenGL developer FAQ provides some hints, but really only > gives enough information to get from an unlinkable application to an > unrunable application. > > http://www.opengl.org/developers/faqs/technical/extensions.htm#0060 > > How have other people solved this? If there are some particularly good > sollutions out there, perhaps we could recommend that they be added to the > OpenGL developer FAQ. That sure would have saved me some trouble!
I think by passing various flags to dlopen you can manipulate the behaviour when resolving symbols in the loaded library (ie you'd have to dlopen libGL.so, and have *all* GL operations go through function pointers). Keith _______________________________________________ Dri-devel mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/dri-devel