Hi,
I have created a conda python environment which I have packaged into a .tar.gz (using conda-pack) and which runs correctly when extracted (in this example, it only contains the scipy package). However, when I sign the necessary files within the environment (i.e. the binaries, the dylibs, the .so files), attempting to load scipy.sparse now fails with the error "mapped file has no cdhash, completely unsigned" about one of the .so files. Furthermore, I believe that this file does in fact have a cdhash.
The signing process represented by my example below has been working for about a year, and I am unsure why it has suddenly stopped working. I am on a 2020 MacBook Pro with an i7 processor and running Sequoia 15.1.1.
Here is a minimal example showing the creating of the conda environment, codesigning, and the error message. Many thanks in advance!
| # Create and activate conda env |
| > conda create -y -n mwe_env python=3.10 |
| > conda activate mwe_env |
| |
| # Verify scipy not initially installed |
| (mwe_env) > python |
| Python 3.10.16 (main, Dec 11 2024, 10:24:41) [Clang 14.0.6 ] on darwin |
| Type "help", "copyright", "credits" or "license" for more information. |
| >>> import scipy |
| Traceback (most recent call last): |
| File "<stdin>", line 1, in <module> |
| ModuleNotFoundError: No module named 'scipy' |
| (mwe_env) > pip install scipy |
| Collecting scipy |
| Downloading scipy-1.15.2-cp310-cp310-macosx_14_0_x86_64.whl.metadata (61 kB) |
| Collecting numpy<2.5,>=1.23.5 (from scipy) |
| Downloading numpy-2.2.4-cp310-cp310-macosx_14_0_x86_64.whl.metadata (62 kB) |
| Downloading scipy-1.15.2-cp310-cp310-macosx_14_0_x86_64.whl (25.1 MB) |
| ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 25.1/25.1 MB 17.3 MB/s eta 0:00:00 |
| Downloading numpy-2.2.4-cp310-cp310-macosx_14_0_x86_64.whl (7.0 MB) |
| ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.0/7.0 MB 16.4 MB/s eta 0:00:00 |
| Installing collected packages: numpy, scipy |
| Successfully installed numpy-2.2.4 scipy-1.15.2 |
| |
| (mwe_env) > python |
| Python 3.10.16 (main, Dec 11 2024, 10:24:41) [Clang 14.0.6 ] on darwin |
| Type "help", "copyright", "credits" or "license" for more information. |
| >>> import scipy.sparse |
| >>> |
| # Package conda env |
| (mwe_env) > conda-pack --output mwe_env.tar.gz --name mwe_env |
| Collecting packages... |
| Packing environment at '/path/to/my/conda/envs/mwe_env' to 'mwe_env.tar.gz' |
| [# |
| |
| (mwe_env) > conda deactivate |
| |
| > mkdir mwe_dir && cd mwe_dir |
| > tar -xzvf ../mwe_env.tar.gz |
| > source bin/activate |
| |
| (mwe_dir) > python |
| Python 3.10.16 (main, Dec 11 2024, 10:24:41) [Clang 14.0.6 ] on darwin |
| Type "help", "copyright", "credits" or "license" for more information. |
| >>> import scipy.sparse |
| >>> |
| |
| (mwe_dir) > find bin -type f | xargs -n1 xcrun codesign -f -o runtime --timestamp --sign "Developer ID Application: MY_TEAM_ID" |
| (mwe_dir) > find . -name "*.dylib" -o -name "*.so" -type f | xargs -n1 xcrun codesign -f -o runtime --timestamp --sign "Developer ID Application: MY_TEAM_ID" |
| |
| |
| (mwe_dir) > python |
| Python 3.10.16 (main, Dec 11 2024, 10:24:41) [Clang 14.0.6 ] on darwin |
| Type "help", "copyright", "credits" or "license" for more information. |
| >>> import scipy.sparse |
| Traceback (most recent call last): |
| File "<stdin>", line 1, in <module> |
| File "/path/to/mwe_dir/conda_env/lib/python3.10/site-packages/scipy/sparse/__init__.py", line 315, in <module> |
| from . import csgraph |
| File "/path/to/mwe_dir/conda_env/lib/python3.10/site-packages/scipy/sparse/csgraph/__init__.py", line 187, in <module> |
| from ._laplacian import laplacian |
| File "/path/to/mwe_dir/conda_env/lib/python3.10/site-packages/scipy/sparse/csgraph/_laplacian.py", line 7, in <module> |
| from scipy.sparse.linalg import LinearOperator |
| File "/path/to/mwe_dir/conda_env/lib/python3.10/site-packages/scipy/sparse/linalg/__init__.py", line 134, in <module> |
| from ._eigen import * |
| File "/path/to/mwe_dir/conda_env/lib/python3.10/site-packages/scipy/sparse/linalg/_eigen/__init__.py", line 9, in <module> |
| from .arpack import * |
| File "/path/to/mwe_dir/conda_env/lib/python3.10/site-packages/scipy/sparse/linalg/_eigen/arpack/__init__.py", line 20, in <module> |
| from .arpack import * |
| File "/path/to/mwe_dir/conda_env/lib/python3.10/site-packages/scipy/sparse/linalg/_eigen/arpack/arpack.py", line 50, in <module> |
| from . import _arpack |
| ImportError: dlopen(/path/to/mwe_dir/conda_env/lib/python3.10/site-packages/scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-310-darwin.so, 0x0002): tried: '/path/to/mwe_dir/conda_env/lib/python3.10/site-packages/scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-310-darwin.so' (code signature in <5DD8FC01-7360-3DB9-8273-C8A45ABB19A9> '/path/to/mwe_dir/conda_env/lib/python3.10/site-packages/scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-310-darwin.so' not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.), '/System/Volumes/Preboot/Cryptexes/OS/path/to/mwe_dir/conda_env/lib/python3.10/site-packages/scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-310-darwin.so' (no such file), '/path/to/mwe_dir/conda_env/lib/python3.10/site-packages/scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-310-darwin.so' (code signature in <5DD8FC01-7360-3DB9-8273-C8A45ABB19A9> '/path/to/mwe_dir/conda_env/lib/python3.10/site-packages/scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-310-darwin.so' not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.) |
| |
| (mwe_dir) > xcrun codesign -dvvv /path/to/mwe_dir/lib/python3.10/site-packages/scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-310-darwin.so |
| Executable=/path/to/mwe_dir/lib/python3.10/site-packages/scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-310-darwin.so |
| Identifier=_arpack.cpython-310-darwin |
| Format=Mach-O thin (x86_64) |
| CodeDirectory v=20400 size=4318 flags=0x10000(runtime) hashes=129+2 location=embedded |
| Library validation warning=OS X SDK version before 10.9 does not support Library Validation |
| Hash type=sha256 size=32 |
| CandidateCDHash sha256=816731ecd1ad01b38555cbfef8c000628696d0ca |
| CandidateCDHashFull sha256=816731ecd1ad01b38555cbfef8c000628696d0ca53376aebf6fae28d8c02f519 |
| Hash choices=sha256 |
| CMSDigest=816731ecd1ad01b38555cbfef8c000628696d0ca53376aebf6fae28d8c02f519 |
| CMSDigestType=2 |
| CDHash=816731ecd1ad01b38555cbfef8c000628696d0ca |
| Signature size=9000 |
| Authority=Developer ID Application: MY_TEAM_ID |
| Authority=Developer ID Certification Authority |
| Authority=Apple Root CA |
| Timestamp=2 Apr 2025 at 16:24:52 |
| Info.plist=not bound |
| TeamIdentifier=MY_TEAM_ID |
| Sealed Resources=none |
| Internal requirements count=1 size=188 |
Buried deep in the logs you posted there’s this snippet:
Library validation warning=OS X SDK version before 10.9 does not support Library Validation
Modern Mac software must be built with the macOS 10.9 SDK or later, because that’s required to pass notarisation. Without that, the system won’t load your code signature, and hence this complaining about a cdhash not being present even though it clearly is.
For more on this issue, Notarisation and the macOS 10.9 SDK. Oh, and I just updated it to make it easier to find based on the errors you saw.
Share and Enjoy
—
Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"