]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: process cgo_import_static before host object loading
authorCherry Zhang <cherryyz@google.com>
Thu, 31 Oct 2019 23:35:55 +0000 (19:35 -0400)
committerCherry Zhang <cherryyz@google.com>
Fri, 1 Nov 2019 03:40:20 +0000 (03:40 +0000)
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 <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/link/internal/ld/lib.go

index 679d44e8dda6f915640909c6410e1bc0e8f0b285..b882df29a11f70ac4ce922fdaca627725fc6a6cf 100644 (file)
@@ -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