]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/link: detect glibc vs musl ldso at link time
authorRuss Cox <rsc@golang.org>
Tue, 2 Aug 2022 14:12:52 +0000 (10:12 -0400)
committerGopher Robot <gobot@golang.org>
Mon, 8 Aug 2022 21:12:57 +0000 (21:12 +0000)
Doing the test at link time lets us distribute one Linux toolchain
that works on both glibc-based and musl-based Linux systems.
The old way built a toolchain that only ran on one or the other.

Fixes #54197.

Change-Id: Iaae8c274c78e1091eee828a720b49646be9bfffe
Reviewed-on: https://go-review.googlesource.com/c/go/+/420774
Auto-Submit: Russ Cox <rsc@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>

12 files changed:
src/cmd/link/internal/amd64/obj.go
src/cmd/link/internal/arm/obj.go
src/cmd/link/internal/arm64/obj.go
src/cmd/link/internal/ld/elf.go
src/cmd/link/internal/ld/lib.go
src/cmd/link/internal/loong64/obj.go
src/cmd/link/internal/mips/obj.go
src/cmd/link/internal/mips64/obj.go
src/cmd/link/internal/ppc64/obj.go
src/cmd/link/internal/s390x/obj.go
src/cmd/link/internal/x86/obj.go
src/make.bash

