]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/dist, cmd/link: allow passing default dynamic linker/loader
authorTobias Klauser <tklauser@distanz.ch>
Mon, 25 Feb 2019 10:32:00 +0000 (11:32 +0100)
committerTobias Klauser <tobias.klauser@gmail.com>
Fri, 1 Mar 2019 06:06:13 +0000 (06:06 +0000)
Add an environment variable to make.bash to allow setting the default
dynamic linker/loader. This fixes alpine builds to use
/lib/ld-musl-x86_64.so.1:

  $ readelf -l ../bin/go | grep 'interpreter:' | sed -e 's/^.*interpreter: \(.*\)[]]/\1/'
  /lib/ld-musl-x86_64.so.1

Also re-enable the internal linker tests that were previously disabled
for alpine (CL 41759, CL 41678).

Fixes #18243
Updates #19938

This resurrects CL 50070 authored by Jessie Frazelle.

Change-Id: I132b5282045a3d60c8568e3b002a7f075eac2d93
Reviewed-on: https://go-review.googlesource.com/c/163977
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/dist/build.go
src/cmd/dist/buildruntime.go
src/cmd/dist/test.go
src/cmd/internal/objabi/util.go
src/cmd/link/internal/ld/elf.go
src/make.bash

index 03f0f03657af2c97ba80e6e13eb7eee1c0bfdbfc..87739a510da60f833b93cbf86ec761db1f708bd4 100644 (file)
@@ -48,6 +48,7 @@ var (
        defaultcflags    string
        defaultldflags   string
        defaultpkgconfig string
+       defaultldso      string
 
        rebuildall   bool
        defaultclang bool
@@ -207,6 +208,8 @@ func xinit() {
        }
        defaultpkgconfig = b
 
+       defaultldso = os.Getenv("GO_LDSO")
+
        // For tools being invoked but also for os.ExpandEnv.
        os.Setenv("GO386", go386)
        os.Setenv("GOARCH", goarch)
index 5aadc8da674ff93c70467518e486c05332ea1132..d5462792f827b8fe3a055e122a8eab8d813345ca 100644 (file)
@@ -76,6 +76,7 @@ func mkzbootstrap(file string) {
        fmt.Fprintf(&buf, "const defaultGOOS = runtime.GOOS\n")
        fmt.Fprintf(&buf, "const defaultGOARCH = runtime.GOARCH\n")
        fmt.Fprintf(&buf, "const defaultGO_EXTLINK_ENABLED = `%s`\n", goextlinkenabled)
+       fmt.Fprintf(&buf, "const defaultGO_LDSO = `%s`\n", defaultldso)
        fmt.Fprintf(&buf, "const version = `%s`\n", findgoversion())
        fmt.Fprintf(&buf, "const stackGuardMultiplierDefault = %d\n", stackGuardMultiplierDefault())
        fmt.Fprintf(&buf, "const goexperiment = `%s`\n", os.Getenv("GOEXPERIMENT"))
index 68401e546b4e5c07f1530ffc7712954276985528..8084e474a8538794d5e705f9765b62d947f93744 100644 (file)
@@ -570,10 +570,7 @@ func (t *tester) registerTests() {
        }
 
        // Test internal linking of PIE binaries where it is supported.
-       if goos == "linux" && goarch == "amd64" && !isAlpineLinux() {
-               // Issue 18243: We don't have a way to set the default
-               // dynamic linker used in internal linking mode. So
-               // this test is skipped on Alpine.
+       if goos == "linux" && goarch == "amd64" {
                t.tests = append(t.tests, distTest{
                        name:    "pie_internal",
                        heading: "internal linking of -buildmode=pie",
@@ -899,10 +896,6 @@ func (t *tester) internalLink() bool {
        if goarch == "arm64" || goarch == "mips64" || goarch == "mips64le" || goarch == "mips" || goarch == "mipsle" {
                return false
        }
-       if isAlpineLinux() {
-               // Issue 18243.
-               return false
-       }
        return true
 }
 
index da49f706f603384a976395e93e0ee0bfaad09d75..907f75cb4f8f675bc092244b2752c3a56a27743a 100644 (file)
@@ -28,6 +28,7 @@ var (
        GOARM    = goarm()
        GOMIPS   = gomips()
        GOMIPS64 = gomips64()
+       GO_LDSO  = defaultGO_LDSO
        Version  = version
 )
 
index c2a2b3a7baf25cce4a4013449c3f037c13144470..19bcbbb87a6a25949fbe6279f3d474469855078b 100644 (file)
@@ -1840,6 +1840,11 @@ func Asmbelf(ctxt *Link, symo int64) {
                sh.type_ = SHT_PROGBITS
                sh.flags = SHF_ALLOC
                sh.addralign = 1
+
+               if interpreter == "" && objabi.GO_LDSO != "" {
+                       interpreter = objabi.GO_LDSO
+               }
+
                if interpreter == "" {
                        switch ctxt.HeadType {
                        case objabi.Hlinux:
index 13497eb039d89e06e8724e676a05f467819cba04..b0e33cf6a414a1ab3a6ddf9e4da2c6934f0a6d35 100755 (executable)
@@ -34,6 +34,9 @@
 # controls the default behavior of the linker's -linkmode option.  The
 # default value depends on the system.
 #
+# GO_LDSO: Sets the default dynamic linker/loader (ld.so) to be used
+# by the internal linker.
+#
 # CC: Command line to run to compile C code for GOHOSTARCH.
 # Default is "gcc". Also supported: "clang".
 #
@@ -126,6 +129,15 @@ if [ "$(uname -s)" = "GNU/kFreeBSD" ]; then
        export CGO_ENABLED=0
 fi
 
+# On Alpine Linux, use the musl dynamic linker/loader
+if [ -f "/etc/alpine-release" ]; then
+       if type readelf >/dev/null 2>&1; then
+               echo "int main() { return 0; }" | ${CC:-gcc} -o ./test-alpine-ldso -x c -
+               export GO_LDSO=$(readelf -l ./test-alpine-ldso | grep 'interpreter:' | sed -e 's/^.*interpreter: \(.*\)[]]/\1/')
+               rm -f ./test-alpine-ldso
+       fi
+fi
+
 # Clean old generated file that will cause problems in the build.
 rm -f ./runtime/runtime_defs.go