1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
// 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.
//go:build cgo
// +build cgo
package ld
import (
"debug/elf"
"internal/testenv"
"os"
"path/filepath"
"runtime"
"strings"
"testing"
)
func TestDynSymShInfo(t *testing.T) {
t.Parallel()
testenv.MustHaveGoBuild(t)
dir := t.TempDir()
const prog = `
package main
import "net"
func main() {
net.Dial("", "")
}
`
src := filepath.Join(dir, "issue33358.go")
if err := os.WriteFile(src, []byte(prog), 0666); err != nil {
t.Fatal(err)
}
binFile := filepath.Join(dir, "issue33358")
cmd := testenv.Command(t, 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)
}
defer fi.Close()
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)
}
}
func TestNoDuplicateNeededEntries(t *testing.T) {
testenv.MustHaveGoBuild(t)
testenv.MustHaveCGO(t)
// run this test on just a small set of platforms (no need to test it
// across the board given the nature of the test).
pair := runtime.GOOS + "-" + runtime.GOARCH
switch pair {
case "linux-amd64", "linux-arm64", "freebsd-amd64", "openbsd-amd64":
default:
t.Skip("no need for test on " + pair)
}
t.Parallel()
dir := t.TempDir()
wd, err := os.Getwd()
if err != nil {
t.Fatalf("Failed to get working directory: %v", err)
}
path := filepath.Join(dir, "x")
argv := []string{"build", "-o", path, filepath.Join(wd, "testdata", "issue39256")}
out, err := testenv.Command(t, testenv.GoToolPath(t), argv...).CombinedOutput()
if err != nil {
t.Fatalf("Build failure: %s\n%s\n", err, string(out))
}
f, err := elf.Open(path)
if err != nil {
t.Fatalf("Failed to open ELF file: %v", err)
}
libs, err := f.ImportedLibraries()
if err != nil {
t.Fatalf("Failed to read imported libraries: %v", err)
}
var count int
for _, lib := range libs {
if lib == "libc.so" || strings.HasPrefix(lib, "libc.so.") {
count++
}
}
if got, want := count, 1; got != want {
t.Errorf("Got %d entries for `libc.so`, want %d", got, want)
}
}
|