Skip to content

linuxLibcFromldd() is unreliable and not side-stepable #469

@Flowdalic

Description

@Flowdalic

On my system lld --version returns a string that does neither contain glibc, gnu libc nor musl:

$ lld --version
ldd (Gentoo 2.41-r6 (patchset 8)) 2.41
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

This causes the following exception:

Caused by: java.lang.UnsupportedOperationException: Cannot work out libc used by this OS. ldd output was: ldd (gentoo 2.41-r6 (patchset 8)) 2.41
copyright (c) 2024 free software foundation, inc.
this is free software; see the source for copying conditions.  there is no
warranty; not even for merchantability or fitness for a particular purpose.
written by roland mcgrath and ulrich drepper.

        at com.palantir.platform.GradleOperatingSystem.lambda$linuxLibcFromLdd$5(GradleOperatingSystem.java:77)
        at org.gradle.api.internal.provider.BiProvider.calculateOwnValue(BiProvider.java:81)
        at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:115)
        at org.gradle.api.internal.provider.FlatMapProvider.calculateOwnValue(FlatMapProvider.java:53)
        at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:115)
        at org.gradle.api.internal.provider.TransformBackedProvider.calculateOwnValue(TransformBackedProvider.java:81)
        at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:115)
        at org.gradle.api.internal.provider.DelegatingProviderWithValue.calculateOwnValue(DelegatingProviderWithValue.java:45)
        at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:115)
        at org.gradle.api.internal.provider.TransformBackedProvider.calculateOwnValue(TransformBackedProvider.java:81)
        at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:115)
        at org.gradle.api.internal.provider.MapCollectors$EntryWithValueFromProvider.collectEntries(MapCollectors.java:104)
        at org.gradle.api.internal.provider.DefaultMapProperty$CollectingSupplier.lambda$calculateOwnValue$1(DefaultMapProperty.java:594)
        at org.gradle.api.internal.provider.AbstractCollectingSupplier.calculateValue(AbstractCollectingSupplier.java:87)
        at org.gradle.api.internal.provider.DefaultMapProperty$CollectingSupplier.calculateOwnValue(DefaultMapProperty.java:593)
        at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:115)
        at org.gradle.api.internal.provider.AbstractCollectingSupplier.calculateValue(AbstractCollectingSupplier.java:41)
        at org.gradle.api.internal.provider.DefaultMapProperty.calculateValueFrom(DefaultMapProperty.java:348)
        at org.gradle.api.internal.provider.DefaultMapProperty.calculateValueFrom(DefaultMapProperty.java:58)
        at org.gradle.api.internal.provider.AbstractProperty.doCalculateValue(AbstractProperty.java:176)
        at org.gradle.api.internal.provider.AbstractProperty.calculateOwnValue(AbstractProperty.java:169)
        at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateOwnPresentValue(AbstractMinimalProvider.java:80)
        at org.gradle.api.internal.provider.AbstractMinimalProvider.get(AbstractMinimalProvider.java:100)
        at org.gradle.api.internal.attributes.DefaultMutableAttributeContainer.doRealize(DefaultMutableAttributeContainer.java:153)
        at org.gradle.api.internal.attributes.DefaultMutableAttributeContainer.asImmutable(DefaultMutableAttributeContainer.java:193)
        at org.gradle.api.internal.attributes.DefaultMutableAttributeContainer.toString(DefaultMutableAttributeContainer.java:64)
        at org.gradle.internal.logging.text.TreeFormatter.appendValue(TreeFormatter.java:214)
        at org.gradle.api.internal.artifacts.transform.DefaultVariantTransformRegistry.buildFailureToRegisterMsg(DefaultVariantTransformRegistry.java:107)
        at org.gradle.api.internal.artifacts.transform.DefaultVariantTransformRegistry.doRegisterTransform(DefaultVariantTransformRegistry.java:95)
        at org.gradle.api.internal.artifacts.transform.DefaultVariantTransformRegistry.registerTransform(DefaultVariantTransformRegistry.java:73)
        at org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.registerTransform(DefaultDependencyHandler.java:321)
        at com.palantir.javaformat.gradle.NativeImageFormatProviderPlugin.apply(NativeImageFormatProviderPlugin.java:62)
        at com.palantir.javaformat.gradle.NativeImageFormatProviderPlugin.apply(NativeImageFormatProviderPlugin.java:30)
        at org.gradle.api.internal.plugins.ImperativeOnlyPluginTarget.applyImperative(ImperativeOnlyPluginTarget.java:55)
        at org.gradle.api.internal.plugins.RuleBasedPluginTarget.applyImperative(RuleBasedPluginTarget.java:50)
        at org.gradle.api.internal.plugins.DefaultPluginManager.addPlugin(DefaultPluginManager.java:190)
        at org.gradle.api.internal.plugins.DefaultPluginManager.access$100(DefaultPluginManager.java:54)
        at org.gradle.api.internal.plugins.DefaultPluginManager$AddPluginBuildOperation.run(DefaultPluginManager.java:285)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
        at org.gradle.api.internal.plugins.DefaultPluginManager.lambda$doApply$0(DefaultPluginManager.java:170)
        at org.gradle.internal.code.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:44)
        at org.gradle.api.internal.plugins.DefaultPluginManager.doApply(DefaultPluginManager.java:169)
        ... 278 more

A more reliable way compared to checking the ldd --version output would be to obtain the Requesting program interpreter output of readelf -l

$ readelf -l /bin/sh | grep -F 'Requesting program interpreter'
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

If it contains musl then it's most likely musl, if it's ld-linux then it's most likely glibc. Note that you may want to invoke readelf on a binary's path obtained from PATH to account for prefix situations, so basically readelf -v $(command -v sh).

Additionally, it would be nice if there where an setting to side-step the automatic detection. Ideally via gradle property and/or via an environment variable.

Note that this unreliable approach is used at two places

  • GradleOperatingSystem.linuxLIbcFromLdd
  • OperatingSystem

(maybe a good idea to reduce the duplicate code in both)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions