13
votes

When I try to build my own version of Python using:

./configure --enable-shared --prefix=/app/vendor/python-dev && make && make install

I see some errors during installation:

/usr/bin/ld: /usr/local/lib/libpython2.7.a(abstract.o): relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC /usr/local/lib/libpython2.7.a: could not read symbols: Bad value

The problem starts when the linker tries to use /usr/local/lib/libpython2.7.a and not the newly compiled library.

How can I prevent the linker (configure/make) from using the python libraries installed on the system?

3
./configure --enable-shared --prefix=/app/vendor/python-dev && make && make install works for me (from the Python-2.7.5 tarball on Ubuntu 13.04). If the error occurs during the make part, you'll have to include the full output from make. - Aya
This is the only error. It simply repeats for other modules as well. I'm using 2.7.4 tarball. But I have 2.7.4 on my machine, compiled statically (I guess without -fPIC). - Xyand
Sure, but the reason for the error will have happened much earlier in the build, so it's impossible to diagnose without more info. Take a look at this, and the followups. I'm not sure if it's the same issue, but there's not much more I can do without seeing the output from make. - Aya
Here is the log pastebin.com/ZBUp2cnd. And yes, the post mentions the same problem. But without a solution. - Xyand
Did my solution work or not? - Aya

3 Answers

13
votes

This looks to be a misfeature of the setup.py script always including /usr/local in the search path when make builds the target sharedmods.

You'll have to manually frob the setup.py, so do the...

./configure --enable-shared --prefix=/app/vendor/python-dev

...first, then edit setup.py, find lines 442, 443, and 444 which should look like this...

if not cross_compiling:
    add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
    add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')

...and comment them out so they look like this...

# if not cross_compiling
    # add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
    # add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')

...then the make should work.

5
votes

I solved with this script:

# Python 2.7.6: 
wget http://python.org/ftp/python/2.7.6/Python-2.7.6.tar.xz
tar xf Python-2.7.6.tar.xz
cd Python-2.7.6
./configure --prefix=/usr/local --enable-unicode=ucs4 --enable-shared       LDFLAGS="-Wl,-rpath /usr/local/lib"
make && make altinstall
0
votes

I just moved /usr/local/lib/libpython2.7.a to /tmp