On Saturday, 31 October 2009 10:26:55 David Naylor wrote: > On Friday, 30 October 2009 18:25:17 Kris Moore wrote: > > On Fri, 30 Oct 2009, David Naylor wrote: > > > Hi, > > > > > > It appears that kpythonpluginfactory does not work when the python > > > script calls a lib-dynload object (such as 'import time'). A typical > > > message is: > > > > > > ImportError: /usr/local/lib/python2.6/lib-dynload/time.so: Undefined > > > symbol "PyExc_IOError" > > > > > > This stops system-settings-printer-kde from working (and, I think > > > plasma- python scripting). I know this worked in KDE 4.2.0. A > > > tentative speculation to the cause leads me to conclude something > > > happened to FreeBSD (I still needs to do an upgrade to RC2)*. > > > > > > I did, however, find a work around: get kpythonpluginfactory to link > > > statically to python. This obviously leads to a bigger file. > > > > > > Does anyone have KDE <4.2.2 running, if so please install > > > print/system-config- printer-kde and see if you can load the "Printer > > > Configuration" in systemsettings. Please report if the config module > > > loads and what version of KDE and FreeBSD you are running. > > > > > > Thanks, > > > > > > David > > > > > > *I'm also having problems with cups-smb and this may be related > > > > David, > > > > I did some investigation with this issue a while back. I think its a bug > > in the python port itself, none of the lib-dynload libraries are linked > > to the main python library. For example, if you run this: > > > > setenv LD_PRELOAD "/usr/local/lib/libpython2.6.so" ; systemsettings > > > > You should now be able to bring up the KDE printer interface. If you do > > this, you can see what those libs are linked to: > > > > # cd /usr/local/lib/python2.6/lib-dynload > > # setenv LD_LIBRARY_PATH `pwd` > > # ldd time.so > > time.so: > > libm.so.5 => /lib/libm.so.5 > > libthr.so.3 -> /lib/libthr.so.3 > > libc.so.7 => /lib/libc.so.7 > > > > I'm thinking that if we fix the python port to link these lib-dynload/* > > libaries to /usr/local/lib/libpython2.6.so the problem will go away. > > Investigating this now actually, but if somebody else had ideas on this, > > please let us know :) > > This is actually a design feature of python. If those libraries are linked > to libpython then it will break the case where one links statically to > libpython. See http://bugs.python.org/issue4434 for the PR at python that > discusses it. > > The way to get around this is to dlopen libpython with RTLD_GLOBAL. I've > checked the code in kpythonpluginfactory and that is exactly what it does. > That behaviour has never changed. > > I do remember this working for me a while back and stopped after I did a > system wide upgrade. This, I presume, also works for Linux. > > I'm planning on upgrading to RC2 and if the issue is still present I'll > write a simple test program that should exhibit the same behaviour and > check to see if it works on older versions of FreeBSD.
It still does not work under RC2. I am now doubting this is a regression and it was planetary alignments that had it working for me previously :-) I wrote a test program that *should* trigger the same problem. See rtld_global.shar for the program. The default behaviour is my fix, to trigger the problem run `make -DTRIGGER`. It is a small program and should be easy to figure out. See attached for the fix. Add the patch to devel/kdebindings4-python-pykde4 and reinstall. If you encounter any problems please let me know. Regards
# This is a shell archive. Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file". Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
# rtld_global
# rtld_global/Makefile
# rtld_global/libmaster.c
# rtld_global/main.c
# rtld_global/libslave.c
# rtld_global/common.h
# rtld_global/libplugin.c
#
echo c - rtld_global
mkdir -p rtld_global > /dev/null 2>&1
echo x - rtld_global/Makefile
sed 's/^X//' >rtld_global/Makefile << '54185eeffb995a36288ad17f38c2bdc0'
X.SUFFIXES: .a .c .o .so .so.1
X.SILENT:
X
XCFLAGS=-Wall -rdynamic
X
X.if defined(TRIGGER)
XCFLAGS+=-DTRIGGER
X.endif
X
XCC=cc
XAR=ar
XLN=ln
X
Xall:
X echo "Running test without linking: "
X make clean test #> /dev/null
X echo "done"
X echo
X echo "Running test with linking: "
X make clean test -DLINKED #> /dev/null
X echo "done"
X
Xclean:
X rm -f *.a *.o *.so* main
X
Xtest: main libmaster.so libslave.so
X env LD_LIBRARY_PATH=${PWD} ./main
X
X.c.o:
X ${CC} ${CFLAGS} -c -fPIC -o $@ $<
X
X.c.so:
X ${CC} ${CFLAGS} -fPIC -shared -Wl,-soname,$@ -o $@ $<
X
X.if defined(LINKED)
Xlibplugin.so: libplugin.c libmaster.so
X ${CC} ${CFLAGS} -DLINKED -fPIC -L. -lmaster -shared -Wl,-soname,$@ -o
$@ $<
X.endif
X
Xmain: main.o libplugin.so
X cc ${CFLAGS} -o main main.o
54185eeffb995a36288ad17f38c2bdc0
echo x - rtld_global/libmaster.c
sed 's/^X//' >rtld_global/libmaster.c << '4c7e49ccff36dd33ab5357b611fe5d83'
X#include "common.h"
X
Xint master_func() {
X void* libslave;
X func_t func;
X
X printf("libmaster: opening libslave:");
X libslave = dlopen("libslave.so", RTLD_NOW);
X STATUS_CHECK(libslave);
X
X printf("libmaster: getting symbol 'libslave::slave_func':");
X func = (func_t)dlfunc(libslave, "slave_func");
X STATUS_CHECK(func);
X
X printf("libmaster: calling 'libslave::slave_func'...\n");
X return func();
X}
X
Xconst char* master_name() {
X return "libmaster.1";
X}
4c7e49ccff36dd33ab5357b611fe5d83
echo x - rtld_global/main.c
sed 's/^X//' >rtld_global/main.c << 'cb6b43e30862d408f1380a58a3050ed8'
X#include "common.h"
X
Xint main(int argc, char** argv) {
X void* libplugin;
X func_t func;
X
X printf("main: opening libplugin:");
X libplugin = dlopen("libplugin.so", RTLD_LAZY /*| RTLD_GLOBAL*/);
X STATUS_CHECK(libplugin);
X
X printf("main: getting symbol 'libplugin::plugin_func':");
X func = (func_t)dlfunc(libplugin, "plugin_func");
X STATUS_CHECK(func);
X
X printf("main: calling 'libplugin::plugin_func'...\n");
X return func();
X}
cb6b43e30862d408f1380a58a3050ed8
echo x - rtld_global/libslave.c
sed 's/^X//' >rtld_global/libslave.c << '6027f0c5e11bc3f1d64c5398f3095d35'
X#include <stdio.h>
X
X/* Forward declaration from libmaster */
Xconst char* master_name();
X
Xint slave_func() {
X printf("libslave: %s\n", master_name());
X return 0;
X}
6027f0c5e11bc3f1d64c5398f3095d35
echo x - rtld_global/common.h
sed 's/^X//' >rtld_global/common.h << '96ded3809880f52ca04e85b8175d157f'
X#include <dlfcn.h>
X#include <stdio.h>
X
X#define STATUS_CHECK(var) \
X if ((var) == NULL) {
\
X printf(" failure (%s)\n", dlerror()); \
X return 1; \
X } else \
X printf(" success\n")
X
Xtypedef int (*func_t)();
96ded3809880f52ca04e85b8175d157f
echo x - rtld_global/libplugin.c
sed 's/^X//' >rtld_global/libplugin.c << 'a806cc4670bd702634b1d6e2d06150e5'
X#include "common.h"
X
X#ifdef LINKED
Xint master_func();
X#endif
X
Xint plugin_func() {
X func_t func;
X
X#if !defined(LINKED) || defined(TRIGGER)
X void* libmaster;
X
X printf("libplugin: opening libmaster:");
X libmaster = dlopen("libmaster.so", RTLD_LAZY | RTLD_GLOBAL);
X STATUS_CHECK(libmaster);
X#else
X void* libplugin;
X
X printf("libplugin: exposing symbols globally:");
X libplugin = dlopen("libplugin.so", RTLD_NOLOAD | RTLD_GLOBAL);
X STATUS_CHECK(libplugin);
X#endif
X
X#ifndef LINKED
X printf("libplugin: getting symbol 'libmaster::master_func':");
X func = (func_t)dlfunc(libmaster, "master_func");
X STATUS_CHECK(func);
X#else
X func = &master_func;
X#endif
X
X printf("libplugin: calling 'libmaster::master_func'...\n");
X return func();
X}
a806cc4670bd702634b1d6e2d06150e5
exit
--- python/pykde4/kpythonpluginfactory/kpythonpluginfactory.cpp~ 2009-10-31 16:30:02.000000000 +0200
+++ python/pykde4/kpythonpluginfactory/kpythonpluginfactory.cpp 2009-10-31 16:35:50.000000000 +0200
@@ -18,6 +18,8 @@
Boston, MA 02111-1307, USA.
*/
+#include <dlfcn.h>
+
#include <QtCore/QCoreApplication>
#include <QFileInfo>
#include <QDir>
@@ -295,6 +297,8 @@
// symbols global and available for later loaded libraries/module.
QLibrary *LoadPythonLibrary()
{
+ /* Promote this library (and thus libpython) to RTLD_GLOBAL) */
+ dlopen("kpythonpluginfactory.so", RTLD_NOLOAD | RTLD_GLOBAL);
QLibrary *pythonLib = new QLibrary();
pythonLib->setLoadHints(QLibrary::ExportExternalSymbolsHint);
pythonLib->setFileName(LIB_PYTHON);
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ kde-freebsd mailing list [email protected] https://mail.kde.org/mailman/listinfo/kde-freebsd See also http://freebsd.kde.org/ for latest information
