aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/link')
-rw-r--r--src/cmd/link/elf_test.go6
-rw-r--r--src/cmd/link/internal/ld/deadcode.go16
-rw-r--r--src/cmd/link/internal/ld/decodesym.go2
3 files changed, 17 insertions, 7 deletions
diff --git a/src/cmd/link/elf_test.go b/src/cmd/link/elf_test.go
index 334f050e88..20754d09f5 100644
--- a/src/cmd/link/elf_test.go
+++ b/src/cmd/link/elf_test.go
@@ -226,6 +226,12 @@ func main() {
func TestPIESize(t *testing.T) {
testenv.MustHaveGoBuild(t)
+
+ // We don't want to test -linkmode=external if cgo is not supported.
+ // On some systems -buildmode=pie implies -linkmode=external, so just
+ // always skip the test if cgo is not supported.
+ testenv.MustHaveCGO(t)
+
if !sys.BuildModeSupported(runtime.Compiler, "pie", runtime.GOOS, runtime.GOARCH) {
t.Skip("-buildmode=pie not supported")
}
diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go
index d8813fa936..245076a83a 100644
--- a/src/cmd/link/internal/ld/deadcode.go
+++ b/src/cmd/link/internal/ld/deadcode.go
@@ -165,13 +165,17 @@ func (d *deadcodePass) flood() {
// R_USEIFACEMETHOD is a marker relocation that marks an interface
// method as used.
rs := r.Sym()
- if d.ldr.SymType(rs) != sym.SDYNIMPORT { // don't decode DYNIMPORT symbol (we'll mark all exported methods anyway)
- m := d.decodeIfaceMethod(d.ldr, d.ctxt.Arch, rs, r.Add())
- if d.ctxt.Debugvlog > 1 {
- d.ctxt.Logf("reached iface method: %v\n", m)
- }
- d.ifaceMethod[m] = true
+ if d.ctxt.linkShared && (d.ldr.SymType(rs) == sym.SDYNIMPORT || d.ldr.SymType(rs) == sym.Sxxx) {
+ // Don't decode symbol from shared library (we'll mark all exported methods anyway).
+ // We check for both SDYNIMPORT and Sxxx because name-mangled symbols haven't
+ // been resolved at this point.
+ continue
+ }
+ m := d.decodeIfaceMethod(d.ldr, d.ctxt.Arch, rs, r.Add())
+ if d.ctxt.Debugvlog > 1 {
+ d.ctxt.Logf("reached iface method: %v\n", m)
}
+ d.ifaceMethod[m] = true
continue
}
rs := r.Sym()
diff --git a/src/cmd/link/internal/ld/decodesym.go b/src/cmd/link/internal/ld/decodesym.go
index c6e2d8ca7f..fc179fc6e4 100644
--- a/src/cmd/link/internal/ld/decodesym.go
+++ b/src/cmd/link/internal/ld/decodesym.go
@@ -279,7 +279,7 @@ func findShlibSection(ctxt *Link, path string, addr uint64) *elf.Section {
for _, shlib := range ctxt.Shlibs {
if shlib.Path == path {
for _, sect := range shlib.File.Sections[1:] { // skip the NULL section
- if sect.Addr <= addr && addr <= sect.Addr+sect.Size {
+ if sect.Addr <= addr && addr < sect.Addr+sect.Size {
return sect
}
}