Merge changes from topic 'synchronize_vndk-sp' into oc-dev

* changes:
  add libvndksupport.so to ll-ndk
  libbacktrace is VNDK-SP
  add libvndksupport
This commit is contained in:
TreeHugger Robot 2017-05-17 01:53:55 +00:00 committed by Android (Google) Code Review
commit fbe9427241
7 changed files with 192 additions and 13 deletions

15
libvndksupport/Android.bp Normal file
View File

@ -0,0 +1,15 @@
subdirs = ["tests"]
cc_library_shared {
name: "libvndksupport",
srcs: ["linker.c"],
local_include_dirs: ["include/vndksupport"],
export_include_dirs: ["include"],
shared_libs: ["liblog"],
}
llndk_library {
name: "libvndksupport",
symbol_file: "libvndksupport.map.txt",
export_include_dirs: ["include"],
}

View File

@ -0,0 +1,31 @@
/*
* Copyright (C) 2017 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.
*/
#ifndef VNDKSUPPORT_LINKER_H_
#define VNDKSUPPORT_LINKER_H_
#ifdef __cplusplus
extern "C" {
#endif
void* android_load_sphal_library(const char* name, int flag);
int android_unload_sphal_library(void* handle);
#ifdef __cplusplus
}
#endif
#endif // VNDKSUPPORT_LINKER_H_

View File

@ -0,0 +1,7 @@
LIBVNDKSUPPORT {
global:
android_load_sphal_library; # vndk
android_unload_sphal_library; # vndk
local:
*;
};

50
libvndksupport/linker.c Normal file
View File

@ -0,0 +1,50 @@
/*
* Copyright (C) 2017 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.
*/
#include "linker.h"
#include <android/dlext.h>
#include <dlfcn.h>
#define LOG_TAG "vndksupport"
#include <log/log.h>
extern struct android_namespace_t* android_get_exported_namespace(const char*);
void* android_load_sphal_library(const char* name, int flag) {
struct android_namespace_t* sphal_namespace = android_get_exported_namespace("sphal");
if (sphal_namespace != NULL) {
const android_dlextinfo dlextinfo = {
.flags = ANDROID_DLEXT_USE_NAMESPACE, .library_namespace = sphal_namespace,
};
void* handle = android_dlopen_ext(name, flag, &dlextinfo);
if (handle) {
return handle;
} else {
ALOGW(
"Could not load %s from sphal namespace: %s. "
"Falling back to loading it from the current namespace,",
name, dlerror());
}
} else {
ALOGI(
"sphal namespace is not configured for this process. "
"Loading %s from the current namespace instead.",
name);
}
return dlopen(name, flag);
}
int android_unload_sphal_library(void* handle) { return dlclose(handle); }

View File

@ -0,0 +1,26 @@
// Copyright (C) 2017 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.
cc_test {
name: "libvndksupport-tests",
srcs: [
"linker_test.cpp",
],
host_supported: false,
shared_libs: [
"libvndksupport",
"libbase",
]
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (C) 2017 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.
*/
#include <gtest/gtest.h>
#include <android-base/strings.h>
#include <dirent.h>
#include <dlfcn.h>
#include <vndksupport/linker.h>
#include <string>
// Since the test executable will be in /data and ld.config.txt does not
// configure sphal namespace for executables in /data, the call to
// android_load_sphal_library will always fallback to the plain dlopen from the
// default namespace.
// Let's use libEGL_<chipset>.so as a SP-HAL in test
static std::string find_sphal_lib() {
const char* path =
#if defined(__LP64__)
"/vendor/lib64/egl";
#else
"/vendor/lib/egl";
#endif
std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(path), closedir);
dirent* dp;
while ((dp = readdir(dir.get())) != nullptr) {
std::string name = dp->d_name;
if (android::base::StartsWith(name, "libEGL_")) {
return std::string(path) + "/" + name;
}
}
return "";
}
TEST(linker, load_existing_lib) {
std::string name = find_sphal_lib();
ASSERT_NE("", name);
void* handle = android_load_sphal_library(name.c_str(), RTLD_NOW | RTLD_LOCAL);
ASSERT_NE(nullptr, handle);
android_unload_sphal_library(handle);
}
TEST(linker, load_nonexisting_lib) {
void* handle = android_load_sphal_library("libNeverUseThisName.so", RTLD_NOW | RTLD_LOCAL);
ASSERT_EQ(nullptr, handle);
}

