Bulk copy fails on RHEL 8 / aarch64 with mssql-python 1.8.0: bundled `mssql_py_core` requires libssl.so.3 and GLIBC ≥ 2.34, but wheel is tagged `manylinux_2_28_aarch64`
Les mainteneurs répondent en général sous 2 jours
@bewithgaurav y travaille déjà.
Depuis le 3/6/2026.
Évaluation
Cette issue n'a pas encore été évaluée.
Description
Summary
On a fresh RHEL 8.10 aarch64 host, mssql-python==1.8.0 installs cleanly from PyPI, but invoking bulk copy raises:
ImportError: Bulk copy requires the mssql_py_core library which is not available. This is an unexpected error.
This matches the report at https://www.reddit.com/r/SQLServer/comments/1trcsy7/comment/op95k4b/.
After investigation, the underlying cause appears to be that the bundled mssql_py_core extension shipped inside the manylinux_2_28_aarch64 wheel has runtime requirements (libssl.so.3, libcrypto.so.3, GLIBC_2.34) that exceed what the manylinux_2_28 tag promises (RHEL 8 / glibc 2.28 / OpenSSL 1.1). I may be wrong about the exact build-time root cause, but the loader-level symptoms are reproducible and shown below.
Environment
- OS: Red Hat Enterprise Linux release 8.10 (Ootpa)
- Arch: aarch64
- Python: 3.11.x (from
python3.11RHEL AppStream module) - Install:
pip install mssql-python==1.8.0in a clean venv - glibc on host: 2.28
- OpenSSL on host: 1.1.1k (no
libssl.so.3present)
Reproduction
sudo dnf install -y python3.11 python3.11-pip libtool-ltdl krb5-libs
python3.11 -m venv ~/mssqltest
source ~/mssqltest/bin/activate
pip install --upgrade pip
pip install mssql-python==1.8.0
python -c "import mssql_py_core"
Observations
1. mssql_py_core is in fact bundled (contrary to what the error message implies)
The mssql-python 1.8.0 wheel installs mssql_py_core as a sibling top-level package. From mssql_python-1.8.0.dist-info/RECORD:
mssql_py_core/__init__.py,sha256=dWpohDsyIDgFPp8wCLZEDeEsk_Kn4vL8Bp83Ptn-jNg,135
mssql_py_core/__pycache__/__init__.cpython-311.pyc,,
mssql_py_core/mssql_py_core.cpython-311-aarch64-linux-gnu.so,sha256=…,8225592
So this is not a missing-package problem — the file is on disk.
2. The real failure is at dynamic-link time
$ python -c "import mssql_py_core"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File ".../site-packages/mssql_py_core/__init__.py", line 1, in <module>
from .mssql_py_core import *
ImportError: libssl.so.3: cannot open shared object file: No such file or directory
$ ldd .../mssql_py_core/mssql_py_core.cpython-311-aarch64-linux-gnu.so 2>&1 | grep -E 'ssl|crypto|not found'
/lib64/libm.so.6: version `GLIBC_2.29' not found (required by …mssql_py_core…)
/lib64/libc.so.6: version `GLIBC_2.32' not found (required by …mssql_py_core…)
/lib64/libc.so.6: version `GLIBC_2.33' not found (required by …mssql_py_core…)
/lib64/libc.so.6: version `GLIBC_2.34' not found (required by …mssql_py_core…)
libssl.so.3 => not found
libcrypto.so.3 => not found
Host versions for comparison:
$ ls /usr/lib64/libssl* /usr/lib64/libcrypto*
/usr/lib64/libcrypto.so.1.1 /usr/lib64/libssl.so.1.1
/usr/lib64/libcrypto.so.1.1.1k /usr/lib64/libssl.so.1.1.1k
/usr/lib64/libssl3.so # this is NSS, not OpenSSL 3 — unrelated despite the name
3. Wheel tag vs. actual requirements
The installed wheel is mssql_python-1.8.0-cp311-cp311-manylinux_2_28_aarch64.whl (from https://pypi.org/pypi/mssql-python/1.8.0/json). The manylinux_2_28 profile corresponds to glibc 2.28 / RHEL 8 / UBI 8 (PEP 600). RHEL 8 also ships OpenSSL 1.1, not OpenSSL 3. The bundled mssql_py_core .so requires symbols newer than that profile allows, so pip happily installs a wheel that cannot load on the platform it claims to support.
That said, I haven't run auditwheel show against the wheel myself, so it's possible the higher requirement comes from a different .so in the bundle and I've misattributed it. The loader error above is what users will hit either way.
4. Error-message UX (minor, separate)
In mssql_python/cursor.py (1.8.0), the bulk-copy path does:
try:
import mssql_py_core
except ImportError as exc:
logger.error("_bulkcopy: Failed to import mssql_py_core module")
raise ImportError(
"Bulk copy requires the mssql_py_core library which is not available. "
"This is an unexpected error. "
) from exc
The from exc does preserve the real libssl.so.3: cannot open shared object file in the chained traceback, but the top-line message ("not available", "unexpected error") leads users to think the package is missing rather than failing to load. Surfacing str(exc) in the re-raised message would have saved both the Reddit user and me a fair amount of guessing.
Expected behavior
One of:
- The aarch64 wheel content is rebuilt against the manylinux_2_28 sysroot (glibc 2.28, OpenSSL 1.1) so it actually loads on the platforms the tag advertises, or
- The wheel is re-tagged (e.g.
manylinux_2_34_aarch64) so pip declines to install it on RHEL 8 / UBI 8 / Amazon Linux 2 and falls back to a source install or an error users can act on.
It would also be worth checking the manylinux_2_28_x86_64 wheel against the same criteria — I only verified aarch64 on this host, so I can't say whether x86_64 has the same mismatch.
Suggestions (lower priority)
- Include
str(exc)in the re-raisedImportErrorincursor.py, so the missing.sodependency surfaces in the top-line message. - Consider adding
auditwheel show/ repair to the release pipeline for the Linux wheels to catch tag/content mismatches before publish.
Sources
- Reddit report: https://www.reddit.com/r/SQLServer/comments/1trcsy7/comment/op95k4b/
- 1.8.0 wheel list & filenames: https://pypi.org/pypi/mssql-python/1.8.0/json
- Bulk-copy code path:
mssql_python/cursor.pyaround theimport mssql_py_coreblock in the 1.8.0 release - manylinux profile / glibc mapping: PEP 600 (https://peps.python.org/pep-0600/)
- All
ldd,ldconfig, anddist-info/RECORDoutput above was produced on the RHEL 8.10 aarch64 host described in the Environment section.
- Langage dominant
- Python
- Étoiles
- 478
- Forks
- 62
- Merge moyen
- 3 j 19 min
- PR mergées (30 j)
- 28
Préparer son environnement
Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de microsoft/mssql-python
-
area: bulk-copy triage needed
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
microsoft/mssql-python#843 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
triage needed
Difficulté 4/5 3-5 jours Accessibilité débutants 35/100
microsoft/mssql-python#846 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
macOS: encrypted connections fail after Homebrew moved the `openssl` alias to `openssl@4`Peut-être pris @bewithgaurav l’a pris il y a 14 jours. Ouvertearea: packaging-platform bug triage needed
Difficulté 4/5 3-5 jours Accessibilité débutants 55/100
microsoft/mssql-python#826 · 2 commentaires · 1 personne assignée ·
Les mainteneurs répondent en général sous 2 jours
-
Announcement: mssql-python is coming to Django through mssql-django 2.0Peut-être à nouveau libre @bewithgaurav l’a pris il y a 41 jours, et aucune pull request n’est ouverte. Ouverteannouncement
microsoft/mssql-python#748 · 1 personne assignée ·
Les mainteneurs répondent en général sous 2 jours
-
Connection pool can briefly exceed max_size when pooling is disabled under loadPeut-être pris @bewithgaurav l’a pris il y a 23 jours. Ouvertearea: connectivity-auth bug triage done under development
Difficulté 4/5 3-5 jours Accessibilité débutants 62/100
microsoft/mssql-python#746 · 1 commentaire · 1 personne assignée ·
Les mainteneurs répondent en général sous 2 jours
Toutes les issues de microsoft/mssql-python
Issues similaires
-
good first issue
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
btclib-org/btclib-node#1955 ·
Les mainteneurs répondent en général sous 1 jour
-
documentation v0.9.2
Difficulté 2/5 Une demi-journée Accessibilité débutants 72/100
khuisman/mcp-gee-sweet#1033 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
ossf/cve-bin-tool#5966 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
Les mainteneurs répondent en général sous 2 jours
-
write_iceberg ignores the table's write.parquet.compression-codec propertyPeut-être pris @YuangGao l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Eventual-Inc/Daft#7606 ·
Les mainteneurs répondent en général sous 1 jour