This guide shows a possible solution for Python error Relocation R_X86_64_PC32 against symbol can not be used when making a shared object
.
When running some Python libs such as matplotlib
or pymc
, you might face and error similar to below:
libpython3.9.a(bytearrayobject.o): relocation R_X86_64_PC32 against symbol `_Py_NoneStruct' can not be used when making a shared object; recompile with -fPIC --- E /usr/bin/ld: /home/bgasparotto/.pyenv/versions/3.9.7/lib/libpython3.9.a(longobject.o): relocation R_X86_64_PC32 against symbol `PyExc_OverflowError' can not be used when making a shared object; recompile with -fPIC E /usr/bin/ld: final link failed: bad value E collect2: error: ld returned 1 exit status
In a nutshell, this error tells us that a Python shared lib expected to be available in your Python was not found during execution.
Solution One: pyenv and shared libs
This goes if you are using pyenv to manage your Python versions. By default, pyenv does not install Python interpreters with their shared libs. However, this can be fixed by reinstalling Python whilst enabling the shared libs:
PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install --force 3.9.5
Solution Two: libpython conflict
A Python lib might be present in more than one place thus resulting in a conflict. On Unix based systems, you can run the command below to find its occurrences:
sudo find / -name "libpython3.9.a" /usr/lib/libpython3.9.a /usr/lib/python3.9/config-3.9-x86_64-linux-gnu/libpython3.9.a
Then, rename one of the occurrences to something else so it is not picked up anymore. I chose to rename the first occurrence to libpython3.9.a.backup
:
sudo mv /usr/lib/libpython3.9.a /usr/lib/libpython3.9.a.backup
References
- python.org – Building C and C++ Extensions