[Python-Dev] Handling linker scripts reached when dynamically loading a module (original) (raw)

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


Hi,

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 short)"

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.

HTH,

Howard B. Golden Northridge, California, USA



More information about the Python-Dev mailing list