platform_bionic/tests/libs/namespaces_root.cpp
Dmitriy Ivanov 1ffec1cc4d Introduce anonymous namespace
The anonymous namespace is introduced to
handle cases when linker can not find the
caller. This usually happens when caller
code was not loaded by dynamic linker;
for example mono-generated code.

Bug: http://b/25844435
Bug: http://b/22548808
Change-Id: I9e5b1d23c1c75bc78548d68e79216a6a943a33cf
2015-11-23 16:13:10 -08:00

51 lines
1.4 KiB
C++

/*
* Copyright (C) 2015 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 <dlfcn.h>
static const char* g_local_string = "This string is local to root library";
extern "C" const char* g_private_extern_string;
extern "C" const char* g_public_extern_string;
bool g_dlopened = false;
extern "C" const char* ns_get_local_string() {
return g_local_string;
}
extern "C" const char* ns_get_private_extern_string() {
return g_private_extern_string;
}
extern "C" const char* ns_get_public_extern_string() {
return g_public_extern_string;
}
extern "C" const char* ns_get_dlopened_string() {
void* handle = dlopen("libnstest_dlopened.so", RTLD_NOW | RTLD_GLOBAL);
if (handle == nullptr) {
return nullptr;
}
const char** result = static_cast<const char**>(dlsym(handle, "g_private_dlopened_string"));
if (result == nullptr) {
return nullptr;
} else {
g_dlopened = true;
}
return *result;
}