On Mon, Jan 21, 2013 at 05:09:25PM +0000, David Chisnall wrote: > On 21 Jan 2013, at 16:54, Konstantin Belousov wrote: > > > On Mon, Jan 21, 2013 at 04:12:00PM +0000, David Chisnall wrote: > >> On 21 Jan 2013, at 04:49, Konstantin Belousov wrote: > >> > >>> Yes, quite possible. AFAIR, the 'catch' code compares the exception > >>> classes > >>> by the shared object ownership. It might get confused due to filter > >>> providing > >>> some symbols. > >>> > >>> But I did not investigated the cause for real. > >> > >> The issue appears to be that the libstdc++ exports a few functions[1] that > >> libsupc++ exports, but with different symbol versions. Unfortunately, > >> these are things that set handlers that are then called from libsupc++ / > >> libcxxrt when, for example, an exception specification violation is > >> encountered. > >> > >> I'm not sure what the solution is here. Is there some version-script-foo > >> that we can do to say 'filter this symbol with this version as if it were > >> this one with this version'? We ideally want to keep them with the > >> current version in libcxxrt / libsupc++, but not introduce linker errors. > >> > >> David > >> > >> [1] std::set_new_handler(), std::set_terminate(), std::set_unexpected() > > > > Can you prepare the minimal isolated test case which demostrates the > > behaviour ? A plan would be to ask somebody to run the test on the linux. > > I think we must be bug-to-bug compatible with glibc in regard to the > > filters quirks. > > I'm not sure what you want the test case to demonstrate. I have a reduced > form of the exception test case, but it only fails for us because of the > symbol versioning issue. Moving the relevant symbols into the same version > in our libsupc++ and libcxxrt as in libstdc++ fixes it (and is probably the > right thing to do. On closer inspection both already expose new and delete > in this symbol version namespace, so it's fine to add a few more). > > > Gnu filters work only on the whole object scope. Solaris linkers do > > have per-symbol filtering, but Solaris does not implement per-symbol > > versioning, on the other hand. > > If you want a simple test case for the filter behaviour, the recipe is: > > Symbol X in filter with version A > Symbol X in filtee with version B > Symbol Y in program uses symbol X > > Program sees version A, filtee sees version B. So can you provide self-contained test.tgz with Makefile and neccessary .c files which demonstrate exactly the behaviour you see ?
pgp3EjFIMKvpE.pgp
Description: PGP signature