| // 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" |
| "internal/buildcfg" |
| "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 := buildcfg.GOARCH |
| defer func() { |
| buildcfg.GOARCH = origArch |
| }() |
| |
| for i, test := range tests { |
| iself := len(test.rel) != 0 |
| buildcfg.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) |
| } |
| } |
| } |