diff options
author | Quim Muntal <quimmuntal@gmail.com> | 2020-10-22 22:32:20 +0200 |
---|---|---|
committer | Austin Clements <austin@google.com> | 2020-11-02 00:46:44 +0000 |
commit | e463c28cc116fb1f40a4e203bddf93b6ef52c8d9 (patch) | |
tree | c95ad0a618c0fd9882d4e2cc9914ec5cc7c73813 /src/runtime/cgo | |
parent | 333d2010ec98aaea244b65b7bc4d7d80c71e21b1 (diff) | |
download | go-e463c28cc116fb1f40a4e203bddf93b6ef52c8d9.tar.gz go-e463c28cc116fb1f40a4e203bddf93b6ef52c8d9.zip |
cmd/link: avoid exporting all symbols on windows buildmode=pie
Marking one functions with __declspec(dllexport) forces mingw to
create .reloc section without having to export all symbols.
See https://insights.sei.cmu.edu/cert/2018/08/when-aslr-is-not-really-aslr---the-case-of-incorrect-assumptions-and-bad-defaults.html for more info.
This change cuts 73kb of a "hello world" pie binary.
Updates #6853
Fixes #40795
Change-Id: I3cc57c3b64f61187550bc8751dfa085f106c8475
Reviewed-on: https://go-review.googlesource.com/c/go/+/264459
Trust: Alex Brainman <alex.brainman@gmail.com>
Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'src/runtime/cgo')
-rw-r--r-- | src/runtime/cgo/gcc_windows_386.c | 1 | ||||
-rw-r--r-- | src/runtime/cgo/gcc_windows_amd64.c | 1 | ||||
-rw-r--r-- | src/runtime/cgo/libcgo_windows.h | 12 |
3 files changed, 14 insertions, 0 deletions
diff --git a/src/runtime/cgo/gcc_windows_386.c b/src/runtime/cgo/gcc_windows_386.c index 9184b91393..60cb011bf2 100644 --- a/src/runtime/cgo/gcc_windows_386.c +++ b/src/runtime/cgo/gcc_windows_386.c @@ -9,6 +9,7 @@ #include <stdio.h> #include <errno.h> #include "libcgo.h" +#include "libcgo_windows.h" static void threadentry(void*); diff --git a/src/runtime/cgo/gcc_windows_amd64.c b/src/runtime/cgo/gcc_windows_amd64.c index 7192a24631..0f8c817f0e 100644 --- a/src/runtime/cgo/gcc_windows_amd64.c +++ b/src/runtime/cgo/gcc_windows_amd64.c @@ -9,6 +9,7 @@ #include <stdio.h> #include <errno.h> #include "libcgo.h" +#include "libcgo_windows.h" static void threadentry(void*); diff --git a/src/runtime/cgo/libcgo_windows.h b/src/runtime/cgo/libcgo_windows.h new file mode 100644 index 0000000000..0013f06bae --- /dev/null +++ b/src/runtime/cgo/libcgo_windows.h @@ -0,0 +1,12 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Ensure there's one symbol marked __declspec(dllexport). +// If there are no exported symbols, the unfortunate behavior of +// the binutils linker is to also strip the relocations table, +// resulting in non-PIE binary. The other option is the +// --export-all-symbols flag, but we don't need to export all symbols +// and this may overflow the export table (#40795). +// See https://sourceware.org/bugzilla/show_bug.cgi?id=19011 +__declspec(dllexport) int _cgo_dummy_export; |