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

Reply via email to