diff options
author | Jiyong Park <jiyong@google.com> | 2019-01-20 21:02:00 +0900 |
---|---|---|
committer | Jiyong Park <jiyong@google.com> | 2019-01-31 13:44:20 +0900 |
commit | a5f914aef163e27bf49ce2c29f2cef12a131132f (patch) | |
tree | 9e2976d251f482c7a23ed8a293d3e104cde2c3e9 /build/bionic.go | |
parent | fcb35dc4aa07239878c8ba987aff739388b0f15f (diff) | |
download | bionic-a5f914aef163e27bf49ce2c29f2cef12a131132f.tar.gz |
Add bionic mount points under /bionic
This change adds following files and symlinks:
Files:
/bionic/lib[64]/lib{c|dl|m}.so
/bionic/bin/linker[64]
Symlinks:
/system/lib[64]/lib{c|dl|m}.so -> /bionic/lib[64]/lib{c|dl|m}.so
/system/bin/linker[64] -> /bionic/bin/linker[64]
/system/bin/linker_asan[64] -> /bionic/bin/linker[64]
The files serve as mount points for either the bootstrap Bionic or the
default Bionic from the runtime APEX. init does the bind-mounting during
booting.
The symlinks are there to not change the ordinary paths to the bionic
files; there are many places that the paths are implied or hard-coded,
e.g., dlopen("/system/lib/libc.so") or DT_INTERP pointing to
/system/bin/linker in the vendor prebuilts.
Bug: 120266448
Test: m blueline, cf_x86, aosp_arm
The aforementioned files and symlinks are found
Change-Id: I97e38c29409ac0610dde285db8df6e94a7930094
Diffstat (limited to 'build/bionic.go')
-rw-r--r-- | build/bionic.go | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/build/bionic.go b/build/bionic.go new file mode 100644 index 000000000..3522acae8 --- /dev/null +++ b/build/bionic.go @@ -0,0 +1,164 @@ +// Copyright (C) 2019 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package bionic + +import ( + "fmt" + "io" + "strings" + + "github.com/google/blueprint/proptools" + + "android/soong/android" +) + +// bionic_mountpoint is a module type that is specialized to create +// mount points for Bionic files (libc, libdl, libm, and linker). +// +// With following description, +// +// bionic_mountpoint { +// name: "libc.mountpoint", +// stem: "libc.so", +// src: "dummy_mountpoint", +// library: true, +// symlinks: ["libc.so"], +// } +// +// , the build system does following jobs: +// +// A mount point /bionic/lib[64]/libc.so is created. Its content +// is from the file 'dummy_mountpoint'. +// +// Then a symlink is created at /system/lib[64]/libc.so which points to +// the created mountpoint. +// +// At runtime, on the mount point, either bootstrap Bionic or default Bionic +// (which is from the runtime APEX) is mounted by the init process. The +// symlink exists to provide consistent legacy path for compatibility +// reason. +func init() { + android.RegisterModuleType("bionic_mountpoint", bionicMountpointFactory) +} + +type bionicMountpoint struct { + android.ModuleBase + properties bionicMountpointProperties + + outputFile android.Path + pathInPartition string + stem string +} + +type bionicMountpointProperties struct { + // The file that is installed as the mount point + Src *string + + // True if the mount point is for a Bionic library such libc.so + Library *bool + // True if the mount point is for a Bionic binary such as linker + Binary *bool + + // Base name of the mount point + Stem *string `android:"arch_variant"` + + // Append to the name of the output + Suffix *string `android:"arch_variant"` + + // Symlinks to the mountpoints from the system and recovery partitions + // Symlinks names will have the same suffix as the mount point + Symlinks []string +} + +func (m *bionicMountpoint) DepsMutator(ctx android.BottomUpMutatorContext) { + if Bool(m.properties.Library) == Bool(m.properties.Binary) { + ctx.ModuleErrorf("either binary or library must be set to true") + return + } + if m.properties.Stem == nil { + ctx.PropertyErrorf("stem", "stem must be set") + return + } + if m.properties.Src == nil { + ctx.PropertyErrorf("src", "src must be set") + } + android.ExtractSourceDeps(ctx, m.properties.Src) +} + +func (m *bionicMountpoint) GenerateAndroidBuildActions(ctx android.ModuleContext) { + if Bool(m.properties.Library) { + m.pathInPartition = "lib" + if m.Arch().ArchType.Multilib == "lib64" { + m.pathInPartition = "lib64" + } + } else if Bool(m.properties.Binary) { + m.pathInPartition = "bin" + } + + m.stem = String(m.properties.Stem) + String(m.properties.Suffix) + + m.outputFile = ctx.ExpandSource(String(m.properties.Src), "src") +} + +func (m *bionicMountpoint) AndroidMk() android.AndroidMkData { + return android.AndroidMkData { + Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) { + if !m.Arch().Native { + return + } + fmt.Fprintln(w, "\ninclude $(CLEAR_VARS)") + fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir) + fmt.Fprintln(w, "LOCAL_MODULE :=", name) + fmt.Fprintln(w, "LOCAL_USE_CLANG_LLD := false") + fmt.Fprintln(w, "LOCAL_STRIP_MODULE := false") + if Bool(m.properties.Library) { + fmt.Fprintln(w, "LOCAL_MODULE_CLASS := SHARED_LIBRARIES") + } else if Bool(m.properties.Binary) { + fmt.Fprintln(w, "LOCAL_MODULE_CLASS := EXECUTABLES") + } + fmt.Fprintln(w, "LOCAL_MODULE_TAGS := optional") + fmt.Fprintln(w, "LOCAL_PREBUILT_MODULE_FILE :=", m.outputFile.String()) + fmt.Fprintln(w, "LOCAL_MODULE_TARGET_ARCH :=", m.Arch().ArchType.String()) + fmt.Fprintln(w, "LOCAL_MODULE_PATH :=", "$(TARGET_ROOT_OUT)/bionic/" + m.pathInPartition) + fmt.Fprintln(w, "LOCAL_INSTALLED_MODULE_STEM :=", m.stem) + + if len(m.properties.Symlinks) > 0 { + symlink_dir_in_system := "$(TARGET_OUT)/" + m.pathInPartition + "/" + symlink_dir_in_recovery := "$(TARGET_RECOVERY_ROOT_OUT)/system/" + m.pathInPartition + "/" + symlink_target := "/bionic/" + m.pathInPartition + "/" + m.stem + cmds := []string{} + cmds = append(cmds, "$(hide) mkdir -p " + symlink_dir_in_system) + cmds = append(cmds, "mkdir -p " + symlink_dir_in_recovery) + for _, s := range m.properties.Symlinks { + symlink := s + String(m.properties.Suffix) + cmds = append(cmds, "ln -sf " + symlink_target + " " + symlink_dir_in_system + symlink) + cmds = append(cmds, "ln -sf " + symlink_target + " " + symlink_dir_in_recovery + symlink) + } + fmt.Fprintln(w, "LOCAL_POST_INSTALL_CMD := " + strings.Join(cmds, " && ")) + } + fmt.Fprintln(w, "include $(BUILD_PREBUILT)") + }, + } +} + +func bionicMountpointFactory() android.Module { + m := &bionicMountpoint{} + m.AddProperties(&m.properties) + android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibBoth) + return m +} + +var Bool = proptools.Bool +var String = proptools.String |