Proposed Fix for GTK3 Crashes - dlopen flags

Scott Talbert <[email protected]>
Newsgroups gmane.comp.python.wxpython.devel
Message-ID <[email protected]>
Hi all,

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.)

Thanks,
Scott
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.