New submission from Natanael Copa <nc...@alpinelinux.org>:

The SOABI does not make any difference between GNU libc and musl libc.

Using official docker images:

# debian build with GNU libc
$ docker run --rm python:slim python -c  'import 
sysconfig;print(sysconfig.get_config_var("SOABI"))'
cpython-39-x86_64-linux-gnu

# alpine build with musl libc
$ docker run --rm python:alpine python -c  'import 
sysconfig;print(sysconfig.get_config_var("SOABI"))'
cpython-39-x86_64-linux-gnu


Both ends with `-gnu`, while it would be expected that with musl it would end 
with `-musl`

This affects the extension suffix:

$ docker run --rm python:slim python-config --extension-suffix
.cpython-39-x86_64-linux-gnu.so

$ docker run --rm python:alpine python-config --extension-suffix
.cpython-39-x86_64-linux-gnu.so

Which again affects the pre-compiled binary wheels, and binary modules built 
with musl libc gets mixed up with the GNU libc modules due to the -gnu.so 
suffix.

The source of the problem is that the `configure.ac` file assumes that all 
defined(__linux__) is -gnu when detecting the PLATFORM_TRIPLET.

```
...
#if defined(__ANDROID__)
    # Android is not a multiarch system.
#elif defined(__linux__)
# if defined(__x86_64__) && defined(__LP64__)
        x86_64-linux-gnu
# elif defined(__x86_64__) && defined(__ILP32__)
        x86_64-linux-gnux32
# elif defined(__i386__)
...
```

So when building python with musl libc the PLATFORM_TRIPLET always sets 
`*-linux-gnu`.

output from configure run on musl system:
```
...
checking for a sed that does not truncate output... /bin/sed                    
                                  
checking for --with-cxx-main=<compiler>... no                                   
                                  
checking for the platform triplet based on compiler characteristics... 
x86_64-linux-gnu  
...
```

A first step in fixing this would be to make sure that we only set -gnu when 
__GLIBC__ is defined:
```diff
diff --git a/configure.ac b/configure.ac
index 1f5a008388..1b4690c90f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -726,7 +726,7 @@ cat >> conftest.c <<EOF
 #undef unix
 #if defined(__ANDROID__)
     # Android is not a multiarch system.
-#elif defined(__linux__)
+#elif defined(__linux__) && defined (__GLIBC__)
 # if defined(__x86_64__) && defined(__LP64__)
         x86_64-linux-gnu
```

But that would make build with musl fail with "unknown platform triplet".

Not sure what the proper fix would be, but one way to extract the suffix from 
`$CPP -dumpmachine`

----------
components: Interpreter Core
messages: 386183
nosy: ncopa
priority: normal
severity: normal
status: open
title: SOABI on Linux does not distinguish between GNU libc and musl libc

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue43112>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to