I ran into another problem. In shared mode, Modules/Setup places the shared modules in ./Modules/ instead of the build directory ./build/lib.something/. The ./Modules/ directory is not on sys.path. getpath.c only adds the build dir to sys.path. It takes the value from ./pybuilddir.txt. The file is generated by sysconfig.py.
$ make
...
*** WARNING: renaming "_asyncio" since importing it failed: No module named 'math'
The following modules found by detect_modules() in setup.py, have been
built by the Makefile instead, as configured by the Setup files:
_abc cmath math
pwd time
$ find -name 'math*.so'
./Modules/math.cpython-311-x86_64-linux-gnu.so