summaryrefslogtreecommitdiff
path: root/src/cmd/ld
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
commitc1c7208821a13600f946e432cf6c93ce34331e28 (patch)
tree7825e57a030805e43364b50283f273ea148d9496 /src/cmd/ld
parenta3ab570ba2ea9da0a34eb09144aa88c2bd72b3d7 (diff)
downloadgo-c1c7208821a13600f946e432cf6c93ce34331e28.tar.gz
cmd/ld: don't pass -rdynamic to external linker if -static is used
Fixes issue 7800. LGTM=rsc R=rsc CC=golang-codereviews https://codereview.appspot.com/87790051
Diffstat (limited to 'src/cmd/ld')
-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 78b8cf2ba..29de54e3c 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, ' ');
}