@@ -1221,6 +1221,11 @@ func (ctxt *Link) hostlink() {
1221
1221
argv = append (argv , "-Qunused-arguments" )
1222
1222
}
1223
1223
1224
+ const compressDWARF = "-Wl,--compress-debug-sections=zlib-gnu"
1225
+ if linkerFlagSupported (argv [0 ], compressDWARF ) {
1226
+ argv = append (argv , compressDWARF )
1227
+ }
1228
+
1224
1229
argv = append (argv , filepath .Join (* flagTmpdir , "go.o" ))
1225
1230
argv = append (argv , hostobjCopy ()... )
1226
1231
@@ -1267,21 +1272,9 @@ func (ctxt *Link) hostlink() {
1267
1272
// issue #17847. To avoid this problem pass -no-pie to the
1268
1273
// toolchain if it is supported.
1269
1274
if ctxt .BuildMode == BuildModeExe && ! ctxt .linkShared {
1270
- src := filepath .Join (* flagTmpdir , "trivial.c" )
1271
- if err := ioutil .WriteFile (src , []byte ("int main() { return 0; }" ), 0666 ); err != nil {
1272
- Errorf (nil , "WriteFile trivial.c failed: %v" , err )
1273
- }
1274
-
1275
1275
// GCC uses -no-pie, clang uses -nopie.
1276
1276
for _ , nopie := range []string {"-no-pie" , "-nopie" } {
1277
- cmd := exec .Command (argv [0 ], nopie , "trivial.c" )
1278
- cmd .Dir = * flagTmpdir
1279
- cmd .Env = append ([]string {"LC_ALL=C" }, os .Environ ()... )
1280
- out , err := cmd .CombinedOutput ()
1281
- // GCC says "unrecognized command line option ‘-no-pie’"
1282
- // clang says "unknown argument: '-no-pie'"
1283
- supported := err == nil && ! bytes .Contains (out , []byte ("unrecognized" )) && ! bytes .Contains (out , []byte ("unknown" ))
1284
- if supported {
1277
+ if linkerFlagSupported (argv [0 ], nopie ) {
1285
1278
argv = append (argv , nopie )
1286
1279
break
1287
1280
}
@@ -1356,6 +1349,25 @@ func (ctxt *Link) hostlink() {
1356
1349
}
1357
1350
}
1358
1351
1352
+ var createTrivialCOnce sync.Once
1353
+
1354
+ func linkerFlagSupported (linker , flag string ) bool {
1355
+ createTrivialCOnce .Do (func () {
1356
+ src := filepath .Join (* flagTmpdir , "trivial.c" )
1357
+ if err := ioutil .WriteFile (src , []byte ("int main() { return 0; }" ), 0666 ); err != nil {
1358
+ Errorf (nil , "WriteFile trivial.c failed: %v" , err )
1359
+ }
1360
+ })
1361
+
1362
+ cmd := exec .Command (linker , flag , "trivial.c" )
1363
+ cmd .Dir = * flagTmpdir
1364
+ cmd .Env = append ([]string {"LC_ALL=C" }, os .Environ ()... )
1365
+ out , err := cmd .CombinedOutput ()
1366
+ // GCC says "unrecognized command line option ‘-no-pie’"
1367
+ // clang says "unknown argument: '-no-pie'"
1368
+ return err == nil && ! bytes .Contains (out , []byte ("unrecognized" )) && ! bytes .Contains (out , []byte ("unknown" ))
1369
+ }
1370
+
1359
1371
// hostlinkArchArgs returns arguments to pass to the external linker
1360
1372
// based on the architecture.
1361
1373
func hostlinkArchArgs (arch * sys.Arch ) []string {
0 commit comments