Skip to content
GitLab
  • Menu
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • pypy pypy
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 673
    • Issues 673
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 13
    • Merge requests 13
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages & Registries
    • Packages & Registries
    • Container Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • PyPy
  • pypypypy
  • Issues
  • #3173
Closed
Open
Created Feb 21, 2020 by Anthony Sottile@asottileDeveloper

Py_LIMITED_API + PyBytes_Check => undefined symbol: PyType_GetFlags

Not a huge deal, I can simply disable Py_LIMITED_API in the package I'm working on, but figured I should bring this up since it's different than CPython

mod.c

#include <Python.h>

static PyObject* _hello_world(PyObject* self) {
    /* this code is nonsense, but it should still compile */
    if (PyBytes_Check(self)) {
        Py_RETURN_TRUE;
    } else {
        Py_RETURN_FALSE;
    }
}

static struct PyMethodDef methods[] = {
    {"hello_world", (PyCFunction)_hello_world, METH_NOARGS},
    {NULL, NULL}
};

static struct PyModuleDef module = {
    PyModuleDef_HEAD_INIT,
    "mod",
    NULL,
    -1,
    methods
};

PyMODINIT_FUNC PyInit_mod(void) {
    return PyModule_Create(&module);
}

setup.py

from setuptools import setup, Extension

setup(
    ext_modules=[
        Extension(
            'mod', ['mod.c'],
            define_macros=[('Py_LIMITED_API', None)],
        ),
    ],
)

output

$ pip install . -vv
Non-user install because user site-packages disabled
Created temporary directory: /tmp/pip-ephem-wheel-cache-el29qzci
Created temporary directory: /tmp/pip-req-tracker-r6whtqbw
Initialized build tracking at /tmp/pip-req-tracker-r6whtqbw
Created build tracker: /tmp/pip-req-tracker-r6whtqbw
Entered build tracker: /tmp/pip-req-tracker-r6whtqbw
Created temporary directory: /tmp/pip-install-l8kncs1y
Processing /tmp/x
  Created temporary directory: /tmp/pip-req-build-s8t68o2s
  Added file:///tmp/x to build tracker '/tmp/pip-req-tracker-r6whtqbw'
    Running setup.py (path:/tmp/pip-req-build-s8t68o2s/setup.py) egg_info for package from file:///tmp/x
    Running command python setup.py egg_info
    running egg_info
    creating /tmp/pip-req-build-s8t68o2s/pip-egg-info/UNKNOWN.egg-info
    writing /tmp/pip-req-build-s8t68o2s/pip-egg-info/UNKNOWN.egg-info/PKG-INFO
    writing dependency_links to /tmp/pip-req-build-s8t68o2s/pip-egg-info/UNKNOWN.egg-info/dependency_links.txt
    writing top-level names to /tmp/pip-req-build-s8t68o2s/pip-egg-info/UNKNOWN.egg-info/top_level.txt
    writing manifest file '/tmp/pip-req-build-s8t68o2s/pip-egg-info/UNKNOWN.egg-info/SOURCES.txt'
    reading manifest file '/tmp/pip-req-build-s8t68o2s/pip-egg-info/UNKNOWN.egg-info/SOURCES.txt'
    writing manifest file '/tmp/pip-req-build-s8t68o2s/pip-egg-info/UNKNOWN.egg-info/SOURCES.txt'
  Source in /tmp/pip-req-build-s8t68o2s has version 0.0.0, which satisfies requirement UNKNOWN==0.0.0 from file:///tmp/x
  Removed UNKNOWN==0.0.0 from file:///tmp/x from build tracker '/tmp/pip-req-tracker-r6whtqbw'
