]> Cypherpunks repositories - gostls13.git/commitdiff
Revert "cmd/link: fix GC data reading from shared library"
authorCherry Zhang <cherryyz@google.com>
Tue, 30 Jun 2020 19:09:38 +0000 (19:09 +0000)
committerAustin Clements <austin@google.com>
Tue, 30 Jun 2020 20:14:48 +0000 (20:14 +0000)
This reverts CL 240462.

Reason for revert: test fails on PPC64LE.

Updates #39927.

Change-Id: I4f14fd0c36e604a80ae9f2f86d1e643e28945e93
Reviewed-on: https://go-review.googlesource.com/c/go/+/240616
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
misc/cgo/testshared/shared_test.go
misc/cgo/testshared/testdata/gcdata/main/main.go [deleted file]
misc/cgo/testshared/testdata/gcdata/p/p.go [deleted file]
src/cmd/link/internal/ld/decodesym.go
src/cmd/link/internal/ld/lib.go

index f8dabbe7a01f2ced2c840375a37253a5f10abaff..fda3d2ce76fc15a583f4c76bc7be384589ec9257 100644 (file)
@@ -38,15 +38,7 @@ var testWork = flag.Bool("testwork", false, "if true, log and do not delete the
 
 // run runs a command and calls t.Errorf if it fails.
 func run(t *testing.T, msg string, args ...string) {
-       runWithEnv(t, msg, nil, args...)
-}
-
-// runWithEnv runs a command under the given environment and calls t.Errorf if it fails.
-func runWithEnv(t *testing.T, msg string, env []string, args ...string) {
        c := exec.Command(args[0], args[1:]...)
-       if len(env) != 0 {
-               c.Env = append(os.Environ(), env...)
-       }
        if output, err := c.CombinedOutput(); err != nil {
                t.Errorf("executing %s (%s) failed %s:\n%s", strings.Join(args, " "), msg, err, output)
        }
@@ -1042,11 +1034,3 @@ func TestGeneratedHash(t *testing.T) {
 func TestPackageOrder(t *testing.T) {
        goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue39777/a", "./issue39777/b")
 }
-
-// Test that GC data are generated correctly by the linker when it needs a type defined in
-// a shared library. See issue 39927.
-func TestGCData(t *testing.T) {
-       goCmd(t, "install", "-buildmode=shared", "-linkshared", "./gcdata/p")
-       goCmd(t, "build", "-linkshared", "./gcdata/main")
-       runWithEnv(t, "running gcdata/main", []string{"GODEBUG=clobberfree=1"}, "./main")
-}
diff --git a/misc/cgo/testshared/testdata/gcdata/main/main.go b/misc/cgo/testshared/testdata/gcdata/main/main.go
deleted file mode 100644 (file)
index 394862f..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test that GC data is generated correctly for global
-// variables with types defined in a shared library.
-// See issue 39927.
-
-// This test run under GODEBUG=clobberfree=1. The check
-// *x[i] == 12345 depends on this debug mode to clobber
-// the value if the object is freed prematurely.
-
-package main
-
-import (
-       "fmt"
-       "runtime"
-       "testshared/gcdata/p"
-)
-
-var x p.T
-
-func main() {
-       for i := range x {
-               x[i] = new(int)
-               *x[i] = 12345
-       }
-       runtime.GC()
-       runtime.GC()
-       runtime.GC()
-       for i := range x {
-               if *x[i] != 12345 {
-                       fmt.Printf("x[%d] == %d, want 12345\n", i, *x[i])
-                       panic("FAIL")
-               }
-       }
-}
diff --git a/misc/cgo/testshared/testdata/gcdata/p/p.go b/misc/cgo/testshared/testdata/gcdata/p/p.go
deleted file mode 100644 (file)
index 1fee754..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package p
-
-type T [10]*int
index 21bcc3a726a74d7be29bd2a62e52d70672ac9466..e9c87efe3796b75543f85a988e3a6d3dac55e208 100644 (file)
@@ -10,7 +10,6 @@ import (
        "cmd/link/internal/loader"
        "cmd/link/internal/sym"
        "debug/elf"
-       "log"
 )
 
 // Decoding the type.* symbols.         This has to be in sync with
@@ -230,15 +229,8 @@ func decodetypeGcmask(ctxt *Link, s loader.Sym) []byte {
                ptrdata := decodetypePtrdata(ctxt.Arch, symData)
                sect := findShlibSection(ctxt, ctxt.loader.SymPkg(s), addr)
                if sect != nil {
-                       bits := ptrdata / int64(ctxt.Arch.PtrSize)
-                       r := make([]byte, (bits+7)/8)
-                       // ldshlibsyms avoids closing the ELF file so sect.ReadAt works.
-                       // If we remove this read (and the ones in decodetypeGcprog), we
-                       // can close the file.
-                       _, err := sect.ReadAt(r, int64(addr-sect.Addr))
-                       if err != nil {
-                               log.Fatal(err)
-                       }
+                       r := make([]byte, ptrdata/int64(ctxt.Arch.PtrSize))
+                       sect.ReadAt(r, int64(addr-sect.Addr))
                        return r
                }
                Exitf("cannot find gcmask for %s", ctxt.loader.SymName(s))
@@ -259,15 +251,9 @@ func decodetypeGcprog(ctxt *Link, s loader.Sym) []byte {
                        // A gcprog is a 4-byte uint32 indicating length, followed by
                        // the actual program.
                        progsize := make([]byte, 4)
-                       _, err := sect.ReadAt(progsize, int64(addr-sect.Addr))
-                       if err != nil {
-                               log.Fatal(err)
-                       }
+                       sect.ReadAt(progsize, int64(addr-sect.Addr))
                        progbytes := make([]byte, ctxt.Arch.ByteOrder.Uint32(progsize))
-                       _, err = sect.ReadAt(progbytes, int64(addr-sect.Addr+4))
-                       if err != nil {
-                               log.Fatal(err)
-                       }
+                       sect.ReadAt(progbytes, int64(addr-sect.Addr+4))
                        return append(progsize, progbytes...)
                }
                Exitf("cannot find gcmask for %s", ctxt.loader.SymName(s))
@@ -282,7 +268,7 @@ func decodetypeGcprog(ctxt *Link, s loader.Sym) []byte {
 func findShlibSection(ctxt *Link, path string, addr uint64) *elf.Section {
        for _, shlib := range ctxt.Shlibs {
                if shlib.Path == path {
-                       for _, sect := range shlib.File.Sections[1:] { // skip the NULL section
+                       for _, sect := range shlib.File.Sections {
                                if sect.Addr <= addr && addr <= sect.Addr+sect.Size {
                                        return sect
                                }
@@ -293,5 +279,8 @@ func findShlibSection(ctxt *Link, path string, addr uint64) *elf.Section {
 }
 
 func decodetypeGcprogShlib(ctxt *Link, data []byte) uint64 {
+       if ctxt.Arch.Family == sys.ARM64 {
+               return 0
+       }
        return decodeInuxi(ctxt.Arch, data[2*int32(ctxt.Arch.PtrSize)+8+1*int32(ctxt.Arch.PtrSize):], ctxt.Arch.PtrSize)
 }
index 802bfb2b24e95bac1452e86564597d22a3292d3b..61ccc28a1d52904daec381805a01c25cc5949068 100644 (file)
@@ -2124,9 +2124,7 @@ func ldshlibsyms(ctxt *Link, shlib string) {
                Errorf(nil, "cannot open shared library: %s", libpath)
                return
        }
-       // Keep the file open as decodetypeGcprog needs to read from it.
-       // TODO: fix. Maybe mmap the file.
-       //defer f.Close()
+       defer f.Close()
 
        hash, err := readnote(f, ELF_NOTE_GO_NAME, ELF_NOTE_GOABIHASH_TAG)
        if err != nil {