index d09c90ea280b5a563cb5511322b51aeab0fd4e33..f46045bc9dd9e33096b7be96fcebe3e2e115dbbc 100644 (file)
@@ -65,6 +65,7 @@ func Init() (*sys.Arch, ld.Arch) {
                TLSIEtoLE:        tlsIEtoLE,
 
                Linuxdynld:     "/lib64/ld-linux-x86-64.so.2",
+               LinuxdynldMusl: "/lib/ld-musl-x84_64.so.1",
                Freebsddynld:   "/libexec/ld-elf.so.1",
                Openbsddynld:   "/usr/libexec/ld.so",
                Netbsddynld:    "/libexec/ld.elf_so",
index b7d149851c4b07255f93a369668608dbc8c36a34..6da0c774832eb2ca02f5583dde264774150e96f1 100644 (file)
@@ -63,6 +63,7 @@ func Init() (*sys.Arch, ld.Arch) {
                PEreloc1:         pereloc1,
 
                Linuxdynld:     "/lib/ld-linux.so.3", // 2 for OABI, 3 for EABI
+               LinuxdynldMusl: "/lib/ld-musl-arm.so.1",
                Freebsddynld:   "/usr/libexec/ld-elf.so.1",
                Openbsddynld:   "/usr/libexec/ld.so",
                Netbsddynld:    "/libexec/ld.elf_so",
index 9c7459855c15e7992115fc2d811e9f58311657a9..a47be0b282b0e0a7c80589e606d5f945fc40cca4 100644 (file)
@@ -62,8 +62,9 @@ func Init() (*sys.Arch, ld.Arch) {
                PEreloc1:         pereloc1,
                Trampoline:       trampoline,
 
-               Androiddynld: "/system/bin/linker64",
-               Linuxdynld:   "/lib/ld-linux-aarch64.so.1",
+               Androiddynld:   "/system/bin/linker64",
+               Linuxdynld:     "/lib/ld-linux-aarch64.so.1",
+               LinuxdynldMusl: "/lib/ld-musl-aarch64.so.1",
 
                Freebsddynld:   "/usr/libexec/ld-elf.so.1",
                Openbsddynld:   "/usr/libexec/ld.so",
index 2566ded58db8243079806ad2d3cc5e1eb48e7f6c..040978e6fccf7a9697abf7442bb1034661cc982b 100644 (file)
@@ -15,6 +15,7 @@ import (
        "encoding/hex"
        "fmt"
        "internal/buildcfg"
+       "os"
        "path/filepath"
        "runtime"
        "sort"
@@ -1782,6 +1783,16 @@ func asmbElf(ctxt *Link) {
                                        }
                                } else {
                                        interpreter = thearch.Linuxdynld
+                                       // If interpreter does not exist, try musl instead.
+                                       // This lets the same cmd/link binary work on
+                                       // both glibc-based and musl-based systems.
+                                       if _, err := os.Stat(interpreter); err != nil {
+                                               if musl := thearch.LinuxdynldMusl; musl != "" {
+                                                       if _, err := os.Stat(musl); err == nil {
+                                                               interpreter = musl
+                                                       }
+                                               }
+                                       }
                                }
 
                        case objabi.Hfreebsd:
index 18910ddb850856e52d6bddd3113617739dc8d5cc..c265d73893b96de0192393d33d57edddd7cbaf04 100644 (file)
@@ -183,6 +183,7 @@ type Arch struct {
 
        Androiddynld   string
        Linuxdynld     string
+       LinuxdynldMusl string
        Freebsddynld   string
        Netbsddynld    string
        Openbsddynld   string
index b564dfd05f96d282240cc3640ae0db3fe6636b6f..0a5bb0ac6d6c5e4dbb6a15774e6e82fe1942b00c 100644 (file)
@@ -31,6 +31,7 @@ func Init() (*sys.Arch, ld.Arch) {
                Gentext:          gentext,
 
                Linuxdynld:     "/lib64/ld.so.1",
+               LinuxdynldMusl: "/lib64/ld-musl-loongarch.so.1",
                Freebsddynld:   "XXX",
                Openbsddynld:   "XXX",
                Netbsddynld:    "XXX",
index 5ca75825293fb93459d871672bbb3d94df740da1..f03c9abfe975243564643d96a586521b89f98325 100644 (file)
@@ -39,8 +39,10 @@ import (
 
 func Init() (*sys.Arch, ld.Arch) {
        arch := sys.ArchMIPS
+       musl := "/lib/ld-musl-mips.so.1"
        if buildcfg.GOARCH == "mipsle" {
                arch = sys.ArchMIPSLE
+               musl = "/lib/ld-musl-mipsel.so.1"
        }
 
        theArch := ld.Arch{
@@ -60,7 +62,8 @@ func Init() (*sys.Arch, ld.Arch) {
                Gentext:          gentext,
                Machoreloc1:      machoreloc1,
 
-               Linuxdynld: "/lib/ld.so.1",
+               Linuxdynld:     "/lib/ld.so.1",
+               LinuxdynldMusl: musl,
 
                Freebsddynld:   "XXX",
                Openbsddynld:   "XXX",
index 544e1ef7bedc448bee626b2ff0d01fff953223c3..557d7993cdfdb5ffbcf2411178a776fcb4eb164d 100644 (file)
@@ -39,8 +39,10 @@ import (
 
 func Init() (*sys.Arch, ld.Arch) {
        arch := sys.ArchMIPS64
+       musl := "/lib/ld-musl-mips64.so.1"
        if buildcfg.GOARCH == "mips64le" {
                arch = sys.ArchMIPS64LE
+               musl = "/lib/ld-musl-mips64el.so.1"
        }
 
        theArch := ld.Arch{
@@ -60,6 +62,7 @@ func Init() (*sys.Arch, ld.Arch) {
                Machoreloc1:      machoreloc1,
 
                Linuxdynld:     "/lib64/ld64.so.1",
+               LinuxdynldMusl: musl,
                Freebsddynld:   "XXX",
                Openbsddynld:   "/usr/libexec/ld.so",
                Netbsddynld:    "XXX",
index bca8fa921205e5c92bafa3a3206c1fcb1ace0029..f580c55456bc84d266843788b9f6a70118008369 100644 (file)
@@ -40,10 +40,12 @@ import (
 func Init() (*sys.Arch, ld.Arch) {
        arch := sys.ArchPPC64LE
        dynld := "/lib64/ld64.so.2"
+       musl := "/lib/ld-musl-powerpc64le.so.1"
 
        if buildcfg.GOARCH == "ppc64" {
                arch = sys.ArchPPC64
                dynld = "/lib64/ld64.so.1"
+               musl = "/lib/ld-musl-powerpc64.so.1"
        }
 
        theArch := ld.Arch{
@@ -68,6 +70,8 @@ func Init() (*sys.Arch, ld.Arch) {
                Xcoffreloc1:      xcoffreloc1,
 
                Linuxdynld:     dynld,
+               LinuxdynldMusl: musl,
+
                Freebsddynld:   "XXX",
                Openbsddynld:   "XXX",
                Netbsddynld:    "XXX",
index 8acc1d491760890cc4ec9b9c39f0ee06645f8487..3aa894815175ddebc0452f1ceb4f7df3fd4856c5 100644 (file)
@@ -56,7 +56,8 @@ func Init() (*sys.Arch, ld.Arch) {
                Gentext:          gentext,
                Machoreloc1:      machoreloc1,
 
-               Linuxdynld: "/lib64/ld64.so.1",
+               Linuxdynld:     "/lib64/ld64.so.1",
+               LinuxdynldMusl: "/lib/ld-musl-s390x.so.1",
 
                // not relevant for s390x
                Freebsddynld:   "XXX",
index a19437d8e61d1c35098860579f2b21be7ebe13bc..b0a129eb0ad05d8141a89376cc650b8776a3891b 100644 (file)
@@ -61,11 +61,12 @@ func Init() (*sys.Arch, ld.Arch) {
                Machoreloc1:      machoreloc1,
                PEreloc1:         pereloc1,
 
-               Linuxdynld:   "/lib/ld-linux.so.2",
-               Freebsddynld: "/usr/libexec/ld-elf.so.1",
-               Openbsddynld: "/usr/libexec/ld.so",
-               Netbsddynld:  "/usr/libexec/ld.elf_so",
-               Solarisdynld: "/lib/ld.so.1",
+               Linuxdynld:     "/lib/ld-linux.so.2",
+               LinuxdynldMusl: "/lib/ld-musl-i386.so.1",
+               Freebsddynld:   "/usr/libexec/ld-elf.so.1",
+               Openbsddynld:   "/usr/libexec/ld.so",
+               Netbsddynld:    "/usr/libexec/ld.elf_so",
+               Solarisdynld:   "/lib/ld.so.1",
        }
 
        return arch, theArch
index ab2ce19f4eee148e68807ff45967f11a1a853253..54bb0705139e5eb8699c25a23b4546944f02dd32 100755 (executable)
@@ -133,15 +133,6 @@ if [ "$(uname -s)" = "GNU/kFreeBSD" ]; then
        export CGO_ENABLED=0
 fi
 
-# Test which linker/loader our system is using, if GO_LDSO is not set.
-if [ -z "$GO_LDSO" ] && type readelf >/dev/null 2>&1; then
-       if echo "int main() { return 0; }" | ${CC:-cc} -o ./test-musl-ldso -x c - >/dev/null 2>&1; then
-               LDSO=$(readelf -l ./test-musl-ldso | grep 'interpreter:' | sed -e 's/^.*interpreter: \(.*\)[]]/\1/') >/dev/null 2>&1
-               [ -z "$LDSO" ] || export GO_LDSO="$LDSO"
-               rm -f ./test-musl-ldso
-       fi
-fi
-
 # Clean old generated file that will cause problems in the build.
 rm -f ./runtime/runtime_defs.go