diff --git a/src/cmd/link/doc.go b/src/cmd/link/doc.go index a5701327141ecb..4678a6c82c7b51 100644 --- a/src/cmd/link/doc.go +++ b/src/cmd/link/doc.go @@ -87,6 +87,9 @@ Flags: instead of $GOROOT/pkg/$GOOS_$GOARCH. -k symbol Set field tracking symbol. Use this flag when GOEXPERIMENT=fieldtrack is set. + -bindnow + When linking externally and marking variables read-only after relocation, also require + immediate function binding (default true) -libgcc file Set name of compiler support library. This is only used in internal link mode. diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 04b2556ea1ecb6..4d3d8c3edce215 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1404,6 +1404,17 @@ func (ctxt *Link) hostlink() { return argv } + // Enables Full/Partial RELRO. + addRELROargs := func(argv []string) []string { + relro := "-Wl,-z,relro" + // Enable Full RELRO + if *FlagBindNow { + relro += ",-z,now" + } + argv = append(argv, relro) + return argv + } + switch ctxt.BuildMode { case BuildModeExe: if ctxt.HeadType == objabi.Hdarwin { @@ -1420,7 +1431,7 @@ func (ctxt *Link) hostlink() { default: // ELF. if ctxt.UseRelro() { - argv = append(argv, "-Wl,-z,relro") + argv = addRELROargs(argv) } argv = append(argv, "-pie") } @@ -1429,7 +1440,7 @@ func (ctxt *Link) hostlink() { argv = append(argv, "-dynamiclib") } else { if ctxt.UseRelro() { - argv = append(argv, "-Wl,-z,relro") + argv = addRELROargs(argv) } argv = append(argv, "-shared") if ctxt.HeadType == objabi.Hwindows { @@ -1444,7 +1455,7 @@ func (ctxt *Link) hostlink() { } case BuildModeShared: if ctxt.UseRelro() { - argv = append(argv, "-Wl,-z,relro") + argv = addRELROargs(argv) } argv = append(argv, "-shared") case BuildModePlugin: @@ -1452,7 +1463,7 @@ func (ctxt *Link) hostlink() { argv = append(argv, "-dynamiclib") } else { if ctxt.UseRelro() { - argv = append(argv, "-Wl,-z,relro") + argv = addRELROargs(argv) } argv = append(argv, "-shared") } diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index c52e6e909d8476..2f3c613d3040cf 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -95,6 +95,7 @@ var ( FlagDebugTextSize = flag.Int("debugtextsize", 0, "debug text section max size") flagDebugNosplit = flag.Bool("debugnosplit", false, "dump nosplit call graph") FlagStrictDups = flag.Int("strictdups", 0, "sanity check duplicate symbol contents during object file reading (1=warn 2=err).") + FlagBindNow = flag.Bool("bindnow", true, "bind function calls when linking externally") FlagRound = flag.Int("R", -1, "set address rounding `quantum`") FlagTextAddr = flag.Int64("T", -1, "set text segment `address`") flagEntrySymbol = flag.String("E", "", "set `entry` symbol name")