#2771·pwntools

Latest pwntools on pip can't be installed as it uses an older unicorn which won't compile

Author: sudhackarCreated Aug 31, 2026Updated Aug 31, 2026
Labelsbugbackport-required

on

(test) ➜  ~ cat /etc/os-release
PRETTY_NAME="Ubuntu 26.04 LTS"
NAME="Ubuntu"
VERSION_ID="26.04"
VERSION="26.04 LTS (Resolute Raccoon)"
VERSION_CODENAME=resolute
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=resolute
LOGO=ubuntu-logo
(test) ➜  ~ python3 --version
Python 3.14.4

when I run pip install pwntools

(test) ➜  ~ pip install pwntools
Collecting pwntools
  Using cached pwntools-4.15.0-py2.py3-none-any.whl.metadata (5.3 kB)
Collecting paramiko>=1.15.2 (from pwntools)
  Using cached paramiko-5.0.0-py3-none-any.whl.metadata (3.7 kB)
Collecting mako>=1.0.0 (from pwntools)
  Using cached mako-1.4.1-py3-none-any.whl.metadata (2.9 kB)
Collecting pyelftools>=0.29 (from pwntools)
  Using cached pyelftools-0.33-py3-none-any.whl.metadata (1.0 kB)
Collecting capstone>=3.0.5rc2 (from pwntools)
  Using cached capstone-6.0.0a10-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (3.8 kB)
Collecting ropgadget>=5.3 (from pwntools)
  Using cached ropgadget-7.7-py3-none-any.whl.metadata (1.0 kB)
Collecting pyserial>=2.7 (from pwntools)
  Using cached pyserial-3.5-py2.py3-none-any.whl.metadata (1.6 kB)
Collecting requests>=2.0 (from pwntools)
  Using cached requests-2.34.2-py3-none-any.whl.metadata (4.8 kB)
Requirement already satisfied: pip>=6.0.8 in ./.envs/test/lib/python3.14/site-packages (from pwntools) (25.1.1)
Collecting pygments>=2.0 (from pwntools)
  Using cached pygments-2.21.0-py3-none-any.whl.metadata (2.5 kB)
Collecting pysocks (from pwntools)
  Using cached PySocks-1.7.1-py3-none-any.whl.metadata (13 kB)
Collecting python-dateutil (from pwntools)
  Using cached python_dateutil-2.9.0.post0-py2.py3-none-any.whl.metadata (8.4 kB)
Collecting packaging (from pwntools)
  Using cached packaging-26.3-py3-none-any.whl.metadata (3.5 kB)
Collecting psutil>=3.3.0 (from pwntools)
  Using cached psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl.metadata (22 kB)
Collecting intervaltree>=3.0 (from pwntools)
  Using cached intervaltree-3.2.1-py2.py3-none-any.whl.metadata (12 kB)
Collecting sortedcontainers (from pwntools)
  Using cached sortedcontainers-2.4.0-py2.py3-none-any.whl.metadata (10 kB)
Collecting unicorn!=2.1.3,!=2.1.4,>=2.0.1 (from pwntools)
  Using cached unicorn-2.1.2.tar.gz (2.9 MB)
  Installing build dependencies ... done
