Skip to content

Commit 89abef2

Browse files
committed
use internal linker explicitly
1 parent 771f575 commit 89abef2

File tree

1 file changed

+66
-61
lines changed

1 file changed

+66
-61
lines changed

src/cmd/link/internal/ld/elf_test.go

+66-61
Original file line numberDiff line numberDiff line change
@@ -189,30 +189,37 @@ func TestElfBindNow(t *testing.T) {
189189
testenv.MustHaveGoBuild(t)
190190
testenv.MustInternalLink(t, false)
191191

192-
const prog = `package main; import _ "net"; func main() {}`
192+
const (
193+
prog = `package main; func main() {}`
194+
prog_C = `package main; import "C"; func main() {}`
195+
)
193196

194197
tests := []struct {
195198
name string
196199
args []string
200+
prog string
197201
wantDf1Now bool
198202
wantDf1Pie bool
199203
wantDfBindNow bool
200204
}{
201-
{name: "default"},
205+
{name: "default", prog: prog},
202206
{
203207
name: "pie",
204-
args: []string{"-buildmode=pie"},
208+
args: []string{"-buildmode=pie", "-ldflags", "-linkmode=internal"},
209+
prog: prog,
205210
wantDf1Pie: true,
206211
},
207212
{
208213
name: "bindnow",
209-
args: []string{"-ldflags", "-bindnow"},
214+
args: []string{"-ldflags", "-bindnow -linkmode=internal"},
215+
prog: prog_C,
210216
wantDf1Now: true,
211217
wantDfBindNow: true,
212218
},
213219
{
214220
name: "bindnow-pie",
215-
args: []string{"-buildmode=pie", "-ldflags", "-bindnow"},
221+
args: []string{"-buildmode=pie", "-ldflags", "-bindnow -linkmode=internal"},
222+
prog: prog,
216223
wantDf1Now: true,
217224
wantDf1Pie: true,
218225
wantDfBindNow: true,
@@ -230,61 +237,59 @@ func TestElfBindNow(t *testing.T) {
230237
}
231238

232239
for _, test := range tests {
233-
t.Run(
234-
test.name, func(t *testing.T) {
235-
var (
236-
gotDfBindNow, gotDf1Now, gotDf1Pie bool
237-
238-
dir = t.TempDir()
239-
src = filepath.Join(dir, fmt.Sprintf("elf_%s.go", test.name))
240-
binFile = filepath.Join(dir, test.name)
241-
)
242-
243-
if err := os.WriteFile(src, []byte(prog), 0666); err != nil {
244-
t.Fatal(err)
245-
}
246-
247-
cmdArgs := append([]string{"build", "-o", binFile}, append(test.args, src)...)
248-
cmd := testenv.Command(t, testenv.GoToolPath(t), cmdArgs...)
249-
250-
if out, err := cmd.CombinedOutput(); err != nil {
251-
t.Fatalf("%v: %v:\n%s", cmd.Args, err, out)
252-
}
253-
254-
fi, err := os.Open(binFile)
255-
if err != nil {
256-
t.Fatalf("failed to open built file: %v", err)
257-
}
258-
defer fi.Close()
259-
260-
elfFile, err := elf.NewFile(fi)
261-
if err != nil {
262-
t.Skip("The system may not support ELF, skipped.")
263-
}
264-
defer elfFile.Close()
265-
266-
flags, err := elfFile.DynValue(elf.DT_FLAGS)
267-
if err != nil {
268-
t.Fatalf("failed to get DT_FLAGS: %v", err)
269-
}
270-
271-
flags1, err := elfFile.DynValue(elf.DT_FLAGS_1)
272-
if err != nil {
273-
t.Fatalf("failed to get DT_FLAGS_1: %v", err)
274-
}
275-
276-
if gotDfBindNow = gotDynFlag(flags, uint64(elf.DF_BIND_NOW)); gotDfBindNow != test.wantDfBindNow {
277-
t.Fatalf("DT_FLAGS BIND_NOW flag is %v, want: %v", gotDfBindNow, test.wantDfBindNow)
278-
}
279-
280-
if gotDf1Now = gotDynFlag(flags1, uint64(elf.DF_1_NOW)); gotDf1Now != test.wantDf1Now {
281-
t.Fatalf("DT_FLAGS_1 DF_1_NOW flag is %v, want: %v", gotDf1Now, test.wantDf1Now)
282-
}
283-
284-
if gotDf1Pie = gotDynFlag(flags1, uint64(elf.DF_1_PIE)); gotDf1Pie != test.wantDf1Pie {
285-
t.Fatalf("DT_FLAGS_1 DF_1_PIE flag is %v, want: %v", gotDf1Pie, test.wantDf1Pie)
286-
}
287-
},
288-
)
240+
t.Run(test.name, func(t *testing.T) {
241+
var (
242+
gotDfBindNow, gotDf1Now, gotDf1Pie bool
243+
244+
dir = t.TempDir()
245+
src = filepath.Join(dir, fmt.Sprintf("elf_%s.go", test.name))
246+
binFile = filepath.Join(dir, test.name)
247+
)
248+
249+
if err := os.WriteFile(src, []byte(test.prog), 0666); err != nil {
250+
t.Fatal(err)
251+
}
252+
253+
cmdArgs := append([]string{"build", "-o", binFile}, append(test.args, src)...)
254+
cmd := testenv.Command(t, testenv.GoToolPath(t), cmdArgs...)
255+
256+
if out, err := cmd.CombinedOutput(); err != nil {
257+
t.Fatalf("failed to build %v: %v:\n%s", cmd.Args, err, out)
258+
}
259+
260+
fi, err := os.Open(binFile)
261+
if err != nil {
262+
t.Fatalf("failed to open built file: %v", err)
263+
}
264+
defer fi.Close()
265+
266+
elfFile, err := elf.NewFile(fi)
267+
if err != nil {
268+
t.Skip("The system may not support ELF, skipped.")
269+
}
270+
defer elfFile.Close()
271+
272+
flags, err := elfFile.DynValue(elf.DT_FLAGS)
273+
if err != nil {
274+
t.Fatalf("failed to get DT_FLAGS: %v", err)
275+
}
276+
277+
flags1, err := elfFile.DynValue(elf.DT_FLAGS_1)
278+
if err != nil {
279+
t.Fatalf("failed to get DT_FLAGS_1: %v", err)
280+
}
281+
282+
if gotDfBindNow = gotDynFlag(flags, uint64(elf.DF_BIND_NOW)); gotDfBindNow != test.wantDfBindNow {
283+
t.Fatalf("DT_FLAGS BIND_NOW flag is %v, want: %v", gotDfBindNow, test.wantDfBindNow)
284+
}
285+
286+
if gotDf1Now = gotDynFlag(flags1, uint64(elf.DF_1_NOW)); gotDf1Now != test.wantDf1Now {
287+
t.Fatalf("DT_FLAGS_1 DF_1_NOW flag is %v, want: %v", gotDf1Now, test.wantDf1Now)
288+
}
289+
290+
if gotDf1Pie = gotDynFlag(flags1, uint64(elf.DF_1_PIE)); gotDf1Pie != test.wantDf1Pie {
291+
t.Fatalf("DT_FLAGS_1 DF_1_PIE flag is %v, want: %v", gotDf1Pie, test.wantDf1Pie)
292+
}
293+
})
289294
}
290295
}

0 commit comments

Comments
 (0)