android: Manually load libraries with dlopen() and RTLD_GLOBAL on Android M
authorTobias Brunner <tobias@strongswan.org>
Wed, 17 Jun 2015 13:31:24 +0000 (15:31 +0200)
committerTobias Brunner <tobias@strongswan.org>
Tue, 28 Jul 2015 11:27:33 +0000 (13:27 +0200)
commit69e0215b9db103f2fe58b7576a7fb5c17a1c7cdd
treec49f51ce69dfbf8961e76bb108ac14c9899ad8b2
parentcda167c8c46d10c5d5f22bc6ace6c9183ed161fd
android: Manually load libraries with dlopen() and RTLD_GLOBAL on Android M

This fixes an issue when using the Android M preview.  Bionic's dynamic
linker was changed so that symbols in libraries loaded with RTLD_LOCAL
were not found anymore in dlsym(RTLD_DEFAULT, ...).  This is the case
for libraries loaded with System.loadLibrary(), therefore, the plugin
loader in libstrongswan was not able to resolve any symbols defined in
other libraries loaded later.  While this seems to have been broken
unintentionally for existing apps (fix at [1]), it will again be a
problem whenever we decide to increase targetSdkVersion beyond 22 (or
until that fix makes it into the system/emulator images).

Unfortunately, the dynamic loader in releases prior to Android 4.3 can't
load libandroidbridge without also loading its dependencies.

[1] https://github.com/android/platform_bionic/commit/1913352c6b
src/frontends/android/jni/libandroidbridge/android_jni.c
src/frontends/android/src/org/strongswan/android/logic/CharonVpnService.java