From a555758909530b36d5b7fc5b2897698924222d14 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 1 May 2013 14:30:19 -0700 Subject: [PATCH] cmd/ld: fix syms that are both cgo_import_static & cgo_import_dynamic This is needed for SWIG when linking in internal mode. In internal mode if a symbol was cgo_import_static we used to forget that it was also cgo_import_dynamic. R=rsc, r CC=golang-dev https://golang.org/cl/9080043 --- src/cmd/ld/go.c | 5 +++-- src/cmd/ld/lib.c | 12 ++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/cmd/ld/go.c b/src/cmd/ld/go.c index fa2ec4e28da..47fdbe9442b 100644 --- a/src/cmd/ld/go.c +++ b/src/cmd/ld/go.c @@ -463,11 +463,12 @@ loadcgo(char *file, char *pkg, char *p, int n) s = lookup(local, 0); if(local != f[1]) free(local); - if(s->type == 0 || s->type == SXREF) { + if(s->type == 0 || s->type == SXREF || s->type == SHOSTOBJ) { s->dynimplib = lib; s->extname = remote; s->dynimpvers = q; - s->type = SDYNIMPORT; + if(s->type != SHOSTOBJ) + s->type = SDYNIMPORT; havedynamic = 1; } continue; diff --git a/src/cmd/ld/lib.c b/src/cmd/ld/lib.c index 6b95ae2aeab..47a52b553c9 100644 --- a/src/cmd/ld/lib.c +++ b/src/cmd/ld/lib.c @@ -331,8 +331,16 @@ loadlib(void) // Drop all the cgo_import_static declarations. // Turns out we won't be needing them. for(s = allsym; s != S; s = s->allsym) - if(s->type == SHOSTOBJ) - s->type = 0; + if(s->type == SHOSTOBJ) { + // If a symbol was marked both + // cgo_import_static and cgo_import_dynamic, + // then we want to make it cgo_import_dynamic + // now. + if(s->extname != nil && s->cgoexport == 0) { + s->type = SDYNIMPORT; + } else + s->type = 0; + } } // Now that we know the link mode, trim the dynexp list.