quokka icon indicating copy to clipboard operation
quokka copied to clipboard

Quokka does not support Python 3.12 (because of capstone)

Open DarkaMaul opened this issue 2 years ago • 2 comments

Due to a problem in capstone, quokka installation fails with Python 3.12 and 3.11.

In Python 3.12

➜ python --version
Python 3.12.2
➜ pip install quokka-project
+ quokka-project==0.5.5
➜ python -c 'import quokka'  
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "./python312/lib/python3.12/site-packages/quokka/__init__.py", line 24, in <module>
    import quokka.analysis
  File "./python312/lib/python3.12/site-packages/quokka/analysis/__init__.py", line 19, in <module>
    from quokka.analysis.arch import (
  File "./python312/lib/python3.12/site-packages/quokka/analysis/arch.py", line 19, in <module>
    import capstone
  File "./python312/lib/python3.12/site-packages/capstone/__init__.py", line 379, in <module>
    import distutils.sysconfig
ModuleNotFoundError: No module named 'distutils'

This is resolved in https://github.com/capstone-engine/capstone/commit/d63211e3acb64fceb8b1c4a0d804b4b027f4ef71 but not yet available on PyPi.

With Python 3.11

➜ python -c 'import quokka'   
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "./capstone/python311/lib/python3.11/site-packages/quokka/__init__.py", line 24, in <module>
    import quokka.analysis
  File "./capstone/python311/lib/python3.11/site-packages/quokka/analysis/__init__.py", line 19, in <module>
    from quokka.analysis.arch import (
  File "./capstone/python311/lib/python3.11/site-packages/quokka/analysis/arch.py", line 19, in <module>
    import capstone
  File "./python311/lib/python3.11/site-packages/capstone/__init__.py", line 380, in <module>
    import pkg_resources
ModuleNotFoundError: No module named 'pkg_resources'

This is solved by installing setuptools.

pip install setuptools  

However, this will also fail with the following error on Mac Mx:

➜ python -c 'import quokka'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "./python311/lib/python3.11/site-packages/quokka/__init__.py", line 24, in <module>
    import quokka.analysis
  File "./python311/lib/python3.11/site-packages/quokka/analysis/__init__.py", line 19, in <module>
    from quokka.analysis.arch import (
  File "./python311/lib/python3.11/site-packages/quokka/analysis/arch.py", line 19, in <module>
    import capstone
  File "./capstone/python311/lib/python3.11/site-packages/capstone/__init__.py", line 425, in <module>
    _cs = _load_lib(_path)
          ^^^^^^^^^^^^^^^^
  File "./capstone/python311/lib/python3.11/site-packages/capstone/__init__.py", line 398, in _load_lib
    return ctypes.cdll.LoadLibrary(lib_file)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/[email protected]/3.11.9/Frameworks/Python.framework/Versions/3.11/lib/python3.11/ctypes/__init__.py", line 454, in LoadLibrary
    return self._dlltype(name)
           ^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/[email protected]/3.11.9/Frameworks/Python.framework/Versions/3.11/lib/python3.11/ctypes/__init__.py", line 376, in __init__
    self._handle = _dlopen(self._name, mode)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: dlopen(./python311/lib/python3.11/site-packages/capstone/lib/libcapstone.dylib, 0x0006): tried: './python311/lib/python3.11/site-packages/capstone/lib/libcapstone.dylib' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64')),  './python311/lib/python3.11/site-packages/capstone/lib/libcapstone.dylib' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64'))

This can be solved by compiling the capstone bindings ourselves:

gh repo clone capstone-engine/capstone
cd capstone
./make.sh
cp ./libcapstone.5.dylib .venv/lib/python3.11/site-packages/capstone/lib/libcapstone.dylib

Finally, this work

➜ python -c 'import quokka' && echo "GOOD"
GOOD

Of note, this last issue is fixed in : https://github.com/capstone-engine/capstone/issues/2066

DarkaMaul avatar Apr 04 '24 14:04 DarkaMaul

For python 3.12 as you said we need to wait for the capstone pip package to come out. ~~Un~~fortunately python 3.12 broke so many things that it is still not widespread.

For python 3.11 though I cannot reproduce the error you mentioned with No module named 'pkg_resources' I tried on linux with capstone 5.0.1 and 4.0.2 Which version did you try and on which OS?

patacca avatar Apr 29 '24 09:04 patacca

Issue capstone-engine/capstone#2066 was closed last week.

As of yesterday, I was able to build with Py 3.12.6 and capstone 5.0.3. Since the issue hasn't gotten a response from the OP, can this be closed?

$ git log -n 1 main
commit baff1bcfcc72e549ed83c100fb7155c4887e83c4 (HEAD -> main, tag: v0.5.7, origin/main, origin/HEAD)
Author:     Robin David <[email protected]>
AuthorDate: Tue May 28 23:07:59 2024 +0200
Commit:     Robin David <[email protected]>
CommitDate: Tue May 28 23:07:59 2024 +0200

    bump to version 0.5.7

$ pip freeze | grep capstone
capstone==5.0.3

$ python -V
Python 3.12.6

$ python -m build .
* Creating virtualenv isolated environment...
* Installing packages in isolated environment... (protobuf_distutils, setuptools)
* Getting build dependencies for sdist...
running egg_info
writing bindings/python/quokka_project.egg-info/PKG-INFO
writing dependency_links to bindings/python/quokka_project.egg-info/dependency_links.txt
writing entry points to bindings/python/quokka_project.egg-info/entry_points.txt
writing requirements to bindings/python/quokka_project.egg-info/requires.txt
writing top-level names to bindings/python/quokka_project.egg-info/top_level.txt
reading manifest file 'bindings/python/quokka_project.egg-info/SOURCES.txt'
adding license file 'LICENSE'
writing manifest file 'bindings/python/quokka_project.egg-info/SOURCES.txt'
* Building sdist...
running sdist
running egg_info
writing bindings/python/quokka_project.egg-info/PKG-INFO
writing dependency_links to bindings/python/quokka_project.egg-info/dependency_links.txt
writing entry points to bindings/python/quokka_project.egg-info/entry_points.txt
writing requirements to bindings/python/quokka_project.egg-info/requires.txt
writing top-level names to bindings/python/quokka_project.egg-info/top_level.txt
reading manifest file 'bindings/python/quokka_project.egg-info/SOURCES.txt'
adding license file 'LICENSE'
writing manifest file 'bindings/python/quokka_project.egg-info/SOURCES.txt'
running check
creating quokka_project-0.5.7
creating quokka_project-0.5.7/bindings/python/quokka
creating quokka_project-0.5.7/bindings/python/quokka/analysis
creating quokka_project-0.5.7/bindings/python/quokka/backends
creating quokka_project-0.5.7/bindings/python/quokka_project.egg-info
copying files to quokka_project-0.5.7...
copying LICENSE -> quokka_project-0.5.7
copying README.md -> quokka_project-0.5.7
copying pyproject.toml -> quokka_project-0.5.7
copying setup.py -> quokka_project-0.5.7
copying bindings/python/quokka/__init__.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/__main__.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/addresser.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/block.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/data.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/exc.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/executable.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/function.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/instruction.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/program.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/py.typed -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/quokka_pb2.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/reference.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/segment.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/structure.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/types.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/utils.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/version.py -> quokka_project-0.5.7/bindings/python/quokka
copying bindings/python/quokka/analysis/__init__.py -> quokka_project-0.5.7/bindings/python/quokka/analysis
copying bindings/python/quokka/analysis/arch.py -> quokka_project-0.5.7/bindings/python/quokka/analysis
copying bindings/python/quokka/analysis/calling_convention.py -> quokka_project-0.5.7/bindings/python/quokka/analysis
copying bindings/python/quokka/analysis/env.py -> quokka_project-0.5.7/bindings/python/quokka/analysis
copying bindings/python/quokka/analysis/replacer.py -> quokka_project-0.5.7/bindings/python/quokka/analysis
copying bindings/python/quokka/analysis/utils.py -> quokka_project-0.5.7/bindings/python/quokka/analysis
copying bindings/python/quokka/backends/__init__.py -> quokka_project-0.5.7/bindings/python/quokka/backends
copying bindings/python/quokka/backends/capstone.py -> quokka_project-0.5.7/bindings/python/quokka/backends
copying bindings/python/quokka/backends/pypcode.py -> quokka_project-0.5.7/bindings/python/quokka/backends
copying bindings/python/quokka_project.egg-info/PKG-INFO -> quokka_project-0.5.7/bindings/python/quokka_project.egg-info
copying bindings/python/quokka_project.egg-info/SOURCES.txt -> quokka_project-0.5.7/bindings/python/quokka_project.egg-info
copying bindings/python/quokka_project.egg-info/dependency_links.txt -> quokka_project-0.5.7/bindings/python/quokka_project.egg-info
copying bindings/python/quokka_project.egg-info/entry_points.txt -> quokka_project-0.5.7/bindings/python/quokka_project.egg-info
copying bindings/python/quokka_project.egg-info/requires.txt -> quokka_project-0.5.7/bindings/python/quokka_project.egg-info
copying bindings/python/quokka_project.egg-info/top_level.txt -> quokka_project-0.5.7/bindings/python/quokka_project.egg-info
copying bindings/python/quokka_project.egg-info/SOURCES.txt -> quokka_project-0.5.7/bindings/python/quokka_project.egg-info
Writing quokka_project-0.5.7/setup.cfg
Creating tar archive
removing 'quokka_project-0.5.7' (and everything under it)
WARNING Python 3.14 will, by default, filter extracted tar archives and reject files or modify their metadata. Use the filter argument to control this behavior.
* Building wheel from sdist
* Creating virtualenv isolated environment...
* Installing packages in isolated environment... (protobuf_distutils, setuptools)
* Getting build dependencies for wheel...
running egg_info
writing bindings/python/quokka_project.egg-info/PKG-INFO
writing dependency_links to bindings/python/quokka_project.egg-info/dependency_links.txt
writing entry points to bindings/python/quokka_project.egg-info/entry_points.txt
writing requirements to bindings/python/quokka_project.egg-info/requires.txt
writing top-level names to bindings/python/quokka_project.egg-info/top_level.txt
reading manifest file 'bindings/python/quokka_project.egg-info/SOURCES.txt'
adding license file 'LICENSE'
writing manifest file 'bindings/python/quokka_project.egg-info/SOURCES.txt'
* Building wheel...
running bdist_wheel
running build
running build_py
creating build/lib/quokka
copying bindings/python/quokka/structure.py -> build/lib/quokka
copying bindings/python/quokka/segment.py -> build/lib/quokka
copying bindings/python/quokka/executable.py -> build/lib/quokka
copying bindings/python/quokka/types.py -> build/lib/quokka
copying bindings/python/quokka/addresser.py -> build/lib/quokka
copying bindings/python/quokka/function.py -> build/lib/quokka
copying bindings/python/quokka/exc.py -> build/lib/quokka
copying bindings/python/quokka/instruction.py -> build/lib/quokka
copying bindings/python/quokka/__init__.py -> build/lib/quokka
copying bindings/python/quokka/utils.py -> build/lib/quokka
copying bindings/python/quokka/data.py -> build/lib/quokka
copying bindings/python/quokka/reference.py -> build/lib/quokka
copying bindings/python/quokka/quokka_pb2.py -> build/lib/quokka
copying bindings/python/quokka/program.py -> build/lib/quokka
copying bindings/python/quokka/block.py -> build/lib/quokka
copying bindings/python/quokka/__main__.py -> build/lib/quokka
copying bindings/python/quokka/version.py -> build/lib/quokka
creating build/lib/quokka/analysis
copying bindings/python/quokka/analysis/__init__.py -> build/lib/quokka/analysis
copying bindings/python/quokka/analysis/env.py -> build/lib/quokka/analysis
copying bindings/python/quokka/analysis/arch.py -> build/lib/quokka/analysis
copying bindings/python/quokka/analysis/replacer.py -> build/lib/quokka/analysis
copying bindings/python/quokka/analysis/utils.py -> build/lib/quokka/analysis
copying bindings/python/quokka/analysis/calling_convention.py -> build/lib/quokka/analysis
creating build/lib/quokka/backends
copying bindings/python/quokka/backends/__init__.py -> build/lib/quokka/backends
copying bindings/python/quokka/backends/pypcode.py -> build/lib/quokka/backends
copying bindings/python/quokka/backends/capstone.py -> build/lib/quokka/backends
running egg_info
writing bindings/python/quokka_project.egg-info/PKG-INFO
writing dependency_links to bindings/python/quokka_project.egg-info/dependency_links.txt
writing entry points to bindings/python/quokka_project.egg-info/entry_points.txt
writing requirements to bindings/python/quokka_project.egg-info/requires.txt
writing top-level names to bindings/python/quokka_project.egg-info/top_level.txt
reading manifest file 'bindings/python/quokka_project.egg-info/SOURCES.txt'
adding license file 'LICENSE'
writing manifest file 'bindings/python/quokka_project.egg-info/SOURCES.txt'
copying bindings/python/quokka/py.typed -> build/lib/quokka
installing to build/bdist.linux-x86_64/wheel
running install
running install_lib
creating build/bdist.linux-x86_64/wheel
creating build/bdist.linux-x86_64/wheel/quokka
copying build/lib/quokka/structure.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/segment.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/executable.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/types.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/addresser.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/function.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/exc.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/instruction.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/__init__.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/utils.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/data.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/reference.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/quokka_pb2.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/program.py -> build/bdist.linux-x86_64/wheel/./quokka
creating build/bdist.linux-x86_64/wheel/quokka/analysis
copying build/lib/quokka/analysis/__init__.py -> build/bdist.linux-x86_64/wheel/./quokka/analysis
copying build/lib/quokka/analysis/env.py -> build/bdist.linux-x86_64/wheel/./quokka/analysis
copying build/lib/quokka/analysis/arch.py -> build/bdist.linux-x86_64/wheel/./quokka/analysis
copying build/lib/quokka/analysis/replacer.py -> build/bdist.linux-x86_64/wheel/./quokka/analysis
copying build/lib/quokka/analysis/utils.py -> build/bdist.linux-x86_64/wheel/./quokka/analysis
copying build/lib/quokka/analysis/calling_convention.py -> build/bdist.linux-x86_64/wheel/./quokka/analysis
creating build/bdist.linux-x86_64/wheel/quokka/backends
copying build/lib/quokka/backends/__init__.py -> build/bdist.linux-x86_64/wheel/./quokka/backends
copying build/lib/quokka/backends/pypcode.py -> build/bdist.linux-x86_64/wheel/./quokka/backends
copying build/lib/quokka/backends/capstone.py -> build/bdist.linux-x86_64/wheel/./quokka/backends
copying build/lib/quokka/py.typed -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/block.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/__main__.py -> build/bdist.linux-x86_64/wheel/./quokka
copying build/lib/quokka/version.py -> build/bdist.linux-x86_64/wheel/./quokka
running install_egg_info
Copying bindings/python/quokka_project.egg-info to build/bdist.linux-x86_64/wheel/./quokka_project-0.5.7-py3.12.egg-info
running install_scripts
creating build/bdist.linux-x86_64/wheel/quokka_project-0.5.7.dist-info/WHEEL
creating 'build/quarkslab.quokka/dist/.tmp-ylcm8pqo/quokka_project-0.5.7-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it
adding 'quokka/__init__.py'
adding 'quokka/__main__.py'
adding 'quokka/addresser.py'
adding 'quokka/block.py'
adding 'quokka/data.py'
adding 'quokka/exc.py'
adding 'quokka/executable.py'
adding 'quokka/function.py'
adding 'quokka/instruction.py'
adding 'quokka/program.py'
adding 'quokka/py.typed'
adding 'quokka/quokka_pb2.py'
adding 'quokka/reference.py'
adding 'quokka/segment.py'
adding 'quokka/structure.py'
adding 'quokka/types.py'
adding 'quokka/utils.py'
adding 'quokka/version.py'
adding 'quokka/analysis/__init__.py'
adding 'quokka/analysis/arch.py'
adding 'quokka/analysis/calling_convention.py'
adding 'quokka/analysis/env.py'
adding 'quokka/analysis/replacer.py'
adding 'quokka/analysis/utils.py'
adding 'quokka/backends/__init__.py'
adding 'quokka/backends/capstone.py'
adding 'quokka/backends/pypcode.py'
adding 'quokka_project-0.5.7.dist-info/LICENSE'
adding 'quokka_project-0.5.7.dist-info/METADATA'
adding 'quokka_project-0.5.7.dist-info/WHEEL'
adding 'quokka_project-0.5.7.dist-info/entry_points.txt'
adding 'quokka_project-0.5.7.dist-info/top_level.txt'
adding 'quokka_project-0.5.7.dist-info/RECORD'
removing build/bdist.linux-x86_64/wheel
Successfully built quokka_project-0.5.7.tar.gz and quokka_project-0.5.7-py3-none-any.whl

arizvisa avatar Sep 17 '24 20:09 arizvisa