When building Biopython 1.86 from source on Linux (aarch64), some C extension modules fail to load at runtime due to missing linkage against libm.
The affected extensions use math functions provided by libm, but do not explicitly link against it. As a result, importing the modules fails with undefined symbol errors.
[./lib/python3.12/site-packages/Bio/Cluster/_cluster.cpython-312-aarch64-linux-gnu.so]:
linux-vdso.so.1 (0x0000ffff907d7000)
libc.so.6 => /lib64/libc.so.6 (0x0000ffff90570000)
/lib/ld-linux-aarch64.so.1 (0x0000ffff9078a000)
undefined symbol: exp (./lib/python3.12/site-packages/Bio/Cluster/_cluster.cpython-312-aarch64-linux-gnu.so)
undefined symbol: log (./lib/python3.12/site-packages/Bio/Cluster/_cluster.cpython-312-aarch64-linux-gnu.so)
undefined symbol: sqrt (./lib/python3.12/site-packages/Bio/Cluster/_cluster.cpython-312-aarch64-linux-gnu.so)
[./lib/python3.12/site-packages/Bio/PDB/ccealign.cpython-312-aarch64-linux-gnu.so]:
linux-vdso.so.1 (0x0000ffff9e545000)
libc.so.6 => /lib64/libc.so.6 (0x0000ffff9e2f6000)
/lib/ld-linux-aarch64.so.1 (0x0000ffff9e4f8000)
undefined symbol: log10 (./lib/python3.12/site-packages/Bio/PDB/ccealign.cpython-312-aarch64-linux-gnu.so)
Workaround is to manually patch setup.py to explicitly link against libm:
sed -i '/Extension($/,/extra_compile_args=\["-DCLUSTER_USE_PYTHON_MEMORY"\],$/{ s/extra_compile_args=\["-DCLUSTER_USE_PYTHON_MEMORY"\],$/extra_compile_args=["-DCLUSTER_USE_PYTHON_MEMORY"], libraries=["m"],/ }' "./setup.py"
sed -i '/Extension("Bio\.PDB\.ccealign"/s/),$/, libraries=["m"]),/' "./setup.py"
Environment
- Biopython version: 1.86
- OS: Amazon Linux 2023 (aarch64)
- Python: 3.12.x
- Compiler: Clang 20 (git)
When building Biopython 1.86 from source on Linux (aarch64), some C extension modules fail to load at runtime due to missing linkage against libm.
The affected extensions use math functions provided by libm, but do not explicitly link against it. As a result, importing the modules fails with undefined symbol errors.
[./lib/python3.12/site-packages/Bio/Cluster/_cluster.cpython-312-aarch64-linux-gnu.so]: linux-vdso.so.1 (0x0000ffff907d7000) libc.so.6 => /lib64/libc.so.6 (0x0000ffff90570000) /lib/ld-linux-aarch64.so.1 (0x0000ffff9078a000) undefined symbol: exp (./lib/python3.12/site-packages/Bio/Cluster/_cluster.cpython-312-aarch64-linux-gnu.so) undefined symbol: log (./lib/python3.12/site-packages/Bio/Cluster/_cluster.cpython-312-aarch64-linux-gnu.so) undefined symbol: sqrt (./lib/python3.12/site-packages/Bio/Cluster/_cluster.cpython-312-aarch64-linux-gnu.so) [./lib/python3.12/site-packages/Bio/PDB/ccealign.cpython-312-aarch64-linux-gnu.so]: linux-vdso.so.1 (0x0000ffff9e545000) libc.so.6 => /lib64/libc.so.6 (0x0000ffff9e2f6000) /lib/ld-linux-aarch64.so.1 (0x0000ffff9e4f8000) undefined symbol: log10 (./lib/python3.12/site-packages/Bio/PDB/ccealign.cpython-312-aarch64-linux-gnu.so)Workaround is to manually patch setup.py to explicitly link against libm:
Environment