]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/dist, cmd/ld: GO_EXTLINK_ENABLED=0 defaults to -linkmode=internal
authorIan Lance Taylor <iant@golang.org>
Fri, 29 Mar 2013 23:33:35 +0000 (16:33 -0700)
committerIan Lance Taylor <iant@golang.org>
Fri, 29 Mar 2013 23:33:35 +0000 (16:33 -0700)
Change build system to set GO_EXTLINK_ENABLED=0 by default for
OS X 10.6, since the system linker has a bug and can not
handle the object files generated by 6l.

Fixes #5130.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/8183043

include/libc.h
src/cmd/5l/obj.c
src/cmd/6l/obj.c
src/cmd/8l/obj.c
src/cmd/dist/a.h
src/cmd/dist/build.c
src/cmd/dist/unix.c
src/lib9/goos.c
src/make.bash
src/run.bash

index fab1532f2271aa509402a3193db73371236bb433..e10dde3adf9c4703ba6b46c62677971b15afd9e5 100644 (file)
@@ -291,6 +291,7 @@ extern      char*   getgoroot(void);
 extern char*   getgoversion(void);
 extern char*   getgoarm(void);
 extern char*   getgo386(void);
+extern char*   getgoextlinkenabled(void);
 
 extern char*   mktempdir(void);
 extern void    removeall(char*);
index f5128c6780f53ee366fb3b1fa5b6cb06a88d9728..72bb1fb78410eabcbe236bc93973349ba8e582d9 100644 (file)
@@ -136,6 +136,11 @@ main(int argc, char *argv[])
        if(argc != 1)
                usage();
 
