python / python/cpython

Windows debug abi3t extensions autolink python316_d.lib instead of python316t_d.lib

Open
#157,611 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

type-bug
Dominant language
Python
Stars
77.2k
Forks
35.9k
PR merge metrics
PR metrics pending

Description

Bug report

Bug description:

On the current main branch, an MSVC-compatible debug extension that defines
Py_LIMITED_API and Py_TARGET_ABI3T can select the ordinary debug import
library instead of the free-threaded debug library.

The ordering in the public headers appears to cause the mismatch:

  1. PC/pyconfig.h selects the autolink library.
  2. Only later does Include/pyabi.h derive Py_GIL_DISABLED from
    Py_TARGET_ABI3T.

The debug autolink branch in PC/pyconfig.h currently checks only
Py_GIL_DISABLED. An abi3t extension identifies its target with
Py_TARGET_ABI3T, so it does not necessarily define Py_GIL_DISABLED before
including these headers.

I reproduced this by compiling a minimal Windows x86-64 COFF object with Clang
in MSVC-compatible target mode. The probe defines _DEBUG, Py_LIMITED_API,
and Py_TARGET_ABI3T=0x030f0000, then includes the two headers in their normal
order:

#include "PC/pyconfig.h"
#include "Include/pyabi.h"

#ifndef Py_GIL_DISABLED
#  error "Py_TARGET_ABI3T did not enable Py_GIL_DISABLED"
#endif

int cpython_abi3t_autolink_probe;

The resulting object's .drectve section contains:

/DEFAULTLIB:python316_d.lib

Defining Py_GIL_DISABLED explicitly before including the headers instead
produces:

/DEFAULTLIB:python316t_d.lib

The release abi3t case already selects python3t.lib; the mismatch is specific
to the versioned debug-library branch. The PCbuild naming also identifies
python316t_d.lib as the free-threaded debug import library.

A minimal possible fix is to recognize the ABI target at the point where the
autolink library is selected:

-#if defined(Py_GIL_DISABLED)
+#if defined(Py_GIL_DISABLED) || defined(Py_TARGET_ABI3T)

With that change, the original probe, without an explicit
Py_GIL_DISABLED, emits /DEFAULTLIB:python316t_d.lib.

This test inspects the Windows linker directive emitted by the public headers,
but I have not run a native Windows extension build. Could you confirm whether
Py_TARGET_ABI3T should select the free-threaded debug import library at this
earlier point? If so, I can prepare a pull request with this change, or adjust
it if changing the include/derivation order is preferred.

CPython versions tested on

CPython main.

Operating systems tested on

The reproducer was cross-compiled on Linux for the Windows x86-64 MSVC target.
Native Windows validation has not yet been performed -- as I do not have a windows machine.

CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux

Linked PRs
  • gh-157623

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the autolink selection in PC/pyconfig.h and the ABI derivation in Include/pyabi.h. Reproduce the documented probe or inspect linked PR gh-157623, then verify that the Windows debug abi3t case emits the free-threaded import-library directive without requiring an explicit Py_GIL_DISABLED.

Written by the indexing model from the issue text.

Assessment

Tech stack
c, python
Domain
build-system, operating-systems
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.