python / python/mypy

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

オープン
#20,567 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

bug
主要言語
Python
スター
20.6k
フォーク
3.3k
PR マージ指標
PR 指標を取得中

説明

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"

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

setup.py の mypyc_build_ext() 周辺と ext_modules の作成処理から始め、影響を受ける環境で、ドキュメントに記載された pip コマンドを使って MYPY_USE_MYPYC=1 でビルドを再現します。生成された拡張のうちどれが libm を必要とするかを特定し、不要なリンクを可能な限り避けながら、ビルドされた拡張が未定義の数学シンボルなしでロードされることを確認します。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
build-system
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
38/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。