142d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov/*
242d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov * Copyright (C) 2015 The Android Open Source Project
342d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov *
442d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov * Licensed under the Apache License, Version 2.0 (the "License");
542d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov * you may not use this file except in compliance with the License.
642d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov * You may obtain a copy of the License at
742d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov *
842d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov *      http://www.apache.org/licenses/LICENSE-2.0
942d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov *
1042d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov * Unless required by applicable law or agreed to in writing, software
1142d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov * distributed under the License is distributed on an "AS IS" BASIS,
1242d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1342d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov * See the License for the specific language governing permissions and
1442d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov * limitations under the License.
1542d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov */
1642d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov
1742d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov#include <dlfcn.h>
1842d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov
1942d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanovstatic const char* g_local_string = "This string is local to root library";
2042d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanovextern "C" const char* g_private_extern_string;
2142d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanovextern "C" const char* g_public_extern_string;
2242d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov
2342d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanovbool g_dlopened = false;
2442d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov
2542d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanovextern "C" const char* ns_get_local_string() {
2642d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov  return g_local_string;
2742d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov}
2842d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov
2942d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanovextern "C" const char* ns_get_private_extern_string() {
3042d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov  return g_private_extern_string;
3142d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov}
3242d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov
3342d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanovextern "C" const char* ns_get_public_extern_string() {
3442d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov  return g_public_extern_string;
3542d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov}
3642d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov
3742d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanovextern "C" const char* ns_get_dlopened_string() {
3842d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov  void* handle = dlopen("libnstest_dlopened.so", RTLD_NOW | RTLD_GLOBAL);
3942d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov  if (handle == nullptr) {
4042d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov    return nullptr;
4142d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov  }
4242d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov
431ffec1cc4d0e283bb1ff6f49843769a3493b8d73Dmitriy Ivanov  const char** result = static_cast<const char**>(dlsym(handle, "g_private_dlopened_string"));
441ffec1cc4d0e283bb1ff6f49843769a3493b8d73Dmitriy Ivanov  if (result == nullptr) {
451ffec1cc4d0e283bb1ff6f49843769a3493b8d73Dmitriy Ivanov    return nullptr;
461ffec1cc4d0e283bb1ff6f49843769a3493b8d73Dmitriy Ivanov  } else {
4742d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov    g_dlopened = true;
4842d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov  }
4942d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov
501ffec1cc4d0e283bb1ff6f49843769a3493b8d73Dmitriy Ivanov  return *result;
5142d5fcb9f494eb45de3b6bf759f4a18076e84728Dmitriy Ivanov}
52