13

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?

5
  • ./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. Commented Jun 7, 2013 at 15:44
  • 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). Commented Jun 7, 2013 at 15:47
  • 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. Commented Jun 7, 2013 at 16:11
  • Here is the log pastebin.com/ZBUp2cnd. And yes, the post mentions the same problem. But without a solution. Commented Jun 7, 2013 at 17:34
  • Did my solution work or not? Commented Jun 8, 2013 at 8:06

3 Answers 3

13

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.

Sign up to request clarification or add additional context in comments.

2 Comments

The if statement need to be commented out as well. Otherwise parser would be expecting an indented block which is the two add_dir_to_list lines. Just for future reference.
i just met this issue when i was trying to recompile and reinstall python to /usr/local/lib again. In this case you have to use --prefix=/usr/local/lib again, and editing setup.py, as this answer suggests won't help. To fix it, I had to delete existing /usr/local/lib/libpython2.7.a file and /usr/local/lib/python2.7/ directory (maybe latter is not needed)
5

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

Comments

0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.