]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: ensure external test files are presented to the linker first
authorDave Cheney <dave@cheney.net>
Wed, 26 Mar 2014 04:30:55 +0000 (15:30 +1100)
committerDave Cheney <dave@cheney.net>
Wed, 26 Mar 2014 04:30:55 +0000 (15:30 +1100)
Fixes #7627.

CL 61970044 changed the order in which .a files are passed to gccgo's link phase. However by reversing the order it caused gccgo to complain if both internal (liba.a) and external (liba_test.a) versions of a package were presented as the former would not contain all the necessary symbols, and the latter would duplicate symbols already defined.

This change ensures that all 'fake' targets remain at the top of the final link order which should be fine as a package compiled as an external test is a superset of its internal sibling.

Looking at how gcToolchain links tests I think this change now accurately mirrors those actions which present $WORK/_test before $WORK in the link order.

LGTM=iant
R=rsc, iant
CC=golang-codereviews, michael.hudson
https://golang.org/cl/80300043

src/cmd/go/build.go

index 08d322daee45ecb240f36c3123f9466b11aa81fc..6166410c6e0c7f73cf0de29ff0c27970cf8fc235 100644 (file)
@@ -1867,7 +1867,12 @@ func (tools gccgoToolchain) ld(b *builder, p *Package, out string, allactions []
                if !a.p.Standard {
                        if a.p != nil && !apackagesSeen[a.p] {
                                apackagesSeen[a.p] = true
-                               afiles = append(afiles, a.target)
+                               if a.p.fake {
+                                       // move _test files to the top of the link order
+                                       afiles = append([]string{a.target}, afiles...)
+                               } else {
+                                       afiles = append(afiles, a.target)
+                               }
                        }
                }
        }