Skip to content

Commit 3315066

Browse files
rscgopherbot
authored andcommitted
cmd/link: detect glibc vs musl ldso at link time
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 <[email protected]> Reviewed-by: Cherry Mui <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Run-TryBot: Russ Cox <[email protected]>
1 parent 52dfdc5 commit 3315066

File tree

12 files changed

+37
-18
lines changed

12 files changed

+37
-18
lines changed

src/cmd/link/internal/amd64/obj.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ func Init() (*sys.Arch, ld.Arch) {
6565
TLSIEtoLE: tlsIEtoLE,
6666

6767
Linuxdynld: "/lib64/ld-linux-x86-64.so.2",
68+
LinuxdynldMusl: "/lib/ld-musl-x84_64.so.1",
6869
Freebsddynld: "/libexec/ld-elf.so.1",
6970
Openbsddynld: "/usr/libexec/ld.so",
7071
Netbsddynld: "/libexec/ld.elf_so",

src/cmd/link/internal/arm/obj.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ func Init() (*sys.Arch, ld.Arch) {
6363
PEreloc1: pereloc1,
6464

6565
Linuxdynld: "/lib/ld-linux.so.3", // 2 for OABI, 3 for EABI
66+
LinuxdynldMusl: "/lib/ld-musl-arm.so.1",
6667
Freebsddynld: "/usr/libexec/ld-elf.so.1",
6768
Openbsddynld: "/usr/libexec/ld.so",
6869
Netbsddynld: "/libexec/ld.elf_so",

src/cmd/link/internal/arm64/obj.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,9 @@ func Init() (*sys.Arch, ld.Arch) {
6262
PEreloc1: pereloc1,
6363
Trampoline: trampoline,
6464

65-
Androiddynld: "/system/bin/linker64",
66-
Linuxdynld: "/lib/ld-linux-aarch64.so.1",
65+
Androiddynld: "/system/bin/linker64",
66+
Linuxdynld: "/lib/ld-linux-aarch64.so.1",
67+
LinuxdynldMusl: "/lib/ld-musl-aarch64.so.1",
6768

6869
Freebsddynld: "/usr/libexec/ld-elf.so.1",
6970
Openbsddynld: "/usr/libexec/ld.so",

src/cmd/link/internal/ld/elf.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"encoding/hex"
1616
"fmt"
1717
"internal/buildcfg"
18+
"os"
1819
"path/filepath"
1920
"runtime"
2021
"sort"
@@ -1782,6 +1783,16 @@ func asmbElf(ctxt *Link) {
17821783
}
17831784
} else {
17841785
interpreter = thearch.Linuxdynld
1786+
// If interpreter does not exist, try musl instead.
1787+
// This lets the same cmd/link binary work on
1788+
// both glibc-based and musl-based systems.
1789+
if _, err := os.Stat(interpreter); err != nil {
1790+
if musl := thearch.LinuxdynldMusl; musl != "" {
1791+
if _, err := os.Stat(musl); err == nil {
1792+
interpreter = musl
1793+
}
1794+
}
1795+
}
17851796
}
17861797

17871798
case objabi.Hfreebsd:

src/cmd/link/internal/ld/lib.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ type Arch struct {
183183

184184
Androiddynld string
185185
Linuxdynld string
186+
LinuxdynldMusl string
186187
Freebsddynld string
187188
Netbsddynld string
188189
Openbsddynld string

src/cmd/link/internal/loong64/obj.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ func Init() (*sys.Arch, ld.Arch) {
3131
Gentext: gentext,
3232

3333
Linuxdynld: "/lib64/ld.so.1",
34+
LinuxdynldMusl: "/lib64/ld-musl-loongarch.so.1",
3435
Freebsddynld: "XXX",
3536
Openbsddynld: "XXX",
3637
Netbsddynld: "XXX",

src/cmd/link/internal/mips/obj.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,10 @@ import (
3939

4040
func Init() (*sys.Arch, ld.Arch) {
4141
arch := sys.ArchMIPS
42+
musl := "/lib/ld-musl-mips.so.1"
4243
if buildcfg.GOARCH == "mipsle" {
4344
arch = sys.ArchMIPSLE
45+
musl = "/lib/ld-musl-mipsel.so.1"
4446
}
4547

4648
theArch := ld.Arch{
@@ -60,7 +62,8 @@ func Init() (*sys.Arch, ld.Arch) {
6062
Gentext: gentext,
6163
Machoreloc1: machoreloc1,
6264

63-
Linuxdynld: "/lib/ld.so.1",
65+
Linuxdynld: "/lib/ld.so.1",
66+
LinuxdynldMusl: musl,
6467

6568
Freebsddynld: "XXX",
6669
Openbsddynld: "XXX",

src/cmd/link/internal/mips64/obj.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,10 @@ import (
3939

4040
func Init() (*sys.Arch, ld.Arch) {
4141
arch := sys.ArchMIPS64
42+
musl := "/lib/ld-musl-mips64.so.1"
4243
if buildcfg.GOARCH == "mips64le" {
4344
arch = sys.ArchMIPS64LE
45+
musl = "/lib/ld-musl-mips64el.so.1"
4446
}
4547

4648
theArch := ld.Arch{
@@ -60,6 +62,7 @@ func Init() (*sys.Arch, ld.Arch) {
6062
Machoreloc1: machoreloc1,
6163

6264
Linuxdynld: "/lib64/ld64.so.1",
65+
LinuxdynldMusl: musl,
6366
Freebsddynld: "XXX",
6467
Openbsddynld: "/usr/libexec/ld.so",
6568
Netbsddynld: "XXX",

src/cmd/link/internal/ppc64/obj.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,12 @@ import (
4040
func Init() (*sys.Arch, ld.Arch) {
4141
arch := sys.ArchPPC64LE
4242
dynld := "/lib64/ld64.so.2"
43+
musl := "/lib/ld-musl-powerpc64le.so.1"
4344

4445
if buildcfg.GOARCH == "ppc64" {
4546
arch = sys.ArchPPC64
4647
dynld = "/lib64/ld64.so.1"
48+
musl = "/lib/ld-musl-powerpc64.so.1"
4749
}
4850

4951
theArch := ld.Arch{
@@ -68,6 +70,8 @@ func Init() (*sys.Arch, ld.Arch) {
6870
Xcoffreloc1: xcoffreloc1,
6971

7072
Linuxdynld: dynld,
73+
LinuxdynldMusl: musl,
74+
7175
Freebsddynld: "XXX",
7276
Openbsddynld: "XXX",
7377
Netbsddynld: "XXX",

src/cmd/link/internal/s390x/obj.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ func Init() (*sys.Arch, ld.Arch) {
5656
Gentext: gentext,
5757
Machoreloc1: machoreloc1,
5858

59-
Linuxdynld: "/lib64/ld64.so.1",
59+
Linuxdynld: "/lib64/ld64.so.1",
60+
LinuxdynldMusl: "/lib/ld-musl-s390x.so.1",
6061

6162
// not relevant for s390x
6263
Freebsddynld: "XXX",

src/cmd/link/internal/x86/obj.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,12 @@ func Init() (*sys.Arch, ld.Arch) {
6161
Machoreloc1: machoreloc1,
6262
PEreloc1: pereloc1,
6363

64-
Linuxdynld: "/lib/ld-linux.so.2",
65-
Freebsddynld: "/usr/libexec/ld-elf.so.1",
66-
Openbsddynld: "/usr/libexec/ld.so",
67-
Netbsddynld: "/usr/libexec/ld.elf_so",
68-
Solarisdynld: "/lib/ld.so.1",
64+
Linuxdynld: "/lib/ld-linux.so.2",
65+
LinuxdynldMusl: "/lib/ld-musl-i386.so.1",
66+
Freebsddynld: "/usr/libexec/ld-elf.so.1",
67+
Openbsddynld: "/usr/libexec/ld.so",
68+
Netbsddynld: "/usr/libexec/ld.elf_so",
69+
Solarisdynld: "/lib/ld.so.1",
6970
}
7071

7172
return arch, theArch

src/make.bash

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -133,15 +133,6 @@ if [ "$(uname -s)" = "GNU/kFreeBSD" ]; then
133133
export CGO_ENABLED=0
134134
fi
135135

136-
# Test which linker/loader our system is using, if GO_LDSO is not set.
137-
if [ -z "$GO_LDSO" ] && type readelf >/dev/null 2>&1; then
138-
if echo "int main() { return 0; }" | ${CC:-cc} -o ./test-musl-ldso -x c - >/dev/null 2>&1; then
139-
LDSO=$(readelf -l ./test-musl-ldso | grep 'interpreter:' | sed -e 's/^.*interpreter: \(.*\)[]]/\1/') >/dev/null 2>&1
140-
[ -z "$LDSO" ] || export GO_LDSO="$LDSO"
141-
rm -f ./test-musl-ldso
142-
fi
143-
fi
144-
145136
# Clean old generated file that will cause problems in the build.
146137
rm -f ./runtime/runtime_defs.go
147138

0 commit comments

Comments
 (0)