^[1  Getting requirements to build wheel ... -^[done
  Preparing metadata (pyproject.toml) ... done
Collecting six>=1.12.0 (from pwntools)
  Using cached six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB)
Collecting rpyc (from pwntools)
  Using cached rpyc-6.0.2-py3-none-any.whl.metadata (3.5 kB)
Collecting colored_traceback (from pwntools)
  Using cached colored_traceback-0.4.2-py3-none-any.whl.metadata (4.6 kB)
Collecting unix-ar (from pwntools)
  Using cached unix_ar-0.2.1-py2.py3-none-any.whl.metadata (1.9 kB)
Collecting zstandard (from pwntools)
  Using cached zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (3.3 kB)
1Collecting MarkupSafe>=2.0 (from mako>=1.0.0->pwntools)
  Using cached markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (2.7 kB)
Collecting bcrypt>=3.2 (from paramiko>=1.15.2->pwntools)
  Using cached bcrypt-5.0.0-cp39-abi3-manylinux_2_34_x86_64.whl.metadata (10 kB)
^@Collecting cryptography>=3.3 (from paramiko>=1.15.2->pwntools)
  Using cached cryptography-50.0.1-cp311-abi3-manylinux_2_34_x86_64.whl.metadata (4.3 kB)
Collecting invoke>=2.0 (from paramiko>=1.15.2->pwntools)
  Using cached invoke-3.0.3-py3-none-any.whl.metadata (3.2 kB)
Collecting pynacl>=1.5 (from paramiko>=1.15.2->pwntools)
  Using cached pynacl-1.6.2-cp38-abi3-manylinux_2_34_x86_64.whl.metadata (10.0 kB)
Collecting cffi>=2.0.0 (from cryptography>=3.3->paramiko>=1.15.2->pwntools)
  Using cached cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (2.5 kB)
Collecting pycparser (from cffi>=2.0.0->cryptography>=3.3->paramiko>=1.15.2->pwntools)
  Using cached pycparser-3.0-py3-none-any.whl.metadata (8.2 kB)
Collecting charset_normalizer<4,>=2 (from requests>=2.0->pwntools)
  Using cached charset_normalizer-3.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (45 kB)
Collecting idna<4,>=2.5 (from requests>=2.0->pwntools)
  Using cached idna-3.19-py3-none-any.whl.metadata (9.2 kB)
Collecting urllib3<3,>=1.26 (from requests>=2.0->pwntools)
  Using cached urllib3-2.7.0-py3-none-any.whl.metadata (6.9 kB)
Collecting certifi>=2023.5.7 (from requests>=2.0->pwntools)
  Using cached certifi-2026.7.22-py3-none-any.whl.metadata (2.5 kB)
Collecting plumbum (from rpyc->pwntools)
  Using cached plumbum-2.0.2-py3-none-any.whl.metadata (8.5 kB)
Using cached pwntools-4.15.0-py2.py3-none-any.whl (12.9 MB)
Using cached capstone-6.0.0a10-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.6 MB)
Using cached intervaltree-3.2.1-py2.py3-none-any.whl (25 kB)
Using cached mako-1.4.1-py3-none-any.whl (80 kB)
Using cached markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (23 kB)
Using cached paramiko-5.0.0-py3-none-any.whl (208 kB)
Using cached bcrypt-5.0.0-cp39-abi3-manylinux_2_34_x86_64.whl (278 kB)
Using cached cryptography-50.0.1-cp311-abi3-manylinux_2_34_x86_64.whl (4.7 MB)
Using cached cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (221 kB)
Using cached invoke-3.0.3-py3-none-any.whl (160 kB)
Using cached psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl (155 kB)
Using cached pyelftools-0.33-py3-none-any.whl (201 kB)
Using cached pygments-2.21.0-py3-none-any.whl (1.3 MB)
Using cached pynacl-1.6.2-cp38-abi3-manylinux_2_34_x86_64.whl (1.4 MB)
Using cached pyserial-3.5-py2.py3-none-any.whl (90 kB)
Using cached requests-2.34.2-py3-none-any.whl (73 kB)
Using cached charset_normalizer-3.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (251 kB)
Using cached idna-3.19-py3-none-any.whl (68 kB)
Using cached urllib3-2.7.0-py3-none-any.whl (131 kB)
Using cached certifi-2026.7.22-py3-none-any.whl (136 kB)
Using cached ropgadget-7.7-py3-none-any.whl (32 kB)
Using cached six-1.17.0-py2.py3-none-any.whl (11 kB)
Using cached colored_traceback-0.4.2-py3-none-any.whl (5.5 kB)
Using cached packaging-26.3-py3-none-any.whl (129 kB)
Using cached pycparser-3.0-py3-none-any.whl (48 kB)
Using cached PySocks-1.7.1-py3-none-any.whl (16 kB)
Using cached python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB)
Using cached rpyc-6.0.2-py3-none-any.whl (74 kB)
Using cached plumbum-2.0.2-py3-none-any.whl (168 kB)
Using cached sortedcontainers-2.4.0-py2.py3-none-any.whl (29 kB)
Using cached unix_ar-0.2.1-py2.py3-none-any.whl (6.5 kB)
Using cached zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (5.6 MB)
Building wheels for collected packages: unicorn
  Building wheel for unicorn (pyproject.toml) ... error
  error: subprocess-exited-with-error

  × Building wheel for unicorn (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [193 lines of output]
      /tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:82: SetuptoolsDeprecationWarning: `project.license` as a TOML table is deprecated
      !!

              ********************************************************************************
              Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`. (Both options available on setuptools>=77.0.0).

              By 2027-Feb-18, you need to update your project and remove deprecated calls
              or your builds will no longer be supported.

              See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.
              ********************************************************************************

      !!
        corresp(dist, value, root_dir)
      /tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:61: SetuptoolsDeprecationWarning: License classifiers are deprecated.
      !!

              ********************************************************************************
              Please consider removing the following classifiers in favor of a SPDX license expression:

              License :: OSI Approved :: BSD License

              See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.
              ********************************************************************************

      !!
        dist._finalize_license_expression()
      /tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/dist.py:765: SetuptoolsDeprecationWarning: License classifiers are deprecated.
      !!

              ********************************************************************************
              Please consider removing the following classifiers in favor of a SPDX license expression:

              License :: OSI Approved :: BSD License

              See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.
              ********************************************************************************

      !!
        self._finalize_license_expression()
      running bdist_wheel
      running build
      running build_py
      Building C extensions
      CMake Deprecation Warning at CMakeLists.txt:4 (cmake_minimum_required):
        Compatibility with CMake < 3.10 will be removed from a future version of
        CMake.

        Update the VERSION argument <min> value.  Or, use the <min>...<max> syntax
        to tell CMake that the project requires at least <min> but has been updated
        to work with policies introduced by <max> or earlier.


      -- The C compiler identification is GNU 15.2.0
      -- Detecting C compiler ABI info
      -- Detecting C compiler ABI info - done
      -- Check for working C compiler: /usr/bin/cc - skipped
      -- Detecting C compile features
      -- Detecting C compile features - done

      ERROR: pkg-config binary 'pkg-config' not found

      -- Configuring done (5.5s)
      -- Generating done (0.2s)
      -- Build files have been written to: /tmp/pip-install-0546ut37/unicorn_a11c5353c0554587840f96cf2f3689ce/src/build_python
      [  0%] Building C object CMakeFiles/unicorn-common.dir/list.c.o
      [  0%] Building C object CMakeFiles/unicorn-common.dir/glib_compat/garray.c.o
      [  0%] Building C object CMakeFiles/unicorn-common.dir/glib_compat/glib_compat.c.o
      [  1%] Building C object CMakeFiles/unicorn-common.dir/glib_compat/gtestutils.c.o
      /tmp/pip-install-0546ut37/unicorn_a11c5353c0554587840f96cf2f3689ce/src/glib_compat/glib_compat.c: In function ‘g_strsplit’:
      /tmp/pip-install-0546ut37/unicorn_a11c5353c0554587840f96cf2f3689ce/src/glib_compat/glib_compat.c:1434:7: warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
       1434 |     s = strstr (remainder, delimiter);
            |       ^
      /tmp/pip-install-0546ut37/unicorn_a11c5353c0554587840f96cf2f3689ce/src/glib_compat/glib_compat.c:1448:15: warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
       1448 |             s = strstr (remainder, delimiter);
            |               ^
      [  1%] Building C object CMakeFiles/unicorn-common.dir/glib_compat/gtree.c.o
      [  1%] Building C object CMakeFiles/unicorn-common.dir/glib_compat/grand.c.o
      [  1%] Building C object CMakeFiles/unicorn-common.dir/glib_compat/glist.c.o
      [  1%] Building C object CMakeFiles/unicorn-common.dir/glib_compat/gmem.c.o
      [  2%] Building C object CMakeFiles/unicorn-common.dir/glib_compat/gpattern.c.o
      [  2%] Building C object CMakeFiles/unicorn-common.dir/glib_compat/gslice.c.o
      [  2%] Building C object CMakeFiles/unicorn-common.dir/qemu/util/bitmap.c.o
      [  2%] Building C object CMakeFiles/unicorn-common.dir/qemu/util/bitops.c.o
      [  2%] Building C object CMakeFiles/unicorn-common.dir/qemu/util/crc32c.c.o
      [  2%] Building C object CMakeFiles/unicorn-common.dir/qemu/util/cutils.c.o
      [  2%] Building C object CMakeFiles/unicorn-common.dir/qemu/util/getauxval.c.o
      [  3%] Building C object CMakeFiles/unicorn-common.dir/qemu/util/guest-random.c.o
      [  3%] Building C object CMakeFiles/unicorn-common.dir/qemu/util/host-utils.c.o
      [  3%] Building C object CMakeFiles/unicorn-common.dir/qemu/util/osdep.c.o
      [  3%] Building C object CMakeFiles/unicorn-common.dir/qemu/util/qdist.c.o
      /tmp/pip-install-0546ut37/unicorn_a11c5353c0554587840f96cf2f3689ce/src/qemu/util/osdep.c: In function ‘qemu_mprotect__osdep’:
      /tmp/pip-install-0546ut37/unicorn_a11c5353c0554587840f96cf2f3689ce/src/qemu/util/osdep.c:66:9: error: implicit declaration of function ‘mprotect’ [-Wimplicit-function-declaration]
         66 |     if (mprotect(addr, size, prot)) {
            |         ^~~~~~~~
      /tmp/pip-install-0546ut37/unicorn_a11c5353c0554587840f96cf2f3689ce/src/qemu/util/osdep.c: In function ‘qemu_mprotect_rwx’:
      /tmp/pip-install-0546ut37/unicorn_a11c5353c0554587840f96cf2f3689ce/src/qemu/util/osdep.c:79:45: error: ‘PROT_READ’ undeclared (first use in this function)
         79 |     return qemu_mprotect__osdep(addr, size, PROT_READ | PROT_WRITE | PROT_EXEC);
            |                                             ^~~~~~~~~
      /tmp/pip-install-0546ut37/unicorn_a11c5353c0554587840f96cf2f3689ce/src/qemu/util/osdep.c:79:45: note: each undeclared identifier is reported only once for each function it appears in
      /tmp/pip-install-0546ut37/unicorn_a11c5353c0554587840f96cf2f3689ce/src/qemu/util/osdep.c:79:57: error: ‘PROT_WRITE’ undeclared (first use in this function)
         79 |     return qemu_mprotect__osdep(addr, size, PROT_READ | PROT_WRITE | PROT_EXEC);
            |                                                         ^~~~~~~~~~
      /tmp/pip-install-0546ut37/unicorn_a11c5353c0554587840f96cf2f3689ce/src/qemu/util/osdep.c:79:70: error: ‘PROT_EXEC’ undeclared (first use in this function)
         79 |     return qemu_mprotect__osdep(addr, size, PROT_READ | PROT_WRITE | PROT_EXEC);
            |                                                                      ^~~~~~~~~
      /tmp/pip-install-0546ut37/unicorn_a11c5353c0554587840f96cf2f3689ce/src/qemu/util/osdep.c: In function ‘qemu_mprotect_none’:
      /tmp/pip-install-0546ut37/unicorn_a11c5353c0554587840f96cf2f3689ce/src/qemu/util/osdep.c:88:45: error: ‘PROT_NONE’ undeclared (first use in this function)
         88 |     return qemu_mprotect__osdep(addr, size, PROT_NONE);
            |                                             ^~~~~~~~~
      gmake[2]: *** [CMakeFiles/unicorn-common.dir/build.make:317: CMakeFiles/unicorn-common.dir/qemu/util/osdep.c.o] Error 1
      gmake[2]: *** Waiting for unfinished jobs....
      gmake[1]: *** [CMakeFiles/Makefile2:740: CMakeFiles/unicorn-common.dir/all] Error 2
      gmake: *** [Makefile:146: all] Error 2
      Traceback (most recent call last):
        File "/home/sudhackar/.envs/test/lib/python3.14/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in <module>
          main()
          ~~~~^^
        File "/home/sudhackar/.envs/test/lib/python3.14/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
                                   ~~~~^^^^^^^^^^^^^^^^^^^^^^^^
        File "/home/sudhackar/.envs/test/lib/python3.14/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 280, in build_wheel
          return _build_backend().build_wheel(
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
              wheel_directory, config_settings, metadata_directory
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          )
          ^
        File "/tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/build_meta.py", line 441, in build_wheel
          return _build(['bdist_wheel', '--dist-info-dir', str(metadata_directory)])
        File "/tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/build_meta.py", line 429, in _build
          return self._build_with_temp_dir(
                 ~~~~~~~~~~~~~~~~~~~~~~~~~^
              cmd,
              ^^^^
          ...<3 lines>...
              self._arbitrary_args(config_settings),
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          )
          ^
        File "/tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/build_meta.py", line 410, in _build_with_temp_dir
          self.run_setup()
          ~~~~~~~~~~~~~~^^
        File "/tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())  # noqa: S102 # exec is intentional here
          ~~~~^^^^^^^^^^^^^^^^
        File "<string>", line 149, in <module>
        File "/tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/__init__.py", line 117, in setup
          return distutils.core.setup(**attrs)  # type: ignore[return-value]
                 ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
        File "/tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/_distutils/core.py", line 168, in setup
          return run_commands(dist)
        File "/tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/_distutils/core.py", line 184, in run_commands
          dist.run_commands()
          ~~~~~~~~~~~~~~~~~^^
        File "/tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/_distutils/dist.py", line 1028, in run_commands
          self.run_command(cmd)
          ~~~~~~~~~~~~~~~~^^^^^
        File "/tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/dist.py", line 1106, in run_command
          super().run_command(command)
          ~~~~~~~~~~~~~~~~~~~^^^^^^^^^
        File "/tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/_distutils/dist.py", line 1047, in run_command
          cmd_obj.run()
          ~~~~~~~~~~~^^
        File "/tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/command/bdist_wheel.py", line 385, in run
          self.run_command("build")
          ~~~~~~~~~~~~~~~~^^^^^^^^^
        File "/tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/_distutils/cmd.py", line 342, in run_command
          self.distribution.run_command(command)
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
        File "/tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/dist.py", line 1106, in run_command
          super().run_command(command)
          ~~~~~~~~~~~~~~~~~~~^^^^^^^^^
        File "/tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/_distutils/dist.py", line 1047, in run_command
          cmd_obj.run()
          ~~~~~~~~~~~^^
        File "/tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/_distutils/command/build.py", line 137, in run
          self.run_command(cmd_name)
          ~~~~~~~~~~~~~~~~^^^^^^^^^^
        File "/tmp/pip-build-env-yxzx3uvo/overlay/lib/python3.14/site-packages/setuptools/_distutils/cmd.py", line 342, in run_command
          self.distribution.run_command(command)
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
        File