Building wheels for collected packages: UNKNOWN
  Created temporary directory: /tmp/pip-wheel-ebh16bjb
  Building wheel for UNKNOWN (setup.py) ...   Destination directory: /tmp/pip-wheel-ebh16bjb
  Running command /tmp/x/venv/bin/pypy3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-req-build-s8t68o2s/setup.py'"'"'; __file__='"'"'/tmp/pip-req-build-s8t68o2s/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-ebh16bjb
  running bdist_wheel
  running build
  running build_ext
  building 'mod' extension
  creating build
  creating build/temp.linux-x86_64-3.6
  gcc -pthread -DNDEBUG -O2 -fPIC -DPy_LIMITED_API -I/tmp/x/venv/include -I/home/asottile/opt/pypy3.6-v7.3.0-linux64/include -c mod.c -o build/temp.linux-x86_64-3.6/mod.o
  In file included from /home/asottile/opt/pypy3.6-v7.3.0-linux64/include/Python.h:79:0,
                   from mod.c:1:
  mod.c: In function ‘_hello_world’:
  /home/asottile/opt/pypy3.6-v7.3.0-linux64/include/object.h:241:35: warning: implicit declaration of function ‘PyType_GetFlags’; did you mean ‘PyTuple_GetSlice’? [-Wimplicit-function-declaration]
   #define PyType_HasFeature(t,f)  ((PyType_GetFlags(t) & (f)) != 0)
                                     ^
  /home/asottile/opt/pypy3.6-v7.3.0-linux64/include/object.h:245:35: note: in expansion of macro ‘PyType_HasFeature’
   #define PyType_FastSubclass(t,f)  PyType_HasFeature(t,f)
                                     ^~~~~~~~~~~~~~~~~
  /home/asottile/opt/pypy3.6-v7.3.0-linux64/include/bytesobject.h:59:18: note: in expansion of macro ‘PyType_FastSubclass’
                    PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_BYTES_SUBCLASS)
                    ^~~~~~~~~~~~~~~~~~~
  mod.c:4:9: note: in expansion of macro ‘PyBytes_Check’
       if (PyBytes_Check(self)) {
           ^~~~~~~~~~~~~
  creating build/lib.linux-x86_64-3.6
  gcc -pthread -shared build/temp.linux-x86_64-3.6/mod.o -o build/lib.linux-x86_64-3.6/mod.pypy36-pp73-x86_64-linux-gnu.so
  installing to build/bdist.linux-x86_64/wheel
  running install
  running install_lib
  creating build/bdist.linux-x86_64
  creating build/bdist.linux-x86_64/wheel
  copying build/lib.linux-x86_64-3.6/mod.pypy36-pp73-x86_64-linux-gnu.so -> build/bdist.linux-x86_64/wheel
  running install_egg_info
  running egg_info
  creating UNKNOWN.egg-info
  writing UNKNOWN.egg-info/PKG-INFO
  writing dependency_links to UNKNOWN.egg-info/dependency_links.txt
  writing top-level names to UNKNOWN.egg-info/top_level.txt
  writing manifest file 'UNKNOWN.egg-info/SOURCES.txt'
  reading manifest file 'UNKNOWN.egg-info/SOURCES.txt'
  writing manifest file 'UNKNOWN.egg-info/SOURCES.txt'
  Copying UNKNOWN.egg-info to build/bdist.linux-x86_64/wheel/UNKNOWN-0.0.0-py3.6.egg-info
  running install_scripts
  creating build/bdist.linux-x86_64/wheel/UNKNOWN-0.0.0.dist-info/WHEEL
  creating '/tmp/pip-wheel-ebh16bjb/UNKNOWN-0.0.0-pp36-pypy36_pp73-linux_x86_64.whl' and adding 'build/bdist.linux-x86_64/wheel' to it
  adding 'mod.pypy36-pp73-x86_64-linux-gnu.so'
  adding 'UNKNOWN-0.0.0.dist-info/METADATA'
  adding 'UNKNOWN-0.0.0.dist-info/WHEEL'
  adding 'UNKNOWN-0.0.0.dist-info/top_level.txt'
  adding 'UNKNOWN-0.0.0.dist-info/RECORD'
  removing build/bdist.linux-x86_64/wheel
done
  Created wheel for UNKNOWN: filename=UNKNOWN-0.0.0-pp36-pypy36_pp73-linux_x86_64.whl size=3302 sha256=37ba3ba940e2e6054ebe21b72b7f93b912c4250dc854178669777a12ce808e53
  Stored in directory: /tmp/pip-ephem-wheel-cache-el29qzci/wheels/7d/9e/1f/02f8804947d211e565279cf14282092ed2a13e9a47728f23f9
Successfully built UNKNOWN
Installing collected packages: UNKNOWN
  Created temporary directory: /tmp/pip-unpacked-wheel-s9t21dvd

Successfully installed UNKNOWN-0.0.0
Cleaning up...
  Removing source in /tmp/pip-req-build-s8t68o2s
Removed build tracker: '/tmp/pip-req-tracker-r6whtqbw'
$ python -c 'import mod'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: /tmp/x/venv/site-packages/mod.pypy36-pp73-x86_64-linux-gnu.so: undefined symbol: PyType_GetFlags

output under cpython

$ pip install . -vv
Non-user install because user site-packages disabled
Created temporary directory: /tmp/pip-ephem-wheel-cache-6q8yoj5l
Created temporary directory: /tmp/pip-req-tracker-sh6zqzns
Initialized build tracking at /tmp/pip-req-tracker-sh6zqzns
Created build tracker: /tmp/pip-req-tracker-sh6zqzns
Entered build tracker: /tmp/pip-req-tracker-sh6zqzns
Created temporary directory: /tmp/pip-install-teoww993
Processing /tmp/x
  Created temporary directory: /tmp/pip-req-build-diwbywxk
  Added file:///tmp/x to build tracker '/tmp/pip-req-tracker-sh6zqzns'
    Running setup.py (path:/tmp/pip-req-build-diwbywxk/setup.py) egg_info for package from file:///tmp/x
    Running command python setup.py egg_info
    running egg_info
    creating /tmp/pip-req-build-diwbywxk/pip-egg-info/UNKNOWN.egg-info
    writing /tmp/pip-req-build-diwbywxk/pip-egg-info/UNKNOWN.egg-info/PKG-INFO
    writing dependency_links to /tmp/pip-req-build-diwbywxk/pip-egg-info/UNKNOWN.egg-info/dependency_links.txt
    writing top-level names to /tmp/pip-req-build-diwbywxk/pip-egg-info/UNKNOWN.egg-info/top_level.txt
    writing manifest file '/tmp/pip-req-build-diwbywxk/pip-egg-info/UNKNOWN.egg-info/SOURCES.txt'
    reading manifest file '/tmp/pip-req-build-diwbywxk/pip-egg-info/UNKNOWN.egg-info/SOURCES.txt'
    writing manifest file '/tmp/pip-req-build-diwbywxk/pip-egg-info/UNKNOWN.egg-info/SOURCES.txt'
  Source in /tmp/pip-req-build-diwbywxk has version 0.0.0, which satisfies requirement UNKNOWN==0.0.0 from file:///tmp/x
  Removed UNKNOWN==0.0.0 from file:///tmp/x from build tracker '/tmp/pip-req-tracker-sh6zqzns'
Building wheels for collected packages: UNKNOWN
  Created temporary directory: /tmp/pip-wheel-np5kfh2q
  Building wheel for UNKNOWN (setup.py) ...   Destination directory: /tmp/pip-wheel-np5kfh2q
  Running command /tmp/x/venvcp/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-req-build-diwbywxk/setup.py'"'"'; __file__='"'"'/tmp/pip-req-build-diwbywxk/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-np5kfh2q
  running bdist_wheel
  running build
  running build_ext
  building 'mod' extension
  creating build
  creating build/temp.linux-x86_64-3.6
  x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPy_LIMITED_API -I/tmp/x/venvcp/include -I/usr/include/python3.6m -c mod.c -o build/temp.linux-x86_64-3.6/mod.o
  creating build/lib.linux-x86_64-3.6
  x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.6/mod.o -o build/lib.linux-x86_64-3.6/mod.cpython-36m-x86_64-linux-gnu.so
  installing to build/bdist.linux-x86_64/wheel
  running install
  running install_lib
  creating build/bdist.linux-x86_64
  creating build/bdist.linux-x86_64/wheel
  copying build/lib.linux-x86_64-3.6/mod.cpython-36m-x86_64-linux-gnu.so -> build/bdist.linux-x86_64/wheel
  running install_egg_info
  running egg_info
  creating UNKNOWN.egg-info
  writing UNKNOWN.egg-info/PKG-INFO
  writing dependency_links to UNKNOWN.egg-info/dependency_links.txt
  writing top-level names to UNKNOWN.egg-info/top_level.txt
  writing manifest file 'UNKNOWN.egg-info/SOURCES.txt'
  reading manifest file 'UNKNOWN.egg-info/SOURCES.txt'
  writing manifest file 'UNKNOWN.egg-info/SOURCES.txt'
  Copying UNKNOWN.egg-info to build/bdist.linux-x86_64/wheel/UNKNOWN-0.0.0-py3.6.egg-info
  running install_scripts
  creating build/bdist.linux-x86_64/wheel/UNKNOWN-0.0.0.dist-info/WHEEL
  creating '/tmp/pip-wheel-np5kfh2q/UNKNOWN-0.0.0-cp36-cp36m-linux_x86_64.whl' and adding 'build/bdist.linux-x86_64/wheel' to it
  adding 'mod.cpython-36m-x86_64-linux-gnu.so'
  adding 'UNKNOWN-0.0.0.dist-info/METADATA'
  adding 'UNKNOWN-0.0.0.dist-info/WHEEL'
  adding 'UNKNOWN-0.0.0.dist-info/top_level.txt'
  adding 'UNKNOWN-0.0.0.dist-info/RECORD'
  removing build/bdist.linux-x86_64/wheel
done
  Created wheel for UNKNOWN: filename=UNKNOWN-0.0.0-cp36-cp36m-linux_x86_64.whl size=7510 sha256=e352fd2cb0259bdf374d133ab2b2204fbd6ddb3c28ce584e7fcacfb2be359d45
  Stored in directory: /tmp/pip-ephem-wheel-cache-6q8yoj5l/wheels/ee/b3/31/be28105f11219b62c2dcf0cb7310ac9d23b417a75b7d21d607
Successfully built UNKNOWN
Installing collected packages: UNKNOWN
  Created temporary directory: /tmp/pip-unpacked-wheel-gejzz0ev

Successfully installed UNKNOWN-0.0.0
Cleaning up...
  Removing source in /tmp/pip-req-build-diwbywxk
Removed build tracker: '/tmp/pip-req-tracker-sh6zqzns'
$ python -c 'import mod'
$
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information
Assignee
Assign to
Time tracking