Search code examples
c++dlsym

dlsym() workaround return type


The man page of dlsym() lists

   *(void **) (&cosine) = dlsym(handle, "cos");

as a workaround for casting the return value of dlsym().

What's the meaning of *(void **) (&cosine) here? I understand cosine is a function pointer defined previously, but I'm not sure why an ampersand & is needed before the name (an error without &). Moreover, I don't figure out why the pointer of void * (void **) is again used with *.


Solution

  • Let's unwrap it a bit at a time:

    &cosine
    

    This takes a pointer to the variable cosine, so this will be a pointer to a function pointer.

    (void **) &cosine
    

    We cast the pointer-to-function-pointer to pointer-to-pointer-to-void.

    * (void **) &cosine
    

    We dereference the casted pointer, assigning the result of dlsym() into it.

    Effectively, what's happening is a side-step of the issue. Instead of casting the result of dlsym() into the correct type of function pointer, we pretend that cosine is a void * (through a level of indirection) and assign to it.