On Sat, Jan 14, 2017 at 03:30:50PM -0600, A. Wilcox wrote: > On 04/01/17 13:36, Rich Felker wrote: > > Here's a v2 of the patch with the above issues fixed, and some > > comments that hopefully make it make sense. I still think there's more > > logic needed to allow concurrent ctors from unrelated dlopen in > > multiple threads, though. > > > > Rich > > > > > Applied to this to Adélie's musl package in a dev overlay and rebooted a > box with this patch applied. > > What a fantastic little show! > > iv_tls_user_ptr: called on unregistered iv_tls_user > /etc/init.d/syslog-ng: line 34: 2560 Aborted syslog-ng > -s -f "${SYSLOG_NG_CONFIGFILE}" > * ERROR: syslog-ng failed to start > > > When X tried to start up, further fireworks: > > > /usr/bin/startkde: line 384: 2638 Segmentation fault kwrapper5 > /usr/bin/ksmserver $KDEWM $KSMSERVEROPTIONS > > > Starting program: /usr/bin/kwrapper5 /usr/bin/ksmserver > process 3281 is executing new program: /usr/bin/ksmserver > [New LWP 3287] > > Program received signal SIGSEGV, Segmentation fault. > 0x00007ffff009938b in operator== (s1=..., s2=...) at tools/qstring.cpp:2686 > 2686 tools/qstring.cpp: No such file or directory. > (gdb) bt > #0 0x00007ffff009938b in operator== (s1=..., s2=...) at > tools/qstring.cpp:2686 > #1 0x00007fffe2af2ae4 in operator!= (s2=..., s1=...) at > /usr/include/qt5/QtCore/qstring.h:632 > #2 KHintsSettings::KHintsSettings (this=0x7fffe65829c0, kdeglobals=...) > at > /usr/src/kde-plasma/plasma-integration-5.7.5/work/plasma-integration-5.7.5/src/platformtheme/khintssettings.cpp:70 > > > Where khintssettings.cpp contains: > > 68 const QString looknfeel = cg.readEntry("LookAndFeelPackage", > defaultLookAndFeelPackage); > 70 if (looknfeel != defaultLookAndFeelPackage) { > > > And defaultLookAndFeelPackage is defined earlier in the source file as a > constant: > > static const QString defaultLookAndFeelPackage = > QStringLiteral("org.kde.breeze.desktop"); > > > We can see that defaultLookAndFeelPackage was not initialised correctly: > > (gdb) printqs5static looknfeel > $9 = (Qt5 QString)0xffffdde0 length=22: "org.kde.breeze.desktop" > (gdb) printqs5static defaultLookAndFeelPackage > $10 = (Qt5 QString)0xe2d0be90 length=Cannot access memory at address 0x4 > > > It therefore seems to me that this patch still needs some refining. Here's a v3 with a couple of issues fixed: 1. I failed to notice that do_init_fini needs to be called with a pointer to the root of the (new part of) the dependency tree rather than the tail of the dso list after the changes to its behavior. This is now fixed. 2. The needed_by for libc.so itself was always null, causing tree traversal to end immediately after visiting libc.so. It's now set to the first dso that referenced it. 3. Likewise LD_PRELOAD dsos had a null needed_by. They're now treated as being "needed by" the main app (as if they appeared in its DT_NEEDED). After these changes, your failing test case at https://bpaste.net/raw/30ec06873fa2, code copied here: ------------------------------------------------------------------------ #include class NeedCXX { public: NeedCXX() { this->Foo = 1; } int GetFoo() { return this->Foo; } private: int Foo; }; int main() { NeedCXX c; std::cout << c.GetFoo() << std::endl; return 0; } ------------------------------------------------------------------------ seems to work as expected. I don't know if other bugs remain but at least it seems plausible that it's working correctly now. Rich