mirror of https://github.com/golang/go.git
93 lines
2.3 KiB
Go
93 lines
2.3 KiB
Go
// 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)
|
|
}
|
|
}
|
|
}
|