diff options
author | Adrian Ratiu <adrian.ratiu@collabora.corp-partner.google.com> | 2022-05-11 17:05:11 +0300 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-05-12 23:51:58 +0000 |
commit | 74a3c504c7d287301b1a6a4eb3a4f20f06a4365c (patch) | |
tree | e060bfc0dd812b043cf99b302b80b10d59580df4 | |
parent | 5ba140d61255ba5e8a81cfacb0b4d3e1aaad13b0 (diff) | |
download | toolchain-utils-74a3c504c7d287301b1a6a4eb3a4f20f06a4365c.tar.gz |
compiler_wrapper: handle split "-Wl,-z,defs"
During the libxcrypt build, both "-Wl,-z,defs" and its
split equivalent "-Wl,-z -Wl,defs" are used which create
problems because only the unified version is supported.
This adds support for filtering the flags seprately
and two tests to verify the functionality.
BUG=b:187795307
TEST=Local builds with cross-*/libxcrypt; CQ.
Change-Id: If48499f5c8e552e28c7cefd2d959e40f4757a88f
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/toolchain-utils/+/3641843
Tested-by: Adrian Ratiu <adrian.ratiu@collabora.corp-partner.google.com>
Reviewed-by: Manoj Gupta <manojgupta@chromium.org>
Reviewed-by: George Burgess <gbiv@chromium.org>
Commit-Queue: Manoj Gupta <manojgupta@chromium.org>
Tested-by: Manoj Gupta <manojgupta@chromium.org>
-rw-r--r-- | compiler_wrapper/command.go | 15 | ||||
-rw-r--r-- | compiler_wrapper/sanitizer_flags.go | 4 | ||||
-rw-r--r-- | compiler_wrapper/sanitizer_flags_test.go | 18 |
3 files changed, 37 insertions, 0 deletions
diff --git a/compiler_wrapper/command.go b/compiler_wrapper/command.go index 253251ab..e186623a 100644 --- a/compiler_wrapper/command.go +++ b/compiler_wrapper/command.go @@ -265,6 +265,21 @@ func (builder *commandBuilder) transformArgs(transform func(arg builderArg) stri builder.args = newArgs } +// Allows to filter arg pairs, useful for eg when having adjacent unsupported args +// like "-Wl,-z -Wl,defs" +func (builder *commandBuilder) filterArgPairs(keepPair func(arg1, arg2 builderArg) bool) { + newArgs := builder.args[:0] + for i := 0; i < len(builder.args); i++ { + if i == len(builder.args)-1 || keepPair(builder.args[i], builder.args[i+1]) { + newArgs = append(newArgs, builder.args[i]) + } else { + // skip builder.args[i]) as well as next item + i++ + } + } + builder.args = newArgs +} + func (builder *commandBuilder) updateEnv(updates ...string) { builder.envUpdates = append(builder.envUpdates, updates...) } diff --git a/compiler_wrapper/sanitizer_flags.go b/compiler_wrapper/sanitizer_flags.go index 5d517e49..b9eb0558 100644 --- a/compiler_wrapper/sanitizer_flags.go +++ b/compiler_wrapper/sanitizer_flags.go @@ -37,5 +37,9 @@ func processSanitizerFlags(builder *commandBuilder) { } return arg.value }) + + builder.filterArgPairs(func(arg1, arg2 builderArg) bool { + return !(arg1.value == "-Wl,-z" && arg2.value == "-Wl,defs") + }) } } diff --git a/compiler_wrapper/sanitizer_flags_test.go b/compiler_wrapper/sanitizer_flags_test.go index 8b22a05e..17c41438 100644 --- a/compiler_wrapper/sanitizer_flags_test.go +++ b/compiler_wrapper/sanitizer_flags_test.go @@ -23,6 +23,15 @@ func TestFilterUnsupportedSanitizerFlagsIfSanitizeGiven(t *testing.T) { } cmd = ctx.must(callCompiler(ctx, ctx.cfg, + ctx.newCommand(gccX86_64, "-fsanitize=kernel-address", "-Wl,-z -Wl,defs", mainCc))) + if err := verifyArgCount(cmd, 0, "-Wl,-z"); err != nil { + t.Error(err) + } + if err := verifyArgCount(cmd, 0, "-Wl,defs"); err != nil { + t.Error(err) + } + + cmd = ctx.must(callCompiler(ctx, ctx.cfg, ctx.newCommand(gccX86_64, "-fsanitize=kernel-address", "-D_FORTIFY_SOURCE=1", mainCc))) if err := verifyArgCount(cmd, 0, "-D_FORTIFY_SOURCE=1"); err != nil { t.Error(err) @@ -75,6 +84,15 @@ func TestKeepSanitizerFlagsIfNoSanitizeGiven(t *testing.T) { } cmd = ctx.must(callCompiler(ctx, ctx.cfg, + ctx.newCommand(gccX86_64, "-Wl,-z -Wl,defs", mainCc))) + if err := verifyArgCount(cmd, 1, "-Wl,-z"); err != nil { + t.Error(err) + } + if err := verifyArgCount(cmd, 1, "-Wl,defs"); err != nil { + t.Error(err) + } + + cmd = ctx.must(callCompiler(ctx, ctx.cfg, ctx.newCommand(gccX86_64, "-D_FORTIFY_SOURCE=1", mainCc))) if err := verifyArgCount(cmd, 1, "-D_FORTIFY_SOURCE=1"); err != nil { t.Error(err) |