From 958c957696e1b1570c9f5feba705577baaa75c54 Mon Sep 17 00:00:00 2001 From: David Brazdil Date: Fri, 22 Apr 2022 15:17:54 +0100 Subject: [PATCH] Add linker_scripts property Add a linker_scripts property that is similar to version_script but uses a -Wl,--script flag and can be passed multiple times. Test: TestBinaryLinkerScripts Change-Id: If405cfbcdaf8e99559414ba759734084fae0f7ec --- cc/binary_test.go | 20 ++++++++++++++++++++ cc/check.go | 2 ++ cc/linker.go | 14 ++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/cc/binary_test.go b/cc/binary_test.go index 8ec387182..1b8b4a83c 100644 --- a/cc/binary_test.go +++ b/cc/binary_test.go @@ -49,3 +49,23 @@ cc_binary { expectedUnStrippedFile := "outputbase/execroot/__main__/foo" android.AssertStringEquals(t, "Unstripped output file", expectedUnStrippedFile, unStrippedFilePath.String()) } + +func TestBinaryLinkerScripts(t *testing.T) { + result := PrepareForIntegrationTestWithCc.RunTestWithBp(t, ` + cc_binary { + name: "foo", + srcs: ["foo.cc"], + linker_scripts: ["foo.ld", "bar.ld"], + }`) + + binFoo := result.ModuleForTests("foo", "android_arm64_armv8-a").Rule("ld") + + android.AssertStringListContains(t, "missing dependency on linker_scripts", + binFoo.Implicits.Strings(), "foo.ld") + android.AssertStringListContains(t, "missing dependency on linker_scripts", + binFoo.Implicits.Strings(), "bar.ld") + android.AssertStringDoesContain(t, "missing flag for linker_scripts", + libfoo.Args["ldFlags"], "-Wl,--script,foo.ld") + android.AssertStringDoesContain(t, "missing flag for linker_scripts", + libfoo.Args["ldFlags"], "-Wl,--script,bar.ld") +} diff --git a/cc/check.go b/cc/check.go index a357a9751..3d290a94b 100644 --- a/cc/check.go +++ b/cc/check.go @@ -87,6 +87,8 @@ func CheckBadLinkerFlags(ctx BaseModuleContext, prop string, flags []string) { ctx.PropertyErrorf(prop, "Bad flag: `%s` is not allowed", flag) } else if strings.HasPrefix(flag, "-Wl,--version-script") { ctx.PropertyErrorf(prop, "Bad flag: `%s`, use version_script instead", flag) + } else if flag == "-T" || strings.HasPrefix(flag, "--script") { + ctx.PropertyErrorf(prop, "Bad flag: `%s`, use linker_scripts instead", flag) } else if flag == "--coverage" { ctx.PropertyErrorf(prop, "Bad flag: `%s`, use native_coverage instead", flag) } else if strings.Contains(flag, " ") { diff --git a/cc/linker.go b/cc/linker.go index bea65d441..f34658485 100644 --- a/cc/linker.go +++ b/cc/linker.go @@ -227,6 +227,9 @@ type BaseLinkerProperties struct { // local file name to pass to the linker as --dynamic-list Dynamic_list *string `android:"path,arch_variant"` + // local files to pass to the linker as --script + Linker_scripts []string `android:"path,arch_variant"` + // list of static libs that should not be used to build this module Exclude_static_libs []string `android:"arch_variant"` @@ -602,6 +605,17 @@ func (linker *baseLinker) linkerFlags(ctx ModuleContext, flags Flags) Flags { flags.LdFlagsDeps = append(flags.LdFlagsDeps, dynamicList.Path()) } } + + linkerScriptPaths := android.PathsForModuleSrc(ctx, linker.Properties.Linker_scripts) + if len(linkerScriptPaths) > 0 && (ctx.Darwin() || ctx.Windows()) { + ctx.PropertyErrorf("linker_scripts", "Only supported for ELF files") + } else { + for _, linkerScriptPath := range linkerScriptPaths { + flags.Local.LdFlags = append(flags.Local.LdFlags, + "-Wl,--script,"+linkerScriptPath.String()) + flags.LdFlagsDeps = append(flags.LdFlagsDeps, linkerScriptPath) + } + } } return flags