Re: Proposed Fix for GTK3 Crashes - dlopen flags

Robin Dunn <[email protected]>
Newsgroups gmane.comp.python.wxpython.devel
Message-ID <[email protected]>
Scott Talbert wrote:
> On Tue, 24 Feb 2015, Scott Talbert wrote:
>
>> I've been working on investigating a couple of crashes that occur with
>> wxPython 3.0.2.0 with a GTK+3 backend:
>> http://trac.wxwidgets.org/ticket/16820
>>
>> There is a similar crash that occurs when using a wx.Printer.
>>
>> Anyway, I've spent considerable time investigating these and found
>> that the crash is because GTK performs some dlsym() calls to lookup
>> symbol names and fails in going so because its symbols were loaded in
>> the local namespace, not the global namespace (ie, RTLD_LOCAL vs
>> RTLD_GLOBAL). I've discussed this with the GTK devs and basically, GTK
>> expects its symbols to be loaded globally.
>>
>> Thus, I have a solution that I would like to propose for discussion:
>>
>> diff -up wxPython/src/__init__.py.dlopenflags wxPython/src/__init__.py
>> --- wxPython/src/__init__.py.dlopenflags 2013-02-27 15:14:01.000000000
>> -0500
>> +++ wxPython/src/__init__.py 2015-02-24 20:43:44.143492336 -0500
>> @@ -42,7 +42,11 @@ __all__ = [
>> ]
>>
>> # Load the package namespace with the core classes and such
>> +import dl, sys
>> +flags = sys.getdlopenflags()
>> +sys.setdlopenflags(flags|dl.RTLD_GLOBAL)
>> from wx._core import *
>> +sys.setdlopenflags(flags)
>> del wx
>>
>> if 'wxMSW' in PlatformInfo:
>>
>> ===
>>
>> Basically, this would change the dlopen flags before importing the
>> core module to RTLD_GLOBAL and then change them back afterwards. That
>> way, the core module and its dependencies (to include GTK) are loaded
>> into the global namespace.
>>
>> Comments on this proposal?
>>
>> It needs more work but I wanted to get feedback before finalizing a
>> patch. (ie, it probably only needs to be done on when we're using a
>> GTK+3 backend, needs to check whether the dl module is available, etc.)
>
> Okay, here's an updated version of the patch. Unfortunately, it isn't
> possible to check the backend (and only change the dlopen flags if on
> GTK+3) because the backend isn't known until _core.so is imported. After
> that point, it's too late.
>
> It's possible that we could somehow have SWIG put this into the
> generated _core.py only for GTK+3, but I'm not sure how to do that.
>
> Comments?

I'm curious how pygtk handles this. Have you checked there?

IIRC in the early days of OSX the default was the OSX equivalent of 
RTLD_GLOBAL, and it caused some hard to diagnose issues.  The 
alternative at the time was a 2 level namespace and using that meant 
that extension modules couldn't find the Python C API functions, so it 
was even worse.  So setting RTLD_GLOBAL worries me a bit.

-- 
Robin Dunn
Software Craftsman
http://wxPython.org

-- 
You received this message because you are subscribed to the Google Groups "wxPython-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
For more options, visit https://groups.google.com/d/optout.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.