Andrea Vedaldi <[EMAIL PROTECTED]> writes:

> I'm developing some C++ modules for an engineering software called MATLAB.
> I have a very annoying problem that prevents  C++ exceptions to work properly.

This is somewhat explained in the http://gcc.gnu.org/faq.html#dso
and just figured in the "dynamic_cast problem" thread in this
same newsgroup.

> 1) Modules (MEX-files) are loaded dynamically by MATLAB by dlopen()

Probably without RTLD_GLOBAL ...

> 2) All MEX-files include a common dynamic shared library (libvl.so)

They probably don't "include it", but rather have it as a direct
dependency.

> 3) The shared library throws instances of a certain class
> VL::Exception which are (or should) be intercepted by the MEX-files.
...
> Now:
> - when the FIRST MEX-file is loaded (by MATLAB calling dlopen()),
> libvl.so is loaded as well
> - the weak typeinfo symbols for VL::Exception are correctly merged
> - throws of VL::Exception from libvl.so are correctly intercepted by
> the MEX file
>
> But:
> - when a SECOND MEX-file is loaded (dlopen() again) libvl.so is already loaded
> - the weak typeinfo symbol for VL::Exception in the second MEX-file is
> NOT merged (why?)

Because libvl.so was loaded as part of dlopen() without RTLD_GLOBAL,
and so its symbols have not been added to the list of symbols
available to other dlopen()ed libraries.

> - throws of VL::Esception from libvl.so terminate() the second MEX-file
>
> I managed to let it work as follows:
> - I set LD_PRELOAD=libvl.so BEFORE launching MATLAB
> - in which case all weak typeinfo symbols get merged consistently for
> all calls of dlopen() as libvl.so gets loaded first

Another possible workaround is to explicitly call
  dlopen("libvl.so", RTLD_LAZY|RTLD_GLOBAL)
from every MEX-file.

I was able to replicate the behaviour you described on a trivial
test case, and calling dlopen(..., RTLD_GLOBAL) fixes the crash 
in that test case.

Cheers,
-- 
In order to understand recursion you must first understand recursion.
Remove /-nsp/ for email.
_______________________________________________
help-gplusplus mailing list
help-gplusplus@gnu.org
http://lists.gnu.org/mailman/listinfo/help-gplusplus

Reply via email to