]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: permit linker flag -Wl,--push-state,--as-needed
authorIan Lance Taylor <iant@golang.org>
Fri, 25 Oct 2024 00:40:32 +0000 (17:40 -0700)
committerGopher Robot <gobot@golang.org>
Fri, 1 Nov 2024 23:26:54 +0000 (23:26 +0000)
Fixes #70023

Change-Id: Ibac9c242f52a605e5fc307bdcaedb359bc2b1de9
Reviewed-on: https://go-review.googlesource.com/c/go/+/622238
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
Reviewed-by: Michael Matloob <matloob@golang.org>
Auto-Submit: Ian Lance Taylor <iant@golang.org>

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

index 957fad1b40b6ce747fa23929ab3b423a4ceb8bda..e48dffdb7fdf4fe93b3f34cdfe707a229921928e 100644 (file)
@@ -205,6 +205,8 @@ var validLinkerFlags = []*lazyregexp.Regexp{
        re(`-Wl,--hash-style=(sysv|gnu|both)`),
        re(`-Wl,-headerpad_max_install_names`),
        re(`-Wl,--no-undefined`),
+       re(`-Wl,--pop-state`),
+       re(`-Wl,--push-state`),
        re(`-Wl,-R,?([^@\-,][^,@]*$)`),
        re(`-Wl,--just-symbols[=,]([^,@\-][^,@]+)`),
        re(`-Wl,-rpath(-link)?[=,]([^,@\-][^,]+)`),
@@ -308,7 +310,31 @@ Args:
                        }
                }
                for _, re := range valid {
-                       if re.FindString(arg) == arg { // must be complete match
+                       if match := re.FindString(arg); match == arg { // must be complete match
+                               continue Args
+                       } else if match == "-Wl,--push-state" {
+                               // Examples for --push-state are written
+                               //     -Wl,--push-state,--as-needed
+                               // Support other commands in the same -Wl arg.
+                               args := strings.Split(arg, ",")
+                               for _, a := range args[1:] {
+                                       a = "-Wl," + a
+                                       var found bool
+                                       for _, re := range valid {
+                                               if re.FindString(a) == a {
+                                                       found = true
+                                                       break
+                                               }
+                                       }
+                                       if !found {
+                                               goto Bad
+                                       }
+                                       for _, re := range invalid {
+                                               if re.FindString(a) == a {
+                                                       goto Bad
+                                               }
+                                       }
+                               }
                                continue Args
                        }
                }
index 2ce7806c42111e79844edf313f69a0f30e410e14..1cb0aa8e4a9a2bf0019a325a7b37c128ea2fa62b 100644 (file)
@@ -178,6 +178,10 @@ var goodLinkerFlags = [][]string{
        {"-Wl,-z,noexecstack"},
        {"libcgotbdtest.tbd"},
        {"./libcgotbdtest.tbd"},
+       {"-Wl,--push-state"},
+       {"-Wl,--pop-state"},
+       {"-Wl,--push-state,--as-needed"},
+       {"-Wl,--push-state,--no-as-needed,-Bstatic"},
 }
 
 var badLinkerFlags = [][]string{
@@ -244,6 +248,8 @@ var badLinkerFlags = [][]string{
        {"-Wl,-e="},
        {"-Wl,-e,"},
        {"-Wl,-R,-flag"},
+       {"-Wl,--push-state,"},
+       {"-Wl,--push-state,@foo"},
 }
 
 func TestCheckLinkerFlags(t *testing.T) {