Chris Quenelle's Weblog
Thoughts on developer tools.

All | Dbx | Development Tools | Life in General | OpenSolaris | plus | Software Philosophy | Sun Studio

fav comics

« Previous day (Jun 19, 2007) | Main | Next day (Jun 21, 2007) »
20070620 Wednesday June 20, 2007

Django (actually MySQL-python) and RPATH

A kind soul in the linker group has finally implemented a way to patch Solaris binaries to change their RPATH setting. This will make it much easier for me to cope with the variety Solaris packages I need to assemble to make my various pet projects work. Ali's blog entry shows what it's all about, with a full explanation of both the problem and the solution.

The last time I got bit by this was less than a week ago. I was trying to get django to run on my Solaris desktop. Django is a Python web application framework (named after Django Reinhardt). Django needs a database, I picked MySQL. The python driver for MySQL uses the native MySQL libraries, which I have available in /usr/sfw, cool. I configure the python MySQL driver with a pointer to /usr/sfw/lib, everything builds, but when I run Django, no joy. I eventually figure out it can't find the mysql shared libraries at run time. My best answer last week was to write a start up script wrapper around my Django experiments.

#!/bin/sh
export LD_LIBRARY_PATH
LD_LIBRARY_PATH=/usr/sfw/lib
python manage.py runserver 0.0.0.0:8000

But with Ali's help, I can try to patch the poorly made _mysql.so file to contain the RPATH that it should have had from the beginning. Of course, Python is fun. I dig up /usr/lib/python2.4/MySQL.blah.blah.egg which is a zip file with _mysql.so inside it. I unzip it, patch _mysql.so using rpath, and rezip it, and replace the previous .egg file in /usr/lib. Yippee!! No more need for a start-up script.

Now you might also ask how Python uses a .so file from inside a zip file? A simple pmap command tells us.

% pmap $(pgrep python) | grep mysql
FE780000     168K r-x--  /usr/sfw/lib/libmysqlclient_r.so.12.0.0
FE7B8000      88K rwx--  /usr/sfw/lib/libmysqlclient_r.so.12.0.0
FE7E0000      40K r-x--  /home/quenelle/.python-eggs/MySQL_python-1.2.2-py2.4-solaris-2.11-sun4u.egg-tmp/_mysql.so
FE7F8000      24K rwx--  /home/quenelle/.python-eggs/MySQL_python-1.2.2-py2.4-solaris-2.11-sun4u.egg-tmp/_mysql.so

Interesting. It seems to dynamically unzip the file into my home directory when a python program needs to use that module. Very clever (in a twisted, inefficient sort of way).

Posted by Chris Quenelle ( Jun 20 2007, 07:05:40 PM PDT ) - Permalink - -

Older blog entries:

mug shot Chris Quenelle is a tools developer at Sun Microsystems. He's worked on performance and debugging tools at Sun for more than 10 years. He reads comic books and science fiction, and has more tivos than he can keep track of.

Calendar

RSS Feeds

Search

Links

Navigation

Referers