Skip to content

Conversation

ItsHarper
Copy link
Contributor

@ItsHarper ItsHarper commented Jul 1, 2025

What's the problem this PR addresses?

Two problems:

  1. Improve libc presence detection #6170 broke libc detection on at least Alpine Linux and Chimera Linux (and probably on all other musl-based distributions as well) by looking for the generic string libc in /usr/bin/ldd. On both Chimera and Alpine, ldd --version prints musl libc among the output.

  2. getLibc() was doing unnecessary work on OSes other than Windows, Mac, and Linux (I originally thought it would have been crashing, but that's incorrect). It strongly appears to me that getLibc() would throw an error on any OS other than Windows, Mac, and Linux, as the other OSes supported by node have their own libc implementations that are neither glibc nor musl.
    ...

How did you fix it?

  1. The strings GNU libc and GNU C Library are searched for instead of just libc.

    • By default, ldd contains the text GNU libc in its --version output, but that can be easily customized at build time using a build configuration option (see here and here). As a fallback, the text GNU C Library is found in the header of the ldd script, and it will probably remain there as long as that file remains a script (as opposed to a compiled binary).
  2. I made getLibc() immediately return null on all non-Linux platforms (not just Windows and macOS).

...

Checklist

  • I have set the packages that need to be released for my changes to be effective.
  • I will check that all automated PR checks pass before the PR gets reviewed.

@ItsHarper ItsHarper changed the title Fix libc detection on some musl-based distributions Fix libc detection on musl-based Linux distributions Jul 1, 2025
@ItsHarper ItsHarper marked this pull request as draft July 1, 2025 23:19
ItsHarper added 2 commits July 1, 2025 18:39
By default, glib's version of ldd uses the text "GNU libc", but that
text is provided by the build system, so it's not guaranteed to be there
@ItsHarper ItsHarper changed the title Fix libc detection on musl-based Linux distributions Fix libc detection on various platforms Jul 1, 2025
@ItsHarper ItsHarper marked this pull request as ready for review July 2, 2025 00:07
@ItsHarper
Copy link
Contributor Author

ItsHarper commented Jul 2, 2025

As a side note, while it took a year for anyone to notice that musl support was broken, you'd only notice that it was broken when you tried to install a native package that published musl binaries separately (some of them combine them in a single package).

On the other hand, support for the Unix platforms (not counting Linux and macOS) has almost certainly been broken for 3.5 years (since #3981), and I'm pretty sure yarn was fully crashing on those systems, regardless of which packages you're installing.

Disregard, that last part, I misunderstood how that mapAndFind() code worked.

@arcanis arcanis merged commit c60a57c into yarnpkg:master Jul 26, 2025
26 checks passed
@ItsHarper ItsHarper deleted the fix/libc-detection-chimera branch July 26, 2025 15:04
Saadnajmi pushed a commit to Saadnajmi/berry that referenced this pull request Jul 26, 2025
## What's the problem this PR addresses?

Two problems:

1. yarnpkg#6170 broke `libc` detection on at least Alpine Linux and Chimera
Linux (and probably on all other `musl`-based distributions as well) by
looking for the generic string `libc` in `/usr/bin/ldd`. On both Chimera
and Alpine, `ldd --version` prints `musl libc` among the output.

2. `getLibc()` was doing unnecessary work on OSes other than Windows,
Mac, and Linux (I originally thought it would have been crashing, but
that's incorrect). ~~It strongly appears to me that `getLibc()` would
throw an error on any OS other than Windows, Mac, and Linux, as the
other OSes supported by node have their own libc implementations that
are neither `glibc` nor `musl`.~~
...

## How did you fix it?

1. The strings `GNU libc` and `GNU C Library` are searched for instead
of just `libc`.
* By default, `ldd` contains the text `GNU libc` in its `--version`
output, but that can be easily customized at build time using a build
configuration option (see
[here](https://github.com/bminor/glibc/blob/632d895f3e5d98162f77b9c3c1da4ec19968b671/elf/ldd.bash.in#L37)
and
[here](https://github.com/bminor/glibc/blob/632d895f3e5d98162f77b9c3c1da4ec19968b671/INSTALL#L273-L278)).
As a fallback, the text `GNU C Library` is found in the header of the
`ldd` script, and it will probably remain there as long as that file
remains a script (as opposed to a compiled binary).

2. I made `getLibc()` immediately return `null` on all non-Linux
platforms (not just Windows and macOS).

...

## Checklist

<!--- Don't worry if you miss something, chores are automatically
tested. -->
<!--- This checklist exists to help you remember doing the chores when
you submit a PR. -->
<!--- Put an `x` in all the boxes that apply. -->
- [x] I have read the [Contributing
Guide](https://yarnpkg.com/advanced/contributing).

<!-- See
https://yarnpkg.com/advanced/contributing#preparing-your-pr-to-be-released
for more details. -->
<!-- Check with `yarn version check` and fix with `yarn version check
-i` -->
- [x] I have set the packages that need to be released for my changes to
be effective.

<!-- The "Testing chores" workflow validates that your PR follows our
guidelines. -->
<!-- If it doesn't pass, click on it to see details as to what your PR
might be missing. -->
- [x] I will check that all automated PR checks pass before the PR gets
reviewed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants