mypyc-compiled extensions missing math library linking causing undefined symbol errors
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 20.6k
- Fork
- 3.3k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
Bug Report
When building mypy with mypyc enabled (MYPY_USE_MYPYC=1), the compiled C extensions are missing explicit linking to the math library (libm), causing undefined symbol errors for standard math functions.
[./lib/python3.12/site-packages/30fcd23745efe32ce681__mypyc.cpython-312-aarch64-linux-gnu.so]:
linux-vdso.so.1 (0x0000ffffb4c9c000)
libc.so.6 => /lib64/libc.so.6 (0x0000ffffb4632000)
/lib/ld-linux-aarch64.so.1 (0x0000ffffb4c4f000)
undefined symbol: sin (./lib/python3.12/site-packages/30fcd23745efe32ce681__mypyc.cpython-312-aarch64-linux-gnu.so)
undefined symbol: cos (./lib/python3.12/site-packages/30fcd23745efe32ce681__mypyc.cpython-312-aarch64-linux-gnu.so)
undefined symbol: tan (./lib/python3.12/site-packages/30fcd23745efe32ce681__mypyc.cpython-312-aarch64-linux-gnu.so)
undefined symbol: sqrt (./lib/python3.12/site-packages/30fcd23745efe32ce681__mypyc.cpython-312-aarch64-linux-gnu.so)
undefined symbol: exp (./lib/python3.12/site-packages/30fcd23745efe32ce681__mypyc.cpython-312-aarch64-linux-gnu.so)
undefined symbol: fmod (./lib/python3.12/site-packages/30fcd23745efe32ce681__mypyc.cpython-312-aarch64-linux-gnu.so)
undefined symbol: pow (./lib/python3.12/site-packages/30fcd23745efe32ce681__mypyc.cpython-312-aarch64-linux-gnu.so)
undefined symbol: log (./lib/python3.12/site-packages/30fcd23745efe32ce681__mypyc.cpython-312-aarch64-linux-gnu.so)
[./lib/python3.12/site-packages/3204bda914b7f2c6f497__mypyc.cpython-312-aarch64-linux-gnu.so]:
linux-vdso.so.1 (0x0000ffff80b96000)
libc.so.6 => /lib64/libc.so.6 (0x0000ffff7ee32000)
/lib/ld-linux-aarch64.so.1 (0x0000ffff80b49000)
undefined symbol: sin (./lib/python3.12/site-packages/3204bda914b7f2c6f497__mypyc.cpython-312-aarch64-linux-gnu.so)
undefined symbol: cos (./lib/python3.12/site-packages/3204bda914b7f2c6f497__mypyc.cpython-312-aarch64-linux-gnu.so)
undefined symbol: tan (./lib/python3.12/site-packages/3204bda914b7f2c6f497__mypyc.cpython-312-aarch64-linux-gnu.so)
undefined symbol: sqrt (./lib/python3.12/site-packages/3204bda914b7f2c6f497__mypyc.cpython-312-aarch64-linux-gnu.so)
undefined symbol: exp (./lib/python3.12/site-packages/3204bda914b7f2c6f497__mypyc.cpython-312-aarch64-linux-gnu.so)
undefined symbol: fmod (./lib/python3.12/site-packages/3204bda914b7f2c6f497__mypyc.cpython-312-aarch64-linux-gnu.so)
undefined symbol: pow (./lib/python3.12/site-packages/3204bda914b7f2c6f497__mypyc.cpython-312-aarch64-linux-gnu.so)
undefined symbol: log (./lib/python3.12/site-packages/3204bda914b7f2c6f497__mypyc.cpython-312-aarch64-linux-gnu.so)
To Reproduce
PACKAGE_VERSION="v1.19.1"
ARCHIVE_NAME="${PACKAGE_VERSION}.tar.gz"
curl -fLO "https://github.com/python/mypy/archive/refs/tags/${ARCHIVE_NAME}"
tar xf "${ARCHIVE_NAME}"
cd "mypy-${PACKAGE_VERSION#v}"
export MYPY_USE_MYPYC="1"
pip3 install . -v -v -v --compile --no-deps --no-cache-dir --no-build-isolation --no-binary :all:
Expected Behavior
No unexpected undefined symbols
Actual Behavior
Unexpected undefined symbols
Your Environment
- OS: Amz Linux 2023 aarch64
- Python: 3.12.7
- mypy: 1.19.1
Proposed Solution
The math library needs to be added to the extension modules during the build process. A potential patch location is in setup.py after the extensions are created:
# After mypyc_build_ext() creates ext_modules, add math library
for ext in ext_modules:
if "m" not in ext.libraries:
ext.libraries.append("m")
However, this approach may over-link modules that don't need libm. A more precise solution would require:
- Identifying which specific mypyc-generated extensions actually use math functions
- Only adding
-lmto those specific extensions - This may require changes in mypyc itself to track which C math functions are used during compilation
Temporary Workaround is:
# Patch setup.py to add math library to all extensions
sed -i '
/log_trace=log_trace,$/,/^ assert ext_modules$/ {
/^ )$/ a\
\
for ext in ext_modules:\
if "m" not in ext.libraries:\
ext.libraries.append("m")
}
' "./setup.py"
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia in setup.py, nelle vicinanze di mypyc_build_ext() e della creazione di ext_modules, quindi riproduci la compilazione con MYPY_USE_MYPYC=1 usando il comando pip documentato nell’ambiente interessato. Determina quali estensioni generate richiedono libm e assicurati che le estensioni compilate vengano caricate senza simboli matematici non definiti, evitando quando possibile il linking non necessario.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- build-system
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 38/100