python / python/mypy

mypyc-compiled extensions missing math library linking causing undefined symbol errors

Ouverte
#20,567 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug
Langage dominant
Python
Étoiles
20.6k
Forks
3.3k
Métriques de merge des PR
Métriques de PR en attente

Description

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:

  1. Identifying which specific mypyc-generated extensions actually use math functions
  2. Only adding -lm to those specific extensions
  3. 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"

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez dans setup.py, autour de mypyc_build_ext() et de la création de ext_modules, puis reproduisez la compilation avec MYPY_USE_MYPYC=1 en utilisant la commande pip documentée dans l’environnement concerné. Déterminez quelles extensions générées nécessitent libm et assurez-vous que les extensions compilées se chargent sans symboles mathématiques indéfinis, en évitant autant que possible l’édition de liens inutile.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
build-system
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
38/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.