+       // getgoextlinkenabled is based on GO_EXTLINK_ENABLED when
+       // Go was built; see ../../make.bash.
+       if(linkmode == LinkAuto && strcmp(getgoextlinkenabled(), "0") == 0)
+               linkmode = LinkInternal;
+
        if(linkmode == LinkExternal) {
                diag("only -linkmode=internal is supported");
                errorexit();
index 738a2a07f4d4e5fb53573cf6542be44ccacf909a..4e69a8df0c11293b792f4de9f687f7e7f36a9fb0 100644 (file)
@@ -133,11 +133,16 @@ main(int argc, char *argv[])
        if(HEADTYPE == -1)
                HEADTYPE = headtype(goos);
 
+       // getgoextlinkenabled is based on GO_EXTLINK_ENABLED when
+       // Go was built; see ../../make.bash.
+       if(linkmode == LinkAuto && strcmp(getgoextlinkenabled(), "0") == 0)
+               linkmode = LinkInternal;
+
        switch(HEADTYPE) {
        default:
                if(linkmode == LinkAuto)
                        linkmode = LinkInternal;
-               if(linkmode == LinkExternal)
+               if(linkmode == LinkExternal && strcmp(getgoextlinkenabled(), "1") != 0)
                        sysfatal("cannot use -linkmode=external with -H %s", headstr(HEADTYPE));
                break;
        case Hdarwin:
index 35a65edb60e8eac8797055138a36f58ecec98f06..d624a999ba6f3611ad7449afcebbdc1e988606ac 100644 (file)
@@ -139,11 +139,16 @@ main(int argc, char *argv[])
        if(HEADTYPE == -1)
                HEADTYPE = headtype(goos);
 
+       // getgoextlinkenabled is based on GO_EXTLINK_ENABLED when
+       // Go was built; see ../../make.bash.
+       if(linkmode == LinkAuto && strcmp(getgoextlinkenabled(), "0") == 0)
+               linkmode = LinkInternal;
+
        switch(HEADTYPE) {
        default:
                if(linkmode == LinkAuto)
                        linkmode = LinkInternal;
-               if(linkmode == LinkExternal)
+               if(linkmode == LinkExternal && strcmp(getgoextlinkenabled(), "1") != 0)
                        sysfatal("cannot use -linkmode=external with -H %s", headstr(HEADTYPE));
                break;
        case Hdarwin:
index fcd81cc5115ea9ee02f3c6c1a22aaf8790e22b78..73c126476e108dd7259345af5a610d0ed8e3e921 100644 (file)
@@ -72,6 +72,7 @@ extern char *gohostos;
 extern char *goos;
 extern char *goroot;
 extern char *goroot_final;
+extern char *goextlinkenabled;
 extern char *goversion;
 extern char *workdir;
 extern char *tooldir;
index fd6a329c4dd2d1e235ecad3fb2467617aaf9b5d6..e94862325c20f7be83e4a057ef3c29d43027b5c2 100644 (file)
@@ -20,6 +20,7 @@ char *goarm;
 char *go386;
 char *goroot = GOROOT_FINAL;
 char *goroot_final = GOROOT_FINAL;
+char *goextlinkenabled = "";
 char *workdir;
 char *tooldir;
 char *gochar;
@@ -139,6 +140,13 @@ init(void)
        bprintf(&b, "%c", gochars[i]);
        gochar = btake(&b);
 
+       xgetenv(&b, "GO_EXTLINK_ENABLED");
+       if(b.len > 0) {
+               goextlinkenabled = btake(&b);
+               if(!streq(goextlinkenabled, "0") && !streq(goextlinkenabled, "1"))
+                       fatal("unknown $GO_EXTLINK_ENABLED %s", goextlinkenabled);
+       }
+
        xsetenv("GOROOT", goroot);
        xsetenv("GOARCH", goarch);
        xsetenv("GOOS", goos);
@@ -922,6 +930,8 @@ install(char *dir)
                                vadd(&compile, bprintf(&b, "GOARM=\"%s\"", goarm));
                                vadd(&compile, "-D");
                                vadd(&compile, bprintf(&b, "GO386=\"%s\"", go386));
+                               vadd(&compile, "-D");
+                               vadd(&compile, bprintf(&b, "GO_EXTLINK_ENABLED=\"%s\"", goextlinkenabled));
                        }
 
                        // gc/lex.c records the GOEXPERIMENT setting used during the build.
index e4e2dcc9fca8edd4167b36ea3acade9cc6d32321..f2ea48974b1321f0991f87e6b0fe82bcb3ea3619 100644 (file)
@@ -698,6 +698,19 @@ main(int argc, char **argv)
        if(strcmp(gohostarch, "arm") == 0)
                maxnbg = 1;
 
+       // The OS X 10.6 linker does not support external
+       // linking mode; see
+       // https://code.google.com/p/go/issues/detail?id=5130 .
+       // The mapping from the uname release field to the OS X
+       // version number is complicated, but basically 10 or under is
+       // OS X 10.6 or earlier.
+       if(strcmp(gohostos, "darwin") == 0) {
+               if(uname(&u) < 0)
+                       fatal("uname: %s", strerror(errno));
+               if(u.release[1] == '.' || hasprefix(u.release, "10"))
+                       goextlinkenabled = "0";
+       }
+
        init();
        xmain(argc, argv);
        bfree(&b);
index 3b00271117bc7666fffb0208d6925f7ced923349..2d4a800dd1930f028aa75232c4b3aa637b7c2b2a 100644 (file)
@@ -51,3 +51,9 @@ getgo386(void)
 {
        return defgetenv("GO386", GO386);
 }
+
+char *
+getgoextlinkenabled(void)
+{
+       return GO_EXTLINK_ENABLED;
+}
index 2d83b6f4d114781bc6efcbd4787562d9cebd0698..8d0f6ebaea1c76178d5a3105f74ab4530d5c6e32 100755 (executable)
 # to include all cgo related files, .c and .go file with "cgo"
 # build directive, in the build. Set it to 0 to ignore them.
 #
+# GO_EXTLINK_ENABLED: Set to 1 to invoke the host linker when building
+# packages that use cgo.  Set to 0 to do all linking internally.  This
+# controls the default behavior of the linker's -linkmode option.  The
+# default value depends on the system.
+#
 # CC: Command line to run to get at host C compiler.
 # Default is "gcc". Also supported: "clang".
 
index df5b95b0e1abd8a41de8c1f0d31dd73a08b6729f..b197844fe465386a63f0862f8869cd3cf3c06374 100755 (executable)
@@ -83,10 +83,18 @@ set -e
 go test -ldflags '-linkmode=auto'
 go test -ldflags '-linkmode=internal'
 case "$GOHOSTOS-$GOARCH" in
-darwin-386 | darwin-amd64 | openbsd-386 | openbsd-amd64)
+openbsd-386 | openbsd-amd64)
        # test linkmode=external, but __thread not supported, so skip testtls.
        go test -ldflags '-linkmode=external'
        ;;
+darwin-386 | darwin-amd64)
+       # linkmode=external fails on OS X 10.6 and earlier == Darwin
+       # 10.8 and earlier.
+       case $(uname -r) in
+       [0-9].* | 10.*) ;;
+       *) go test -ldflags '-linkmode=external' ;;
+       esac
+       ;;
 freebsd-386 | freebsd-amd64 | linux-386 | linux-amd64 | netbsd-386 | netbsd-amd64)
        go test -ldflags '-linkmode=external'
        go test -ldflags '-linkmode=auto' ../testtls