[Python-Dev] Handling linker scripts reached when dynamically loading a module

Howard B. Golden howard_b_golden at yahoo.com
Wed Sep 7 21:33:11 CEST 2011


In Haskell I experienced a situation where dynamically loaded modules
were experiencing "invalid ELF header" errors. This was caused by the
module names actually referring to linker scripts rather than ELF
binaries. I patched the GHC runtime system to deal with these scripts.

I noticed that this same patch has been ported to Ruby and Node.js, so I
suggested to the libc developers that they might wish to incorporate the
patch into their library, making it available to all languages. They
rejected this suggestion, so I am making the suggestion to the Python
devs in case it is of interest to you.

Basically, when a linker script is loaded by dlopen, an "invalid ELF
header" error occurs. The patch checks to see if the file is a linker
script. If so, it finds the name of the real ELF binary with a regular
expression and tries to dlopen it. If successful, processing proceeds.
Otherwise, the original "invalid ELF error" message is returned.

If you want to add this code to Python, you can look at my original
patch (http://hackage.haskell.org/trac/ghc/ticket/2615) or the Ruby
version (https://github.com/ffi/ffi/pull/117) or the Node.js version
(https://github.com/rbranson/node-ffi/pull/5) to help port it.

Note that the GHC version in GHC 7.2.1 has been enhanced to also handle
another possible error when the linker script is too short, so you might
also want to add this enhancement also (see
https://github.com/ghc/blob/master/rts/Linker.c line 1191 for the
revised regular expression):

"(([^ \t()])+\\.so([^ \t:()])*):([ \t])*(invalid ELF header|file too

At this point, I don't have the free time to write the Python patch
myself, so I apologize in advance for not providing it to you.


Howard B. Golden
Northridge, California, USA

More information about the Python-Dev mailing list