Alex Romosan wrote:

> Erik Hofman <[EMAIL PROTECTED]> writes:
> 
> > Alex Romosan wrote:
> >
> >> you are mixing static and dynamic linking. andy is talking about
> >> dynamic linking. i am not sure what you are talking about.
> >
> > Statically linking a shared-object library only means it gets
> > dynamically linked upon program start. There is a way to do delayed
> > static linking, but that is only useful for programs that require a
> > shared-object library under certain circumstances (say when a menu
> > item is selected), but not by default.
> 
> a better fix, which i think will work on both linux and irix is to
> call the dlopen() with a null pathname. the returned handle will then
> be for the main program including the libraries linked dynamically. so
> the correct version of SGLookupFunction() for unix should be (modulo
> the other OSs):
> 
> inline void (*SGLookupFunction(const char *func))()
> {
>   void *handle;
>   void (*fptr)();
> 
>   handle = dlopen (0, RTLD_LAZY);
>   if (!handle) {
>     fprintf (stderr, "%s\n", dlerror());
>     exit(1);
>   }
> 
>   dlerror();    /* Clear any existing error */
>   fptr = (void (*)()) dlsym(handle, func);
>   if ((error = dlerror()) != NULL)  {
>     fprintf (stderr, "%s\n", error);
>     exit(1);
>   }
>   dlclose(handle);
>   return fptr;
> }
> 
> tested only on linux as i don't have access to an irix system (but the
> man page at
> http://www.chemie.fu-berlin.de/cgi-bin/man/sgi_irix?dlopen+3 leads me
> to believe it should also work on irix). hope this helps.

The fact that you are using the function pointer *after* dlclose 
is as broken as Erik's version. This is not good practise to 
bet on side effects that are beyond your control.

-Fred



_______________________________________________
Flightgear-devel mailing list
[EMAIL PROTECTED]
http://mail.flightgear.org/mailman/listinfo/flightgear-devel

Reply via email to