The relocation table of a shared object is not updated properly via the run-time linking method (dlopen). This means the calling process can make function calls into the shared object fine, but the shared object can not call it's own functions unless they are local/static because they have the wrong address location in the relocation table (illegal exception).
One solution is to build the shared object using a mapfile specifying all the funcions as local. However, make the shared object's interface (functions that will be called by a another process) global but call a local function that does the actual work. This means you will actually have two function (a global and local) doing the same thing.
Keep in mind there are other solutions depending on your situation. This is the one that worked for me because of the complexity of my shared object. If you have a one module shared object the mapfile can be eliminated by making functions local using the modifier static (a c/c++ key word).
example:
static void function(void)
{
}