Static executable with shared modules

"Martin v. Löwis" martin at v.loewis.de
Mon Jan 17 17:24:51 EST 2005


Rickard Lind wrote:
> I'll be more specific: when I build python 2.3.4 on FreeBSD 4.9,
> the interpreter binary is linked against three shared libraries: 
> libutil.so.3, libm.so.2 and libc_r.so.4. Now, these libraries are
> not present on the TARGET system (which is distinct from the build
> system, but based on the same version of FreeBSD) so I add "-static"
> to LDFLAGS.  This produces an interpreter that runs on the target
> system (no dependency on shared libc etc) but it also cannot load
> modules compiled as shared libraries. Man page for dlopen(3) says
> it is located in libc (and consquently there seems to be no libdl),
> and anyway I'd expect to get a link error if the dl* functions were
> not present. What I DO get is an ImportError exception.

Most likely, the static libc.a does not provide dlopen (contrary
to what the man page says). Python's configure detects that you
don't have dlopen (when linking with -static), and concludes that
dynamic loading of modules is not supported on your system.
Then, during import, it checks built-in modules, module.py, module.pyc,
and finds neither - it then reports an import error.

To confirm this theory, have a look at pyconfig.h, and check
whether HAVE_DLOPEN and/or HAVE_DYNAMIC_LOADING are defined;
I expect that neither is defined.

> At present I see no other option than to link the modules into the
> interpreter which is very inconvenient since I'll have to rebuild
> the every time a module changes :-(

The other option, clearly, is to move the shared libraries to the
target system along with the interpreter binary (assuming the target
system supports shared libraries).

If the target system does not have a dlopen, and the static libc.a
does not have dlopen, either, there is nothing you can do except
to use a different operating system.

Regards,
Martin



More information about the Python-list mailing list