vendor/intel/houdini
Revision | cf2804ce8c89dc62c4c94a80a431f3aaace6d49d (tree) |
---|---|
Zeit | 2015-01-01 19:49:24 |
Autor | Chih-Wei Huang <cwhuang@linu...> |
Commiter | Chih-Wei Huang |
Retry the hook library until successful
@@ -1,5 +1,26 @@ | ||
1 | 1 | #!/system/bin/sh |
2 | 2 | |
3 | +cd /system/lib/arm | |
4 | +if [ ! -e ../libhoudini.so -a ! -e libhoudini.so ]; then | |
5 | + if touch .dl_houdini; then | |
6 | + rm -f .dl_houdini | |
7 | + else | |
8 | + cd .. && cp -a arm /data/local/tmp | |
9 | + mount -t tmpfs tmpfs arm && cd arm && | |
10 | + cp -a /data/local/tmp/arm/* . && rm -rf /data/local/tmp/arm | |
11 | + fi | |
12 | +fi | |
13 | + | |
14 | +while [ ! -e ../libhoudini.so -a ! -e libhoudini.so ]; do | |
15 | + while [ "$(getprop net.dns1)" = "" ]; do | |
16 | + sleep 10 | |
17 | + done | |
18 | + [ "`uname -m`" = "x86_64" ] && url=http://goo.gl/sfZRr5 || url=http://goo.gl/vvsfmp | |
19 | + wget $url -cO houdini.tgz && | |
20 | + bzcat houdini.tgz | tar xvf - && rm -f houdini.tgz | |
21 | + sleep 30 | |
22 | +done | |
23 | + | |
3 | 24 | # if you don't see the files 'register' and 'status' in /proc/sys/fs/binfmt_misc |
4 | 25 | # then run the following command: |
5 | 26 | # mount -t binfmt_misc none /proc/sys/fs/binfmt_misc |
@@ -23,14 +44,13 @@ if [ -e /proc/sys/fs/binfmt_misc/register ]; then | ||
23 | 44 | houdini_bin=1 |
24 | 45 | fi |
25 | 46 | else |
26 | - echo "No binfmt_misc support" | |
47 | + log -pe -thoudini "No binfmt_misc support" | |
27 | 48 | fi |
28 | 49 | |
29 | 50 | if [ $houdini_bin -eq 0 ]; then |
30 | - echo "houdini enabling failed !!!" | |
31 | -fi | |
32 | -if [ $houdini_bin -eq 1 ]; then | |
33 | - echo "houdini enabled" | |
51 | + log -pe -thoudini "houdini enabling failed!" | |
52 | +else | |
53 | + log -pi -thoudini "houdini enabled" | |
34 | 54 | fi |
35 | 55 | |
36 | 56 | exit 0 |
@@ -20,11 +20,18 @@ extern "C" void dvmPlatformInvoke(void *pEnv, void *clazz, int argInfo, int argc | ||
20 | 20 | |
21 | 21 | namespace houdini { |
22 | 22 | |
23 | +static void *(*h_dvmHookDlopen)(const char *, int, bool *) = 0; | |
24 | +static int (*h_dvmHookJniOnload)(bool, void *, void *, void *) = 0; | |
25 | +static bool (*h_dvmHookCheckMethod)(void *) = 0; | |
26 | +static void (*h_dvmHookCreateActivity)(bool, void *, void *, void *, void *, size_t) = 0; | |
27 | +static void (*h_dvmHookPlatformInvoke)(void *, void *, int, int, const int *, const char *, void *, void *) = 0; | |
28 | +static void *(*h_dvmHookDlsym)(bool, void *, const char *) = 0; | |
29 | + | |
23 | 30 | static void *get_symbol(const char *symbol) |
24 | 31 | { |
25 | - static void *h_handle = dlopen("libdvm_houdini.so", RTLD_LAZY); | |
32 | + static void *h_handle = 0; | |
26 | 33 | |
27 | - if (!h_handle) { | |
34 | + if (!h_handle && !(h_handle = dlopen("libdvm_houdini.so", RTLD_LAZY))) { | |
28 | 35 | ALOGE("Unable to open libdvm_houdini lib"); |
29 | 36 | return 0; |
30 | 37 | } |
@@ -36,35 +43,41 @@ static void *get_symbol(const char *symbol) | ||
36 | 43 | return func; |
37 | 44 | } |
38 | 45 | |
46 | +static void hookInit() | |
47 | +{ | |
48 | + h_dvmHookDlopen = (void *(*)(const char *, int, bool *)) get_symbol("_ZN7houdini10hookDlopenEPKciPb"); | |
49 | + h_dvmHookJniOnload = (int (*)(bool, void *, void *, void *)) get_symbol("_ZN7houdini13hookJniOnloadEbPvS0_S0_"); | |
50 | + h_dvmHookCheckMethod = (bool (*)(void *)) get_symbol("_ZN7houdini15hookCheckMethodEPv"); | |
51 | + h_dvmHookCreateActivity = (void (*)(bool, void *, void *, void *, void *, size_t)) get_symbol("_ZN7houdini18hookCreateActivityEbPvS0_S0_S0_j"); | |
52 | + h_dvmHookPlatformInvoke = (void (*)(void *, void *, int, int, const int *, const char *, void *, void *)) get_symbol("_ZN7houdini21dvmHookPlatformInvokeEPvS0_iiPKiPKcS0_S0_"); | |
53 | + h_dvmHookDlsym = (void *(*)(bool, void *, const char *)) get_symbol("_ZN7houdini9hookDlsymEbPvPKc"); | |
54 | +} | |
55 | + | |
39 | 56 | void *hookDlopen(const char *filename, int flag, bool *useHoudini) |
40 | 57 | { |
41 | - static void *(*h_dvmHookDlopen)(const char *, int, bool *) = | |
42 | - (void *(*)(const char *, int, bool *)) get_symbol("_ZN7houdini10hookDlopenEPKciPb"); | |
58 | + if (!h_dvmHookDlopen) { | |
59 | + hookInit(); | |
60 | + } | |
43 | 61 | |
44 | 62 | return h_dvmHookDlopen ? h_dvmHookDlopen(filename, flag, useHoudini) : dlopen(filename, flag); |
45 | 63 | } |
46 | 64 | |
47 | 65 | int hookJniOnload(bool useHoudini, void *func, void *jniVm, void *arg) |
48 | 66 | { |
49 | - static int (*h_dvmHookJniOnload)(bool, void *, void *, void *) = | |
50 | - (int (*)(bool, void *, void *, void *)) get_symbol("_ZN7houdini13hookJniOnloadEbPvS0_S0_"); | |
51 | - | |
52 | 67 | return h_dvmHookJniOnload ? h_dvmHookJniOnload(useHoudini, func, jniVm, arg) : ((int (*)(void *, void *))func)(jniVm, arg); |
53 | 68 | } |
54 | 69 | |
55 | 70 | bool hookCheckMethod(void *fnPtr) |
56 | 71 | { |
57 | - static bool (*h_dvmHookCheckMethod)(void *) = | |
58 | - (bool (*)(void *)) get_symbol("_ZN7houdini15hookCheckMethodEPv"); | |
59 | - | |
60 | 72 | return h_dvmHookCheckMethod ? h_dvmHookCheckMethod(fnPtr) : false; |
61 | 73 | } |
62 | 74 | |
63 | 75 | void hookCreateActivity(bool useHoudini, void *createActivityFunc, |
64 | 76 | void *activity, void *houdiniActivity, void *savedState, size_t savedStateSize) |
65 | 77 | { |
66 | - static void (*h_dvmHookCreateActivity)(bool, void *, void *, void *, void *, size_t) = | |
67 | - (void (*)(bool, void *, void *, void *, void *, size_t)) get_symbol("_ZN7houdini18hookCreateActivityEbPvS0_S0_S0_j"); | |
78 | + if (!h_dvmHookCreateActivity) { | |
79 | + hookInit(); | |
80 | + } | |
68 | 81 | if (h_dvmHookCreateActivity) { |
69 | 82 | h_dvmHookCreateActivity(useHoudini, createActivityFunc, activity, houdiniActivity, savedState, savedStateSize); |
70 | 83 | } else { |
@@ -75,9 +88,6 @@ void hookCreateActivity(bool useHoudini, void *createActivityFunc, | ||
75 | 88 | void dvmHookPlatformInvoke(void *pEnv, void *clazz, int argInfo, int argc, |
76 | 89 | const int *argv, const char *shorty, void *func, void *pReturn) |
77 | 90 | { |
78 | - static void (*h_dvmHookPlatformInvoke)(void *, void *, int, int, const int *, const char *, void *, void *) = | |
79 | - (void (*)(void *, void *, int, int, const int *, const char *, void *, void *)) get_symbol("_ZN7houdini21dvmHookPlatformInvokeEPvS0_iiPKiPKcS0_S0_"); | |
80 | - | |
81 | 91 | if (h_dvmHookPlatformInvoke) { |
82 | 92 | h_dvmHookPlatformInvoke(pEnv, clazz, argInfo, argc, argv, shorty, func, pReturn); |
83 | 93 | } else { |
@@ -87,9 +97,6 @@ void dvmHookPlatformInvoke(void *pEnv, void *clazz, int argInfo, int argc, | ||
87 | 97 | |
88 | 98 | void *hookDlsym(bool useHoudini, void *handle, const char *symbol) |
89 | 99 | { |
90 | - static void *(*h_dvmHookDlsym)(bool, void *, const char *) = | |
91 | - (void *(*)(bool, void *, const char *)) get_symbol("_ZN7houdini9hookDlsymEbPvPKc"); | |
92 | - | |
93 | 100 | return h_dvmHookDlsym ? h_dvmHookDlsym(useHoudini, handle, symbol) : dlsym(handle, symbol); |
94 | 101 | } |
95 | 102 |