View File

@ -60,11 +60,7 @@ namespace.sphal.asan.permitted.paths = /data/asan/vendor/${LIB}:/vendor/${LIB}
namespace.sphal.links = default,vndk,rs
# WARNING: only NDK libs can be listed here.
# However, this is commented out because some SP-HALs (gralloc.msm8996.so, etc)
# are currently using some non-stable libs such as libbacktrace.so. We will get back
# to this list once the dependencies are fixed.
#namespace.sphal.link.default.shared_libs = libc.so:libz.so:libm.so:libdl.so:libstdc++.so:liblog.so:libnativewindow.so:libsync.so
namespace.sphal.link.default.shared_libs = libc.so:libz.so:libm.so:libdl.so:libstdc++.so:liblog.so:libnativewindow.so:libEGL.so:libsync.so:libbacktrace.so:libGLESv1_CM.so:libGLESv2.so
namespace.sphal.link.default.shared_libs = libc.so:libz.so:libm.so:libdl.so:libstdc++.so:liblog.so:libnativewindow.so:libEGL.so:libsync.so:libGLESv1_CM.so:libGLESv2.so:libvndksupport.so
# WARNING: only VNDK-SP libs can be listed here. DO NOT EDIT this line.
namespace.sphal.link.vndk.shared_libs = android.hardware.renderscript@1.0.so:android.hardware.graphics.allocator@2.0.so:android.hardware.graphics.mapper@2.0.so:android.hardware.graphics.common@1.0.so:android.hidl.base@1.0.so:libhwbinder.so:libbase.so:libcutils.so:libhardware.so:libhidlbase.so:libhidltransport.so:libutils.so:libc++.so
@ -85,7 +81,7 @@ namespace.rs.search.paths = /system/${LIB}/vndk-sp:/vendor/${LIB}
namespace.rs.permitted.paths = /vendor/${LIB}:/data
namespace.rs.links = default,vndk
namespace.rs.link.default.shared_libs = libc.so:libz.so:libm.so:libdl.so:libstdc++.so:liblog.so:libnativewindow.so:libEGL.so:libsync.so:libbacktrace.so:libGLESv1_CM.so:libGLESv2.so:libmediandk.so:libui.so
namespace.rs.link.default.shared_libs = libc.so:libz.so:libm.so:libdl.so:libstdc++.so:liblog.so:libnativewindow.so:libEGL.so:libsync.so:libGLESv1_CM.so:libGLESv2.so:libmediandk.so:libui.so:libvndksupport.so
namespace.rs.link.vndk.shared_libs = android.hardware.renderscript@1.0.so:android.hardware.graphics.allocator@2.0.so:android.hardware.graphics.mapper@2.0.so:android.hardware.graphics.common@1.0.so:android.hidl.base@1.0.so:libhwbinder.so:libbase.so:libcutils.so:libhardware.so:libhidlbase.so:libhidltransport.so:libutils.so:libc++.so
###############################################################################
@ -104,13 +100,7 @@ namespace.vndk.asan.permitted.paths = /data/asan/vendor/${LIB}/hw:/vendor/${LIB}
# to the default namespace. This is possible since their ABI is stable across
# Android releases.
namespace.vndk.links = default
# WARNING: only NDK libs can be listed here.
# However, this is commented out because some SP-HALs (gralloc.msm8996.so, etc)
# are currently using some non-stable libs such as libbacktrace.so. We will get back
# to this list once the dependencies are fixed.
#namespace.vndk.link.default.shared_libs = libc.so:libz.so:libm.so:libdl.so:libstdc++.so:liblog.so:libnativewindow.so:libsync.so
namespace.vndk.link.default.shared_libs = libc.so:libz.so:libm.so:libdl.so:libstdc++.so:liblog.so:libnativewindow.so:libEGL.so:libsync.so:libbacktrace.so
namespace.vndk.link.default.shared_libs = libc.so:libz.so:libm.so:libdl.so:libstdc++.so:liblog.so:libnativewindow.so:libEGL.so:libsync.so:libvndksupport.so
[vendor]