Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 19b3a51f authored by Vic Yang's avatar Vic Yang
Browse files

Add support for no-vendor-variant VNDK

When no-vendor-variant VNDK is enabled, the vendor variant of VNDK
libraries are not installed.  In this case, the vendor binaries need to
be able to link in the core variant.

Update the linker config so that we export such VNDK libraries to the
proper linker namespaces.

Bug: 119423884
Test: Enable no-vendor-variant VNDK for a dummy VNDK library.  Boot and
      check the vendor variant does not exist and only the core variant
      is used.

Change-Id: I71274fdf61373663603a5fbc3497400420094fcf
parent 7f6d6db2
Loading
Loading
Loading
Loading
+54 −4
Original line number Diff line number Diff line
@@ -377,7 +377,7 @@ namespace.vndk.link.sphal.allow_all_shared_libs = true
# (LL-NDK only) access.
###############################################################################
[vendor]
additional.namespaces = runtime,system,vndk
additional.namespaces = runtime,system,vndk%VNDK_IN_SYSTEM_NS%

###############################################################################
# "default" namespace
@@ -418,8 +418,9 @@ namespace.default.asan.permitted.paths += /odm
namespace.default.asan.permitted.paths += /data/asan/vendor
namespace.default.asan.permitted.paths +=           /vendor

namespace.default.links = system,vndk
namespace.default.links = system,vndk%VNDK_IN_SYSTEM_NS%
namespace.default.link.system.shared_libs = %LLNDK_LIBRARIES%
namespace.default.link.vndk_in_system.shared_libs = %VNDK_USING_CORE_VARIANT_LIBRARIES%
namespace.default.link.vndk.shared_libs  = %VNDK_SAMEPROCESS_LIBRARIES%
namespace.default.link.vndk.shared_libs += %VNDK_CORE_LIBRARIES%

@@ -468,14 +469,18 @@ namespace.vndk.asan.search.paths += /system/${LIB}/vndk%VNDK_VER%

# When these NDK libs are required inside this namespace, then it is redirected
# to the system namespace. This is possible since their ABI is stable across
# Android releases.
namespace.vndk.links = system,default
# Android releases.  The links here should be identical to that of the
# 'vndk_in_system' namespace, except for the link between 'vndk' and
# 'vndk_in_system'.
namespace.vndk.links = system,default%VNDK_IN_SYSTEM_NS%

namespace.vndk.link.system.shared_libs  = %LLNDK_LIBRARIES%
namespace.vndk.link.system.shared_libs += %SANITIZER_RUNTIME_LIBRARIES%

namespace.vndk.link.default.allow_all_shared_libs = true

namespace.vndk.link.vndk_in_system.shared_libs = %VNDK_USING_CORE_VARIANT_LIBRARIES%

###############################################################################
# "system" namespace
#
@@ -503,6 +508,51 @@ namespace.system.link.runtime.shared_libs += libnativeloader.so
# Workaround for b/124772622
namespace.system.link.runtime.shared_libs += libandroidicu.so

###############################################################################
# "vndk_in_system" namespace
#
# This namespace is where no-vendor-variant VNDK libraries are loaded for a
# vendor process.  Note that we do not simply export these libraries from
# "system" namespace, because in some case both the core variant and the
# vendor variant of a VNDK library may be loaded.  In such case, we do not
# want to eliminate double-loading because doing so means the global states
# of the library would be shared.
#
# Only the no-vendor-variant VNDK libraries are whitelisted in this namespace.
# This is to ensure that we do not load libraries needed by no-vendor-variant
# VNDK libraries into vndk_in_system namespace.
###############################################################################
namespace.vndk_in_system.isolated = true
namespace.vndk_in_system.visible = true

# The search paths here should be kept the same as that of the 'system'
# namespace.
namespace.vndk_in_system.search.paths  = /system/${LIB}
namespace.vndk_in_system.search.paths += /%PRODUCT%/${LIB}
namespace.vndk_in_system.search.paths += /%PRODUCT_SERVICES%/${LIB}

namespace.vndk_in_system.asan.search.paths  = /data/asan/system/${LIB}
namespace.vndk_in_system.asan.search.paths +=           /system/${LIB}
namespace.vndk_in_system.asan.search.paths += /data/asan/product/${LIB}
namespace.vndk_in_system.asan.search.paths +=           /%PRODUCT%/${LIB}
namespace.vndk_in_system.asan.search.paths += /data/asan/product_services/${LIB}
namespace.vndk_in_system.asan.search.paths +=           /%PRODUCT_SERVICES%/${LIB}

namespace.vndk_in_system.whitelisted = %VNDK_USING_CORE_VARIANT_LIBRARIES%

# The links here should be identical to that of the 'vndk' namespace, with the
# following exception:
#   1. 'vndk_in_system' needs to be freely linked back to 'vndk'.
#   2. 'vndk_in_system' does not need to link to 'default', as any library that
#      requires anything vendor would not be a vndk_in_system library.
namespace.vndk_in_system.links = vndk,system

namespace.vndk_in_system.link.system.shared_libs  = %LLNDK_LIBRARIES%
namespace.vndk_in_system.link.system.shared_libs += %SANITIZER_RUNTIME_LIBRARIES%

namespace.vndk_in_system.link.vndk.allow_all_shared_libs = true


###############################################################################
# Namespace config for native tests that need access to both system and vendor
# libraries. This replicates the default linker config (done by
+36 −0
Original line number Diff line number Diff line
@@ -23,6 +23,11 @@ vndk_version := $(strip $(vndk_version))
lib_list_from_prebuilts := $(strip $(lib_list_from_prebuilts))
libz_is_llndk := $(strip $(libz_is_llndk))

