Commit 2e4045d6 authored by rmcilroy@chromium.org's avatar rmcilroy@chromium.org

Workaround removal of __system_property_get in Android NDK.

The 'L' release of Android will remove __system_property_get from the NDK.
Until we can replace all calls of __system_property_get, this CL adds a
temporary work-around for builds compiled against the 'L' API.  The workaround
involves creating a stub __system_property_get, which uses dlsym to dynamically
load the address of the real __system_property_get symbol in libc.so (which is
still available as a hidden symbol on the devices libc.so dispite having been
removed from the NDK).

BUG=392191,393903

Review URL: https://codereview.chromium.org/393923002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@284012 0039d316-1c4b-4281-b951-d872f2087c98
parent 313c692b
......@@ -4,6 +4,7 @@
#include "base/sys_info.h"
#include <dlfcn.h>
#include <sys/system_properties.h>
#include "base/android/sys_utils.h"
......@@ -14,6 +15,45 @@
#include "base/strings/stringprintf.h"
#include "base/sys_info_internal.h"
// TODO(rmcilroy): Update API level when 'L' gets an official API level.
#if (__ANDROID_API__ >= 9999 /* 'L' */)
namespace {
typedef int (SystemPropertyGetFunction)(const char*, char*);
SystemPropertyGetFunction* DynamicallyLoadRealSystemPropertyGet() {
// libc.so should already be open, get a handle to it.
void* handle = dlopen("libc.so", RTLD_NOLOAD);
if (!handle) {
LOG(FATAL) << "Cannot dlopen libc.so: " << dlerror();
}
SystemPropertyGetFunction* real_system_property_get =
reinterpret_cast<SystemPropertyGetFunction*>(
dlsym(handle, "__system_property_get"));
if (!real_system_property_get) {
LOG(FATAL) << "Cannot resolve __system_property_get(): " << dlerror();
}
return real_system_property_get;
}
static base::LazyInstance<base::internal::LazySysInfoValue<
SystemPropertyGetFunction*, DynamicallyLoadRealSystemPropertyGet> >::Leaky
g_lazy_real_system_property_get = LAZY_INSTANCE_INITIALIZER;
} // namespace
// Android 'L' removes __system_property_get from the NDK, however it is still
// a hidden symbol in libc. Until we remove all calls of __system_property_get
// from Chrome we work around this by defining a weak stub here, which uses
// dlsym to but ensures that Chrome uses the real system
// implementatation when loaded. http://crbug.com/392191.
int __system_property_get(const char* name, char* value) {
return g_lazy_real_system_property_get.Get().value()(name, value);
}
#endif
namespace {
// Default version of Android to fall back to when actual version numbers
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment