From 8f9671d11a219d8fc9a6176ddf9939e743982ffc Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Tue, 13 Sep 2016 13:29:13 +1200 Subject: [PATCH] cmd/link: fix -buildmode=pie / -linkshared combination main.main and main.init were not being marked as reachable. Fixes #17076 Change-Id: Ib3e29bd35ba6252962e6ba89173ca321ed6849b9 Reviewed-on: https://go-review.googlesource.com/28996 Reviewed-by: David Crawshaw Run-TryBot: David Crawshaw TryBot-Result: Gobot Gobot --- misc/cgo/testshared/shared_test.go | 8 ++++++++ src/cmd/link/internal/ld/deadcode.go | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/misc/cgo/testshared/shared_test.go b/misc/cgo/testshared/shared_test.go index bb84ef8cab..af4f91550f 100644 --- a/misc/cgo/testshared/shared_test.go +++ b/misc/cgo/testshared/shared_test.go @@ -394,6 +394,14 @@ func TestTrivialExecutable(t *testing.T) { AssertHasRPath(t, "./bin/trivial", gorootInstallDir) } +// Build a trivial program in PIE mode that links against the shared runtime and check it runs. +func TestTrivialExecutablePIE(t *testing.T) { + goCmd(t, "build", "-buildmode=pie", "-o", "trivial.pie", "-linkshared", "trivial") + run(t, "trivial executable", "./trivial.pie") + AssertIsLinkedTo(t, "./trivial.pie", soname) + AssertHasRPath(t, "./trivial.pie", gorootInstallDir) +} + // Build an executable that uses cgo linked against the shared runtime and check it // runs. func TestCgoExecutable(t *testing.T) { diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go index c8aa6ee0ce..9f49cf2dfc 100644 --- a/src/cmd/link/internal/ld/deadcode.go +++ b/src/cmd/link/internal/ld/deadcode.go @@ -241,7 +241,7 @@ func (d *deadcodepass) init() { // In a normal binary, start at main.main and the init // functions and mark what is reachable from there. names = append(names, *flagEntrySymbol) - if *FlagLinkshared && Buildmode == BuildmodeExe { + if *FlagLinkshared && (Buildmode == BuildmodeExe || Buildmode == BuildmodePIE) { names = append(names, "main.main", "main.init") } for _, name := range markextra {