[Distutils] Dynamic linking - another idea
Phillip J. Eby
pje at telecommunity.com
Sat Jan 7 17:20:40 CET 2006
Okay, so here's a crazy idea to make dynamic libraries in the same package
work. Suppose the linker includes an rpath of '.' (aka os.curdir), and
renames each extension module that's using a library such that it's not
directly importable by Python. Setuptools already generates a stub .py
file loader for extension modules anyway during bdist_egg, so that zipped
extensions can be extracted. So, this stub could just change directory to
the directory of the extension before doing the import, with
setdlopenflags(RTLD_NOW).
If I understand correctly, this should force all symbols in the extension
to be resolved immediately, so the '.' rpath would let the extension load
the nearby library. After this was done, the stub code would restore the
original current directory and dlopen flags.
Since extensions built this way would not be directly importable, it would
ensure that the stub is always used. And since they do not require a
hardcoded real path, they would be relocatable and manually extractable
from the zipfile.
Does any see any holes in this, aside from the sheer craziness of doing
it? :) That is, are there any platforms where a '.' rpath is
forbidden? Where RTLD_NOW won't let it resolve all the symbols? Where the
'.' rpath is interpreted as the executable's startup directory rather than
as the load-time current directory?
More information about the Distutils-SIG
mailing list