From: Cherry Zhang Date: Thu, 31 Oct 2019 23:35:55 +0000 (-0400) Subject: [dev.link] cmd/link: process cgo_import_static before host object loading X-Git-Tag: go1.14beta1~292^2^2~17 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=4a43a5079184f9a4cff355fbf8c6d3145e253bb2;p=gostls13.git [dev.link] cmd/link: process cgo_import_static before host object loading In internal linking mode, we need to process cgo_import_static directives before loading host objects, because the directive is to tell the host object loader how to deal with imported symbols. This should fix linking with old object files. I think there needs some similar logic for new object files, but I'll leave that for later. Change-Id: Icaa286de626ea1876086dbdd015047084c92caf9 Reviewed-on: https://go-review.googlesource.com/c/go/+/204697 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 679d44e8dd..b882df29a1 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -443,20 +443,6 @@ func (ctxt *Link) loadlib() { } } - // Conditionally load host objects, or setup for external linking. - hostobjs(ctxt) - hostlinksetup(ctxt) - - if *flagNewobj { - // Add references of externally defined symbols. - ctxt.loader.LoadRefs(ctxt.Arch, ctxt.Syms) - } - - // Now that we know the link mode, set the dynexp list. - if !*flagNewobj { // set this later in newobj mode - setupdynexp(ctxt) - } - if ctxt.LinkMode == LinkInternal && len(hostobj) != 0 { // Drop all the cgo_import_static declarations. // Turns out we won't be needing them. @@ -473,7 +459,23 @@ func (ctxt *Link) loadlib() { } } } + } + // Conditionally load host objects, or setup for external linking. + hostobjs(ctxt) + hostlinksetup(ctxt) + + if *flagNewobj { + // Add references of externally defined symbols. + ctxt.loader.LoadRefs(ctxt.Arch, ctxt.Syms) + } + + // Now that we know the link mode, set the dynexp list. + if !*flagNewobj { // set this later in newobj mode + setupdynexp(ctxt) + } + + if ctxt.LinkMode == LinkInternal && len(hostobj) != 0 { // If we have any undefined symbols in external // objects, try to read them from the libgcc file. any := false