diff options
-rw-r--r-- | filesystem/filesystem.go | 33 | ||||
-rw-r--r-- | filesystem/filesystem_test.go | 21 | ||||
-rw-r--r-- | filesystem/system_image.go | 2 | ||||
-rw-r--r-- | linkerconfig/linkerconfig.go | 14 |
4 files changed, 63 insertions, 7 deletions
diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go index 97421c8a3..d178710cf 100644 --- a/filesystem/filesystem.go +++ b/filesystem/filesystem.go @@ -25,6 +25,7 @@ import ( "android/soong/android" "android/soong/cc" + "android/soong/linkerconfig" "github.com/google/blueprint" "github.com/google/blueprint/proptools" @@ -146,6 +147,10 @@ type FilesystemProperties struct { Erofs ErofsProperties + // List of files (in .json format) that will be converted to a linker config file (in .pb format). + // The linker config file be installed in the filesystem at /etc/linker.config.pb + Linker_config_srcs []string `android:"path"` + // Determines if the module is auto-generated from Soong or not. If the module is // auto-generated, its deps are exempted from visibility enforcement. Is_auto_generated *bool @@ -428,6 +433,7 @@ func (f *filesystem) buildImageUsingBuildImage(ctx android.ModuleContext) androi f.buildFsverityMetadataFiles(ctx, builder, specs, rootDir, rebasedDir) f.buildEventLogtagsFile(ctx, builder, rebasedDir) f.buildAconfigFlagsFiles(ctx, builder, specs, rebasedDir) + f.buildLinkerConfigFile(ctx, builder, rebasedDir) f.copyFilesToProductOut(ctx, builder, rebasedDir) // run host_init_verifier @@ -591,6 +597,7 @@ func (f *filesystem) buildCpioImage(ctx android.ModuleContext, compressed bool) f.buildFsverityMetadataFiles(ctx, builder, specs, rootDir, rebasedDir) f.buildEventLogtagsFile(ctx, builder, rebasedDir) f.buildAconfigFlagsFiles(ctx, builder, specs, rebasedDir) + f.buildLinkerConfigFile(ctx, builder, rebasedDir) f.copyFilesToProductOut(ctx, builder, rebasedDir) output := android.PathForModuleOut(ctx, f.installFileName()).OutputPath @@ -682,6 +689,32 @@ func (f *filesystem) buildEventLogtagsFile(ctx android.ModuleContext, builder *a f.appendToEntry(ctx, eventLogtagsPath) } +func (f *filesystem) buildLinkerConfigFile(ctx android.ModuleContext, builder *android.RuleBuilder, rebasedDir android.OutputPath) { + getCStubLibs := func() []android.Module { + // Determine the list of C stub libraries that are part of this filesystem. + // These will be added to `provideLibs`. + // The current implementation assumes that stub libraries are listed explicitly in `deps` + // (direct deps). If this is not true, ctx.VisitDeps will need to be replaced by ctx.WalkDeps. + ret := []android.Module{} + ctx.VisitDirectDeps(func(child android.Module) { + if c, ok := child.(*cc.Module); ok && c.HasStubsVariants() { + ret = append(ret, c) + } + }) + return ret + } + + if len(f.properties.Linker_config_srcs) == 0 { + return + } + + // cp to the final output + output := rebasedDir.Join(ctx, "etc", "linker.config.pb") + linkerconfig.BuildLinkerConfig(ctx, builder, android.PathsForModuleSrc(ctx, f.properties.Linker_config_srcs), getCStubLibs(), nil, output) + + f.appendToEntry(ctx, output) +} + type partition interface { PartitionType() string } diff --git a/filesystem/filesystem_test.go b/filesystem/filesystem_test.go index 730006116..cb27f6464 100644 --- a/filesystem/filesystem_test.go +++ b/filesystem/filesystem_test.go @@ -664,3 +664,24 @@ cc_library { fileList := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("fileList")) android.AssertDeepEquals(t, "Shared library dep of overridden binary should not be installed", fileList, "bin/binfoo1\nlib64/libc++.so\nlib64/libc.so\nlib64/libdl.so\nlib64/libfoo2.so\nlib64/libm.so\n") } + +func TestInstallLinkerConfigFile(t *testing.T) { + result := fixture.RunTestWithBp(t, ` +android_filesystem { + name: "myfilesystem", + deps: ["libfoo_has_no_stubs", "libfoo_has_stubs"], + linker_config_srcs: ["linker.config.json"] +} +cc_library { + name: "libfoo_has_no_stubs", +} +cc_library { + name: "libfoo_has_stubs", + stubs: {symbol_file: "libfoo.map.txt"}, +} + `) + + linkerConfigCmd := result.ModuleForTests("myfilesystem", "android_common").Rule("build_filesystem_image").RuleParams.Command + android.AssertStringDoesContain(t, "", linkerConfigCmd, "conv_linker_config proto --force -s linker.config.json") + android.AssertStringDoesContain(t, "", linkerConfigCmd, "--key provideLibs --value libfoo_has_stubs.so") +} diff --git a/filesystem/system_image.go b/filesystem/system_image.go index 7dbf98644..6200df44d 100644 --- a/filesystem/system_image.go +++ b/filesystem/system_image.go @@ -94,7 +94,7 @@ func (s *systemImage) buildLinkerConfigFile(ctx android.ModuleContext, root andr }) builder := android.NewRuleBuilder(pctx, ctx) - linkerconfig.BuildLinkerConfig(ctx, builder, input, provideModules, requireModules, output) + linkerconfig.BuildLinkerConfig(ctx, builder, android.Paths{input}, provideModules, requireModules, output) builder.Build("conv_linker_config", "Generate linker config protobuf "+output.String()) return output } diff --git a/linkerconfig/linkerconfig.go b/linkerconfig/linkerconfig.go index 05b99fd6d..d42287113 100644 --- a/linkerconfig/linkerconfig.go +++ b/linkerconfig/linkerconfig.go @@ -77,7 +77,7 @@ func (l *linkerConfig) GenerateAndroidBuildActions(ctx android.ModuleContext) { output := android.PathForModuleOut(ctx, "linker.config.pb").OutputPath builder := android.NewRuleBuilder(pctx, ctx) - BuildLinkerConfig(ctx, builder, input, nil, nil, output) + BuildLinkerConfig(ctx, builder, android.Paths{input}, nil, nil, output) builder.Build("conv_linker_config", "Generate linker config protobuf "+output.String()) l.outputFilePath = output @@ -91,16 +91,18 @@ func (l *linkerConfig) GenerateAndroidBuildActions(ctx android.ModuleContext) { } func BuildLinkerConfig(ctx android.ModuleContext, builder *android.RuleBuilder, - input android.Path, provideModules []android.Module, requireModules []android.Module, output android.OutputPath) { + inputs android.Paths, provideModules []android.Module, requireModules []android.Module, output android.OutputPath) { // First, convert the input json to protobuf format interimOutput := android.PathForModuleOut(ctx, "temp.pb") - builder.Command(). + cmd := builder.Command(). BuiltTool("conv_linker_config"). Flag("proto"). - Flag("--force"). - FlagWithInput("-s ", input). - FlagWithOutput("-o ", interimOutput) + Flag("--force") + for _, input := range inputs { + cmd.FlagWithInput("-s ", input) + } + cmd.FlagWithOutput("-o ", interimOutput) // Secondly, if there's provideLibs gathered from provideModules, append them var provideLibs []string |