aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2014-04-16 20:28:53 -0700
committerIan Lance Taylor <iant@golang.org>2014-04-16 20:28:53 -0700
commit827aab07b80cd8ad26548a6fa234b7d038537d33 (patch)
tree5e150c4c9824eec4aa0e829c260948f801318884
parent32dffef0980eb810b97f48eb9dfabb33602a0472 (diff)
downloadgo-827aab07b80cd8ad26548a6fa234b7d038537d33.tar.gz
go-827aab07b80cd8ad26548a6fa234b7d038537d33.zip
cmd/ld: don't pass -rdynamic to external linker if -static is used
Fixes #7800. LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/87790051
-rw-r--r--src/cmd/ld/lib.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/cmd/ld/lib.c b/src/cmd/ld/lib.c
index 78b8cf2bad..29de54e3cf 100644
--- a/src/cmd/ld/lib.c
+++ b/src/cmd/ld/lib.c
@@ -654,6 +654,20 @@ hostlink(void)
if(*p == '\0')
break;
argv[argc++] = p;
+
+ // clang, unlike GCC, passes -rdynamic to the linker
+ // even when linking with -static, causing a linker
+ // error when using GNU ld. So take out -rdynamic if
+ // we added it. We do it in this order, rather than
+ // only adding -rdynamic later, so that -extldflags
+ // can override -rdynamic without using -static.
+ if(iself && strncmp(p, "-static", 7) == 0 && (p[7]==' ' || p[7]=='\0')) {
+ for(i=0; i<argc; i++) {
+ if(strcmp(argv[i], "-rdynamic") == 0)
+ argv[i] = "-static";
+ }
+ }
+
p = strchr(p + 1, ' ');
}