Skip to content

Commit 20ab0e5

Browse files
committed
cmd/link: support full relro
Most Linux distributions today enable PIE and full RELRO on all binaries to make exploitation harder. When buildmode=pie is used we enable full relro as that is probably what most people want regardless. This introduces a negligible startup time for binaries. https://fedoraproject.org/wiki/Changes/Harden_All_Packages https://www.redhat.com/en/blog/hardening-elf-binaries-using-relocation-read-only-relro Related #44480
1 parent 7e97e4e commit 20ab0e5

File tree

5 files changed

+22
-5
lines changed

5 files changed

+22
-5
lines changed

src/cmd/go/internal/work/security.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ var validLinkerFlags = []*lazyregexp.Regexp{
206206
re(`-Wl,--(no-)?warn-([^,]+)`),
207207
re(`-Wl,-?-wrap[=,][^,@\-][^,]*`),
208208
re(`-Wl,-z,(no)?execstack`),
209-
re(`-Wl,-z,relro`),
209+
re(`-Wl,-z,relro(,-z,now)?`),
210210

211211
re(`[a-zA-Z0-9_/].*\.(a|o|obj|dll|dylib|so)`), // direct linker inputs: x.o or libfoo.so (but not -foo.o or @foo.o)
212212
re(`\./.*\.(a|o|obj|dll|dylib|so)`),

src/cmd/go/internal/work/security_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ var goodLinkerFlags = [][]string{
149149
{"-Wl,--just-symbols,foo"},
150150
{"-Wl,--warn-error"},
151151
{"-Wl,--no-warn-error"},
152+
{"-Wl,-z,relro"},
153+
{"-Wl,-z,relro,-z,now"},
152154
{"foo.so"},
153155
{"_世界.dll"},
154156
{"./x.o"},
@@ -224,6 +226,7 @@ var badLinkerFlags = [][]string{
224226
{"-Wl,-R,foo,bar"},
225227
{"-Wl,-R,@foo"},
226228
{"-Wl,--just-symbols,@foo"},
229+
{"-Wl,-z,relro,-z,nottoday"},
227230
{"../x.o"},
228231
}
229232

src/cmd/link/doc.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ Flags:
8585
instead of $GOROOT/pkg/$GOOS_$GOARCH.
8686
-k symbol
8787
Set field tracking symbol. Use this flag when GOEXPERIMENT=fieldtrack is set.
88+
-l
89+
Disable Full RELRO.
8890
-libgcc file
8991
Set name of compiler support library.
9092
This is only used in internal link mode.

src/cmd/link/internal/ld/lib.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1299,6 +1299,17 @@ func (ctxt *Link) hostlink() {
12991299
return argv
13001300
}
13011301

1302+
// Enables Full/Partial RELRO.
1303+
addRELROargs := func(argv []string) []string {
1304+
relro := "-Wl,-z,relro"
1305+
// Enable Full RELRO
1306+
if !*FlagL {
1307+
relro += ",-z,now"
1308+
}
1309+
argv = append(argv, relro)
1310+
return argv
1311+
}
1312+
13021313
switch ctxt.BuildMode {
13031314
case BuildModeExe:
13041315
if ctxt.HeadType == objabi.Hdarwin {
@@ -1315,7 +1326,7 @@ func (ctxt *Link) hostlink() {
13151326
default:
13161327
// ELF.
13171328
if ctxt.UseRelro() {
1318-
argv = append(argv, "-Wl,-z,relro")
1329+
argv = addRELROargs(argv)
13191330
}
13201331
argv = append(argv, "-pie")
13211332
}
@@ -1324,7 +1335,7 @@ func (ctxt *Link) hostlink() {
13241335
argv = append(argv, "-dynamiclib")
13251336
} else {
13261337
if ctxt.UseRelro() {
1327-
argv = append(argv, "-Wl,-z,relro")
1338+
argv = addRELROargs(argv)
13281339
}
13291340
argv = append(argv, "-shared")
13301341
if ctxt.HeadType == objabi.Hwindows {
@@ -1341,15 +1352,15 @@ func (ctxt *Link) hostlink() {
13411352
}
13421353
case BuildModeShared:
13431354
if ctxt.UseRelro() {
1344-
argv = append(argv, "-Wl,-z,relro")
1355+
argv = addRELROargs(argv)
13451356
}
13461357
argv = append(argv, "-shared")
13471358
case BuildModePlugin:
13481359
if ctxt.HeadType == objabi.Hdarwin {
13491360
argv = append(argv, "-dynamiclib")
13501361
} else {
13511362
if ctxt.UseRelro() {
1352-
argv = append(argv, "-Wl,-z,relro")
1363+
argv = addRELROargs(argv)
13531364
}
13541365
argv = append(argv, "-shared")
13551366
}

src/cmd/link/internal/ld/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ var (
8585
flagN = flag.Bool("n", false, "dump symbol table")
8686
FlagS = flag.Bool("s", false, "disable symbol table")
8787
FlagW = flag.Bool("w", false, "disable DWARF generation")
88+
FlagL = flag.Bool("l", false, "disable full RELRO")
8889
flag8 bool // use 64-bit addresses in symbol table
8990
flagInterpreter = flag.String("I", "", "use `linker` as ELF dynamic linker")
9091
FlagDebugTramp = flag.Int("debugtramp", 0, "debug trampolines")

0 commit comments

Comments
 (0)