my_vndk_use_core_variant := $(TARGET_VNDK_USE_CORE_VARIANT)
ifeq ($(lib_list_from_prebuilts),true)
my_vndk_use_core_variant := false
endif

compatibility_check_script := \
  $(LOCAL_PATH)/ld_config_backward_compatibility_check.py
intermediates_dir := $(call intermediates-dir-for,ETC,$(LOCAL_MODULE))
@@ -35,6 +40,9 @@ llndk_libraries_file := $(library_lists_dir)/llndk.libraries.$(vndk_version).txt
vndksp_libraries_file := $(library_lists_dir)/vndksp.libraries.$(vndk_version).txt
vndkcore_libraries_file := $(library_lists_dir)/vndkcore.libraries.txt
vndkprivate_libraries_file := $(library_lists_dir)/vndkprivate.libraries.txt
ifeq ($(my_vndk_use_core_variant),true)
vndk_using_core_variant_libraries_file := $(library_lists_dir)/vndk_using_core_variant.libraries.$(vndk_version).txt
endif

sanitizer_runtime_libraries := $(call normalize-path-list,$(addsuffix .so,\
  $(ADDRESS_SANITIZER_RUNTIME_LIBRARY) \
@@ -68,6 +76,9 @@ $(eval $(call write-libs-to-file,$(llndk_libraries_list),$(llndk_libraries_file)
$(eval $(call write-libs-to-file,$(vndksp_libraries_list),$(vndksp_libraries_file)))
$(eval $(call write-libs-to-file,$(VNDK_CORE_LIBRARIES),$(vndkcore_libraries_file)))
$(eval $(call write-libs-to-file,$(VNDK_PRIVATE_LIBRARIES),$(vndkprivate_libraries_file)))
ifeq ($(my_vndk_use_core_variant),true)
$(eval $(call write-libs-to-file,$(VNDK_USING_CORE_VARIANT_LIBRARIES),$(vndk_using_core_variant_libraries_file)))
endif
endif # ifneq ($(lib_list_from_prebuilts),true)

# Given a file with a list of libs, filter-out the VNDK private libraries
@@ -94,6 +105,10 @@ deps := $(llndk_libraries_file) $(vndksp_libraries_file) $(vndkcore_libraries_fi
ifeq ($(check_backward_compatibility),true)
deps += $(compatibility_check_script)
endif
ifeq ($(my_vndk_use_core_variant),true)
$(LOCAL_BUILT_MODULE): PRIVATE_VNDK_USING_CORE_VARIANT_LIBRARIES_FILE := $(vndk_using_core_variant_libraries_file)
deps += $(vndk_using_core_variant_libraries_file)
endif

$(LOCAL_BUILT_MODULE): $(ld_config_template) $(deps)
	@echo "Generate: $< -> $@"
@@ -109,6 +124,20 @@ endif
	$(call private-filter-out-private-libs,$(PRIVATE_VNDK_CORE_LIBRARIES_FILE),$(PRIVATE_INTERMEDIATES_DIR)/vndkcore_filtered)
	$(hide) sed -i.bak -e "s?%VNDK_CORE_LIBRARIES%?$$(cat $(PRIVATE_INTERMEDIATES_DIR)/vndkcore_filtered)?g" $@

ifeq ($(my_vndk_use_core_variant),true)
	$(call private-filter-out-private-libs,$(PRIVATE_VNDK_USING_CORE_VARIANT_LIBRARIES_FILE),$(PRIVATE_INTERMEDIATES_DIR)/vndk_using_core_variant_filtered)
	$(hide) sed -i.bak -e "s?%VNDK_IN_SYSTEM_NS%?,vndk_in_system?g" $@
	$(hide) sed -i.bak -e "s?%VNDK_USING_CORE_VARIANT_LIBRARIES%?$$(cat $(PRIVATE_INTERMEDIATES_DIR)/vndk_using_core_variant_filtered)?g" $@
else
	$(hide) sed -i.bak -e "s?%VNDK_IN_SYSTEM_NS%??g" $@
	# Unlike LLNDK or VNDK-SP, VNDK_USING_CORE_VARIANT_LIBRARIES can be nothing
	# if TARGET_VNDK_USE_CORE_VARIANT is not set.  In this case, we need to remove
	# the entire line in the linker config so that we are not left with a line
	# like:
	#   namespace.sphal.link.default.shared_libs +=
	$(hide) sed -i.bak -e "s?^.*\+= %VNDK_USING_CORE_VARIANT_LIBRARIES%\$$??" $@
endif

	$(hide) echo -n > $(PRIVATE_INTERMEDIATES_DIR)/private_llndk && \
	cat $(PRIVATE_VNDK_PRIVATE_LIBRARIES_FILE) | \
	xargs -n 1 -I privatelib bash -c "(grep privatelib $(PRIVATE_LLNDK_LIBRARIES_FILE) || true) >> $(PRIVATE_INTERMEDIATES_DIR)/private_llndk" && \
@@ -146,3 +175,10 @@ vndk_version_suffix :=
llndk_libraries_list :=
vndksp_libraries_list :=
write-libs-to-file :=

ifeq ($(my_vndk_use_core_variant),true)
vndk_using_core_variant_libraries_file :=
vndk_using_core_variant_libraries_list :=
endif

my_vndk_use_core_variant :=