// +build cgo // Copyright 2019 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 ld import ( "debug/elf" "internal/testenv" "io/ioutil" "os" "os/exec" "path/filepath" "testing" ) func TestDynSymShInfo(t *testing.T) { t.Parallel() testenv.MustHaveGoBuild(t) dir, err := ioutil.TempDir("", "go-build-issue33358") if err != nil { t.Fatal(err) } defer os.RemoveAll(dir) const prog = ` package main import "net" func main() { net.Dial("", "") } ` src := filepath.Join(dir, "issue33358.go") if err := ioutil.WriteFile(src, []byte(prog), 0666); err != nil { t.Fatal(err) } binFile := filepath.Join(dir, "issue33358") cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", binFile, src) if out, err := cmd.CombinedOutput(); err != nil { t.Fatalf("%v: %v:\n%s", cmd.Args, err, out) } fi, err := os.Open(binFile) if err != nil { t.Fatalf("failed to open built file: %v", err) } elfFile, err := elf.NewFile(fi) if err != nil { t.Skip("The system may not support ELF, skipped.") } section := elfFile.Section(".dynsym") if section == nil { t.Fatal("no dynsym") } symbols, err := elfFile.DynamicSymbols() if err != nil { t.Fatalf("failed to get dynamic symbols: %v", err) } var numLocalSymbols uint32 for i, s := range symbols { if elf.ST_BIND(s.Info) != elf.STB_LOCAL { numLocalSymbols = uint32(i + 1) break } } if section.Info != numLocalSymbols { t.Fatalf("Unexpected sh info, want greater than 0, got: %d", section.Info) } }