| // 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 ld | |
| import ( | |
| "cmd/internal/objabi" | |
| "cmd/internal/sys" | |
| "cmd/link/internal/loader" | |
| "testing" | |
| ) | |
| func setUpContext(arch *sys.Arch, iself bool, ht objabi.HeadType, bm, lm string) *Link { | |
| ctxt := linknew(arch) | |
| edummy := func(str string, off int) {} | |
| ctxt.HeadType = ht | |
| er := loader.ErrorReporter{} | |
| ctxt.loader = loader.NewLoader(0, edummy, &er) | |
| ctxt.BuildMode.Set(bm) | |
| ctxt.LinkMode.Set(lm) | |
| ctxt.IsELF = iself | |
| ctxt.mustSetHeadType() | |
| ctxt.setArchSyms() | |
| return ctxt | |
| } | |
| // Make sure the addgotsym properly increases the symbols. | |
| func TestAddGotSym(t *testing.T) { | |
| tests := []struct { | |
| arch *sys.Arch | |
| ht objabi.HeadType | |
| bm, lm string | |
| rel string | |
| relsize int | |
| gotsize int | |
| }{ | |
| { | |
| arch: sys.Arch386, | |
| ht: objabi.Hlinux, | |
| bm: "pie", | |
| lm: "internal", | |
| rel: ".rel", | |
| relsize: 2 * sys.Arch386.PtrSize, | |
| gotsize: sys.Arch386.PtrSize, | |
| }, | |
| { | |
| arch: sys.ArchAMD64, | |
| ht: objabi.Hlinux, | |
| bm: "pie", | |
| lm: "internal", | |
| rel: ".rela", | |
| relsize: 3 * sys.ArchAMD64.PtrSize, | |
| gotsize: sys.ArchAMD64.PtrSize, | |
| }, | |
| { | |
| arch: sys.ArchAMD64, | |
| ht: objabi.Hdarwin, | |
| bm: "pie", | |
| lm: "external", | |
| gotsize: sys.ArchAMD64.PtrSize, | |
| }, | |
| } | |
| // Save the architecture as we're going to set it on each test run. | |
| origArch := objabi.GOARCH | |
| defer func() { | |
| objabi.GOARCH = origArch | |
| }() | |
| for i, test := range tests { | |
| iself := len(test.rel) != 0 | |
| objabi.GOARCH = test.arch.Name | |
| ctxt := setUpContext(test.arch, iself, test.ht, test.bm, test.lm) | |
| foo := ctxt.loader.CreateSymForUpdate("foo", 0) | |
| ctxt.loader.CreateExtSym("bar", 0) | |
| AddGotSym(&ctxt.Target, ctxt.loader, &ctxt.ArchSyms, foo.Sym(), 0) | |
| if iself { | |
| rel := ctxt.loader.Lookup(test.rel, 0) | |
| if rel == 0 { | |
| t.Fatalf("[%d] could not find symbol: %q", i, test.rel) | |
| } | |
| if s := ctxt.loader.SymSize(rel); s != int64(test.relsize) { | |
| t.Fatalf("[%d] expected ldr.Size(%q) == %v, got %v", i, test.rel, test.relsize, s) | |
| } | |
| } | |
| if s := ctxt.loader.SymSize(ctxt.loader.Lookup(".got", 0)); s != int64(test.gotsize) { | |
| t.Fatalf(`[%d] expected ldr.Size(".got") == %v, got %v`, i, test.gotsize, s) | |
| } | |
| } | |
| } |