package ld
import (
+ "bytes"
"debug/pe"
"fmt"
"internal/testenv"
// is arbitrary; we just need something sufficiently large that uses
// external linking.
exe := filepath.Join(dir, "go.exe")
- out, eerr := exec.Command(testenv.GoToolPath(t), "build", "-o", exe, "-ldflags=-linkmode=external -debugtextsize=1048576", "cmd/go").CombinedOutput()
- if eerr != nil {
- t.Fatalf("build failure: %s\n%s\n", eerr, string(out))
+ out, err := exec.Command(testenv.GoToolPath(t), "build", "-o", exe, "-ldflags=-linkmode=external -debugtextsize=1048576", "cmd/go").CombinedOutput()
+ if err != nil {
+ t.Fatalf("build failure: %s\n%s\n", err, string(out))
+ }
+
+ // Check that we did split text sections.
+ out, err = exec.Command(testenv.GoToolPath(t), "tool", "nm", exe).CombinedOutput()
+ if err != nil {
+ t.Fatalf("nm failure: %s\n%s\n", err, string(out))
+ }
+ if !bytes.Contains(out, []byte("runtime.text.1")) {
+ t.Errorf("runtime.text.1 not found, text section not split?")
}
// Result should be runnable.
- _, err := exec.Command(exe, "version").CombinedOutput()
+ _, err = exec.Command(exe, "version").CombinedOutput()
if err != nil {
t.Fatal(err)
}
if ldr.SymType(s) == sym.STEXT {
addsym(s)
}
+ for n := range Segtext.Sections[1:] {
+ s := ldr.Lookup(fmt.Sprintf("runtime.text.%d", n+1), 0)
+ if s != 0 {
+ addsym(s)
+ } else {
+ break
+ }
+ }
s = ldr.Lookup("runtime.etext", 0)
if ldr.SymType(s) == sym.STEXT {
addsym(s)